public async Task CreateAndStartContainerWaitForExit(SessionHostsStartInfo startParameters) { IList <PortMapping> portMappings = GetPortMappings(startParameters, 0); if (startParameters.SessionHostType == SessionHostType.Container) { foreach (PortMapping mapping in portMappings) { _logger.LogInformation( $"{mapping.GamePort.Name} ({mapping.GamePort.Protocol}): Local port {mapping.NodePort} mapped to container port {mapping.GamePort.Number} "); } } DownloadAndExtractAllAssets(startParameters); DownloadGameCertificates(startParameters); ISessionHostRunner sessionHostRunner = _sessionHostRunnerFactory.CreateSessionHostRunner(startParameters.SessionHostType, _vmConfiguration, _logger); // RetrieveResources does a docker pull // If we're running Linux containers on Windows, we might want to pull image from ACR first to save the image on local. // In this case, you need to simply change the value to true for forcePullFromAcrOnLinuxContainersOnWindows in MultiplayerSettings.json // so if this image is not locally built, docker create will do a docker pull first // In another case, we might have built the image locally but tagged with a fake registry name (e.g. myacr.io/mygame:0.1), // Then make sure to change the value to false if you want to use the image from local. if (Globals.GameServerEnvironment == GameServerEnvironment.Windows || Globals.Settings.ForcePullFromAcrOnLinuxContainersOnWindows) { await sessionHostRunner.RetrieveResources(startParameters); } NoOpSessionHostManager sessionHostManager = new NoOpSessionHostManager(); SessionHostInfo sessionHostInfo = await sessionHostRunner.CreateAndStart(0, new GameResourceDetails { SessionHostsStartInfo = startParameters }, sessionHostManager); if (sessionHostInfo == null) { return; } string typeSpecificId = sessionHostInfo.TypeSpecificId; _logger.LogInformation("Waiting for heartbeats from the game server....."); await sessionHostRunner.WaitOnServerExit(typeSpecificId).ConfigureAwait(false); string logFolder = Path.Combine(Globals.VmConfiguration.VmDirectories.GameLogsRootFolderVm, sessionHostInfo.LogFolderId); await sessionHostRunner.CollectLogs(typeSpecificId, logFolder, sessionHostManager); await sessionHostRunner.TryDelete(typeSpecificId); }
public async Task CreateAndStartContainerWaitForExit(SessionHostsStartInfo startParameters) { IList <PortMapping> portMappings = GetPortMappings(startParameters, 0); if (startParameters.SessionHostType == SessionHostType.Container) { foreach (PortMapping mapping in portMappings) { _logger.LogInformation( $"{mapping.GamePort.Name} ({mapping.GamePort.Protocol}): Local port {mapping.NodePort} mapped to container port {mapping.GamePort.Number} "); } } DownloadAndExtractAllAssets(startParameters); DownloadGameCertificates(startParameters); ISessionHostRunner sessionHostRunner = _sessionHostRunnerFactory.CreateSessionHostRunner(startParameters.SessionHostType, _vmConfiguration, _logger); // RetrieveResources does a docker pull // if we're running Linux containers on Windows we do not want that, since we might // have built the image locally but tagged with a fake registry name (e.g. myacr.io/mygame:0.1) // docker pull will try to connect to myacr.io and fail // if this image is not locally built, docker create (executed next) will do a docker pull first if (Globals.GameServerEnvironment == GameServerEnvironment.Windows) { await sessionHostRunner.RetrieveResources(startParameters); } NoOpSessionHostManager sessionHostManager = new NoOpSessionHostManager(); SessionHostInfo sessionHostInfo = await sessionHostRunner.CreateAndStart(0, new GameResourceDetails { SessionHostsStartInfo = startParameters }, sessionHostManager); string containerId = sessionHostInfo.TypeSpecificId; _logger.LogInformation("Waiting for heartbeats from the game server....."); await sessionHostRunner.WaitOnServerExit(containerId).ConfigureAwait(false); string logFolder = Path.Combine(Globals.VmConfiguration.VmDirectories.GameLogsRootFolderVm, sessionHostInfo.LogFolderId); await sessionHostRunner.CollectLogs(containerId, logFolder, sessionHostManager); await sessionHostRunner.TryDelete(containerId); }