public async Task <TemporaryContainerResponse <TemporaryStorageContainer> > GetStorageContainerAsync(Server server)
        {
            var existingContainer = _temporaryContainerManager.GetContainer <TemporaryStorageContainer>(server.Id, true);

            if (existingContainer != null)
            {
                return(new TemporaryContainerResponse <TemporaryStorageContainer>(existingContainer));
            }

            var parameterBuilder = CreateContainerParametersBuilder.CreateStorageServer(server);

            var createResponse = await _clientManager.CreateContainerAsync(parameterBuilder);

            if (!createResponse.Success)
            {
                return(new TemporaryContainerResponse <TemporaryStorageContainer>(createResponse));
            }

            var startResponse = await _clientManager.StartContainerAsync(createResponse.ContainerId);

            if (!startResponse.Success)
            {
                return(new TemporaryContainerResponse <TemporaryStorageContainer>(startResponse));
            }


            var httpClient = CoreHttpClient.Create(_logger, $"http://{parameterBuilder.CreateParameters().Name}");
            var container  = new TemporaryStorageContainer(httpClient, server.Id, createResponse.ContainerId);

            _temporaryContainerManager.AddContainer(container);

            await DockerRetryHelper.WaitForStorageContainerAsync(container, _logger);

            return(new TemporaryContainerResponse <TemporaryStorageContainer>(container));
        }
        public async Task <DockerOperationResponse> CreateContainerAsync(Container container)
        {
            var builder  = CreateContainerParametersBuilder.CreateFromContainer(container);
            var response = await _clientManager.CreateContainerAsync(builder);

            if (response.Success)
            {
                container.DockerId = response.ContainerId;
            }

            return(new DockerOperationResponse(
                       response.Success,
                       response.Errors,
                       response.Warnings
                       ));
        }
Esempio n. 3
0
        public async Task <ContainerIdResponse> CreateContainerAsync(CreateContainerParametersBuilder builder)
        {
            using var loggerScope = _logger.BeginScope("Creating new container");
            var response = new ContainerIdResponse(_logger);

            builder.LogParameters(_logger);

            try
            {
                using var dockerClient = CreateDockerClient();

                await PrepareImageAsync(builder.ImageId, dockerClient);

                var dockerResponse = await dockerClient.Containers.CreateContainerAsync(builder.CreateParameters());

                if (dockerResponse.Warnings.Any())
                {
                    using (_logger.BeginScope("Container warnings were generated"))
                    {
                        foreach (var warning in dockerResponse.Warnings)
                        {
                            response.LogWarning($"Docker warning: {warning}");
                        }
                    }
                }

                if (string.IsNullOrWhiteSpace(dockerResponse.ID))
                {
                    throw new Exception("No container ID received from created container.");
                }

                response.WithContainerId(dockerResponse.ID);
            }
            catch (Exception exception)
            {
                response.LogException(exception, "Unable to create new container");

                response.HasFailed();
            }

            return(response);
        }