private void StartOrConnectToDeployment(Deployment deployment) { Log.Print(LogLevel.Info, $"Deployment {deployment.Name}, Status {deployment.Status}."); var request = DeploymentModifier.GetGetDeploymentRequest(deployment.Id, workerConfig.ProjectName); while (deployment.Status == Deployment.Types.Status.Starting || deployment.Status == Deployment.Types.Status.Stopping) { // Wait before checking the deployment status again. Task.Delay(TaskDelay).Wait(); deployment = DeploymentModifier.GetDeployment(request); } switch (deployment.Status) { case Deployment.Types.Status.Running: ConnectToDeployment(deployment); break; case Deployment.Types.Status.Stopped: StartDeployment(deployment.Name); break; case Deployment.Types.Status.Unknown: case Deployment.Types.Status.Error: Log.Print(LogLevel.Warn, $"The deployment {deployment.Name} is in an unrecoverable state ({deployment.Status}). Trying to restart it.", serviceConnection); DeploymentModifier.StopDeployment(deployment); Task.Delay(TaskDelay).Wait(); StartOrConnectToDeployment(deployment); break; } }
private void ConnectToDeployment(Deployment deployment) { var request = DeploymentModifier.GetGetDeploymentRequest(deployment.Id, workerConfig.ProjectName); DeploymentModifier.AddDeploymentTags(request, sessionConfig.DeploymentTags.Append($"{Tags.MaxPlayers}_{sessionConfig.MaxNumberOfClients}")); DeploymentModifier.SetMaxWorkerCapacity(request, sessionConfig.ClientType, sessionConfig.MaxNumberOfClients); var connector = new Connector(WorkerType, deployment.Name, serviceConnection); var connectionParameters = new ConnectionParameters { WorkerType = WorkerType, Network = { UseExternalIp = true, ConnectionType = NetworkConnectionType.Tcp, ConnectionTimeoutMillis = 10000, }, }; bool hasConnected; short attempts = 0; do { hasConnected = connector.TryConnect(connectionParameters, devAuthToken); attempts++; }while (attempts < Utils.MaxRetries && !hasConnected); if (!hasConnected) { throw new Exception($"Unable to connect to deployment {deployment.Name}."); } var connection = connector.Connection; var handler = new SpatialOSReceiveHandler(connection, request); var deploymentInformation = new DeploymentInformation { DeploymentId = deployment.Id, ProjectName = deployment.ProjectName, Connection = connection, Handler = handler, }; new Thread(ProcessingOps).Start(deploymentInformation); }