public async Task StartDeployment()

in src/AWS.Deploy.CLI/ServerMode/Controllers/DeploymentController.cs [549:603]


        public async Task<IActionResult> StartDeployment(string sessionId)
        {
            var state = _stateServer.Get(sessionId);
            if (state == null)
            {
                return NotFound($"Session ID {sessionId} not found.");
            }

            var serviceProvider = CreateSessionServiceProvider(state);

            var orchestratorSession = CreateOrchestratorSession(state);

            var orchestrator = CreateOrchestrator(state, serviceProvider);

            if (state.SelectedRecommendation == null)
                throw new SelectedRecommendationIsNullException("The selected recommendation is null or invalid.");

            var optionSettingHandler = serviceProvider.GetRequiredService<IOptionSettingHandler>();
            var recipeHandler = serviceProvider.GetRequiredService<IRecipeHandler>();
            var settingValidatorFailedResults = optionSettingHandler.RunOptionSettingValidators(state.SelectedRecommendation);
            var recipeValidatorFailedResults = recipeHandler.RunRecipeValidators(state.SelectedRecommendation, orchestratorSession);

            if (settingValidatorFailedResults.Any() || recipeValidatorFailedResults.Any())
            {
                var settingValidationErrorMessage = $"The deployment configuration needs to be adjusted before it can be deployed:{Environment.NewLine}";
                foreach (var result in settingValidatorFailedResults)
                    settingValidationErrorMessage += $" - {result.ValidationFailedMessage}{Environment.NewLine}{Environment.NewLine}";
                foreach (var result in recipeValidatorFailedResults)
                    settingValidationErrorMessage += $" - {result.ValidationFailedMessage}{Environment.NewLine}{Environment.NewLine}";
                settingValidationErrorMessage += $"{Environment.NewLine}Please adjust your settings";
                return Problem(settingValidationErrorMessage);
            }

            var systemCapabilityEvaluator = serviceProvider.GetRequiredService<ISystemCapabilityEvaluator>();

            var capabilities = await systemCapabilityEvaluator.EvaluateSystemCapabilities(state.SelectedRecommendation);

            var missingCapabilitiesMessage = "";
            foreach (var capability in capabilities)
            {
                missingCapabilitiesMessage = $"{missingCapabilitiesMessage}{capability.GetMessage()}{Environment.NewLine}";
            }

            if (capabilities.Any())
                return Problem($"Unable to start deployment due to missing system capabilities.{Environment.NewLine}{missingCapabilitiesMessage}", statusCode: Microsoft.AspNetCore.Http.StatusCodes.Status424FailedDependency);

            // Because we're starting a deployment, clear the cached system capabilities checks
            // in case the deployment fails and the user reruns it after modifying Docker or Node
            systemCapabilityEvaluator.ClearCachedCapabilityChecks();

            var task = new DeployRecommendationTask(orchestratorSession, orchestrator, state.ApplicationDetails, state.SelectedRecommendation);
            state.DeploymentTask = task.Execute();

            return Ok();
        }