UNPKG

@spotinst/spinnaker-deck

Version:

Spinnaker-Deck service, forked with support to Spotinst

260 lines (232 loc) 9.15 kB
'use strict'; import UIROUTER_ANGULARJS from '@uirouter/angularjs'; import { module } from 'angular'; import { ModalWizard, OVERRIDE_REGISTRY, SERVER_GROUP_COMMAND_REGISTRY_PROVIDER, SERVER_GROUP_WRITER, STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT, TaskMonitor, } from '@spinnaker/core'; import { ECS_CLUSTER_READ_SERVICE } from '../../../ecsCluster/ecsCluster.read.service'; import { IAM_ROLE_READ_SERVICE } from '../../../iamRoles/iamRole.read.service'; import { ECS_SECRET_READ_SERVICE } from '../../../secrets/secret.read.service'; import { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from '../serverGroupConfiguration.service'; export const ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER = 'spinnaker.ecs.cloneServerGroup.controller'; export const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER; // for backwards compatibility module(ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER, [ UIROUTER_ANGULARJS, ECS_SERVER_GROUP_CONFIGURATION_SERVICE, SERVER_GROUP_WRITER, OVERRIDE_REGISTRY, SERVER_GROUP_COMMAND_REGISTRY_PROVIDER, IAM_ROLE_READ_SERVICE, ECS_CLUSTER_READ_SERVICE, ECS_SECRET_READ_SERVICE, STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT, ]).controller('ecsCloneServerGroupCtrl', [ '$scope', '$uibModalInstance', '$q', '$state', 'serverGroupWriter', 'overrideRegistry', 'ecsServerGroupConfigurationService', 'serverGroupCommandRegistry', 'serverGroupCommand', 'iamRoleReader', 'ecsClusterReader', 'secretReader', 'application', 'title', function ( $scope, $uibModalInstance, $q, $state, serverGroupWriter, overrideRegistry, ecsServerGroupConfigurationService, serverGroupCommandRegistry, serverGroupCommand, iamRoleReader, ecsClusterReader, secretReader, application, title, ) { $scope.pages = { templateSelection: overrideRegistry.getTemplate( 'ecs.serverGroup.templateSelection', require('./templateSelection/templateSelection.html'), ), basicSettings: overrideRegistry.getTemplate( 'ecs.serverGroup.basicSettings', require('./location/basicSettings.html'), ), container: overrideRegistry.getTemplate('ecs.serverGroup.container', require('./container/container.html')), horizontalScaling: overrideRegistry.getTemplate( 'ecs.serverGroup.horizontalScaling', require('./horizontalScaling/horizontalScaling.html'), ), networking: overrideRegistry.getTemplate('ecs.serverGroup.networking', require('./networking/networking.html')), logging: overrideRegistry.getTemplate('ecs.serverGroup.logging', require('./logging/logging.html')), serviceDiscovery: overrideRegistry.getTemplate( 'ecs.serverGroup.serviceDiscovery', require('./serviceDiscovery/serviceDiscovery.html'), ), advancedSettings: overrideRegistry.getTemplate( 'ecs.serverGroup.advancedSettings', require('./advancedSettings/advancedSettings.html'), ), taskDefinition: overrideRegistry.getTemplate( 'ecs.taskDefinition', require('./taskDefinition/taskDefinition.html'), ), }; $scope.title = title; $scope.applicationName = application.name; $scope.application = application; $scope.command = serverGroupCommand; $scope.state = { loaded: false, requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection, }; this.templateSelectionText = { copied: ['account, region, ecs cluster, stack', 'capacity'], notCopied: ['launch type, target group, network mode'], }; if (!$scope.command.viewState.disableStrategySelection) { this.templateSelectionText.notCopied.push( 'the deployment strategy (if any) used to deploy the most recent server group', ); } function onApplicationRefresh() { // If the user has already closed the modal, do not navigate to the new details view if ($scope.$$destroyed) { return; } const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup'); if (cloneStage && cloneStage.context['deploy.server.groups']) { const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region]; if (newServerGroupName) { const newStateParams = { serverGroup: newServerGroupName, accountId: $scope.command.credentials, region: $scope.command.region, provider: 'ecs', }; let transitionTo = '^.^.^.clusters.serverGroup'; if ($state.includes('**.clusters.serverGroup')) { // clone via details, all view transitionTo = '^.serverGroup'; } if ($state.includes('**.clusters.cluster.serverGroup')) { // clone or create with details open transitionTo = '^.^.serverGroup'; } if ($state.includes('**.clusters')) { // create new, no details open transitionTo = '.serverGroup'; } $state.go(transitionTo, newStateParams); } } } function onTaskComplete() { application.serverGroups.refresh(); application.serverGroups.onNextRefresh($scope, onApplicationRefresh); } $scope.taskMonitor = new TaskMonitor({ application: application, title: 'Creating your server group', modalInstance: $uibModalInstance, onTaskComplete: onTaskComplete, }); function configureCommand() { ecsServerGroupConfigurationService.configureCommand($scope.command).then(function () { $scope.state.loaded = true; initializeCommand(); initializeSelectOptions(); initializeWatches(); }); } function initializeWatches() { $scope.$watch('command.subnetType', createResultProcessor($scope.command.subnetTypeChanged)); $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged)); $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged)); $scope.$watch( 'command.placementStrategyName', createResultProcessor($scope.command.placementStrategyNameChanged), ); $scope.$watch('command.stack', () => $scope.command.clusterChanged($scope.command)); $scope.$watch('command.freeFormDetails', () => $scope.command.clusterChanged($scope.command)); } function initializeSelectOptions() { processCommandUpdateResult($scope.command.credentialsChanged(serverGroupCommand)); processCommandUpdateResult($scope.command.regionChanged(serverGroupCommand)); } function createResultProcessor(method) { return function () { processCommandUpdateResult(method(serverGroupCommand)); }; } function processCommandUpdateResult() { // TODO(Bruno Carrier) - Implement marking sections either dirty or complete } function initializeCommand() {} this.isValid = function () { return true; // TODO(Bruno Carrier) - Implement validation of the form }; this.showSubmitButton = function () { return ModalWizard.allPagesVisited(); }; this.submit = function () { if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') { return $uibModalInstance.close($scope.command); } $scope.taskMonitor.submit(function () { return serverGroupWriter.cloneServerGroup($scope.command, application); }); }; this.cancel = function () { $uibModalInstance.dismiss(); }; if (!$scope.state.requiresTemplateSelection) { configureCommand(); } else { $scope.state.loaded = true; } this.templateSelected = () => { $scope.state.requiresTemplateSelection = false; configureCommand(); }; // used by react components to update command fields in parent (angular) scope $scope.notifyAngular = function (commandKey, value) { if (commandKey == 'pipeline') { $scope.command.viewState.pipeline = value; } else { $scope.command[commandKey] = value; } }; // used by react components to configure command for image queries $scope.configureCommand = function (query) { return ecsServerGroupConfigurationService.configureCommand($scope.command, query); }; // TODO: Migrate horizontalScaling component to react and move this logic there $scope.capacityProviderState = { useCapacityProviders: $scope.command.capacityProviderStrategy && $scope.command.capacityProviderStrategy.length > 0, updateComputeOption: function (chosenOption) { if (chosenOption == 'launchType') { $scope.command.capacityProviderStrategy = []; } else if (chosenOption == 'capacityProviders') { $scope.command.launchType = ''; $scope.command.capacityProviderStrategy = $scope.command.capacityProviderStrategy || []; } }, }; }, ]);