diff --git a/app/scripts/modules/amazon/serverGroup/configure/serverGroupCommandBuilder.service.js b/app/scripts/modules/amazon/serverGroup/configure/serverGroupCommandBuilder.service.js index 16c7a32ed04..89e72ca1462 100644 --- a/app/scripts/modules/amazon/serverGroup/configure/serverGroupCommandBuilder.service.js +++ b/app/scripts/modules/amazon/serverGroup/configure/serverGroupCommandBuilder.service.js @@ -20,7 +20,7 @@ module.exports = angular.module('spinnaker.aws.serverGroupCommandBuilder.service var regionsKeyedByAccountLoader = accountService.getRegionsKeyedByAccount('aws'); var defaultCredentials = defaults.account || application.defaultCredentials.aws || settings.providers.aws.defaults.account; - var defaultRegion = defaults.region || application.defaultRegion || settings.providers.aws.defaults.region; + var defaultRegion = defaults.region || application.defaultRegions.aws || settings.providers.aws.defaults.region; var preferredZonesLoader = accountService.getAvailabilityZonesForAccountAndRegion('aws', defaultCredentials, defaultRegion); diff --git a/app/scripts/modules/core/application/service/applications.read.service.js b/app/scripts/modules/core/application/service/applications.read.service.js index 31f3d991c73..8c68b3ba384 100644 --- a/app/scripts/modules/core/application/service/applications.read.service.js +++ b/app/scripts/modules/core/application/service/applications.read.service.js @@ -271,7 +271,7 @@ module.exports = angular original.securityGroups = newApplication.securityGroups; original.lastRefresh = newApplication.lastRefresh; original.securityGroupsIndex = newApplication.securityGroupsIndex; - original.defaultRegion = newApplication.defaultRegion; + original.defaultRegions = newApplication.defaultRegions; original.defaultCredentials = newApplication.defaultCredentials; clusterService.addTasksToServerGroups(original); diff --git a/app/scripts/modules/core/application/service/applications.read.service.spec.js b/app/scripts/modules/core/application/service/applications.read.service.spec.js index c23f03e8422..833d10e7a09 100644 --- a/app/scripts/modules/core/application/service/applications.read.service.spec.js +++ b/app/scripts/modules/core/application/service/applications.read.service.spec.js @@ -2,10 +2,14 @@ describe('Service: applicationReader', function () { - //NOTE: This is only testing the service dependencies. Please add more tests. - var applicationReader; var application; + var securityGroupReader; + var loadBalancerReader; + var clusterService; + var $http; + var $q; + var $scope; beforeEach( window.module( @@ -14,14 +18,164 @@ describe('Service: applicationReader', function () { ); beforeEach( - window.inject(function (_applicationReader_) { + window.inject(function (_applicationReader_, _securityGroupReader_, _clusterService_, $httpBackend, _$q_, _loadBalancerReader_, $rootScope) { applicationReader = _applicationReader_; + securityGroupReader = _securityGroupReader_; + clusterService = _clusterService_; + loadBalancerReader = _loadBalancerReader_; + $http = $httpBackend; + $q = _$q_; application = {}; + $scope = $rootScope.$new(); }) ); - it('should instantiate the controller', function () { - expect(applicationReader).toBeDefined(); + describe('load application', function () { + + function loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName) { + $http.expectGET('/applications/deck').respond(200, {name: 'deck', attributes: {}}); + spyOn(securityGroupReader, 'loadSecurityGroupsByApplicationName').and.returnValue($q.when(securityGroupsByApplicationName)); + spyOn(loadBalancerReader, 'loadLoadBalancers').and.returnValue($q.when(loadBalancers)); + spyOn(clusterService, 'loadServerGroups').and.returnValue($q.when(serverGroups)); + spyOn(securityGroupReader, 'loadSecurityGroups').and.returnValue($q.when([])); + spyOn(securityGroupReader, 'attachSecurityGroups').and.callFake(function(app, derivedGroups, groupsByName) { + app.securityGroups = derivedGroups.concat(groupsByName); + return $q.when(app); + }); + + return applicationReader.getApplication('deck'); + } + + describe('setting default credentials and regions', function () { + it('sets default credentials and region from server group when only one account/region found', function () { + var serverGroups = [{ + name: 'deck-test-v001', + cluster: 'deck-test', + account: 'test', + region: 'us-west-2', + provider: 'aws', + instances: [] + }], + loadBalancers = [], + securityGroupsByApplicationName = [], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.aws).toBe('test'); + expect(result.defaultRegions.aws).toBe('us-west-2'); + }); + + it('sets default credentials and region from load balancer when only one account/region found', function () { + var serverGroups = [], + loadBalancers = [{name: 'deck-frontend', account: 'prod', type: 'gce', region: 'us-central-1', serverGroups: []}], + securityGroupsByApplicationName = [], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.gce).toBe('prod'); + expect(result.defaultRegions.gce).toBe('us-central-1'); + }); + + it('sets default credentials and region from security group', function () { + var serverGroups = [], + loadBalancers = [], + securityGroupsByApplicationName = [{name: 'deck-test', type: 'cf', accountName: 'test', region: 'us-south-7'}], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.cf).toBe('test'); + expect(result.defaultRegions.cf).toBe('us-south-7'); + }); + + it('does not set defaults when multiple values found for the same provider', function () { + var serverGroups = [], + loadBalancers = [{name: 'deck-frontend', account: 'prod', type: 'aws', region: 'us-west-1', serverGroups: []}], + securityGroupsByApplicationName = [{name: 'deck-test', type: 'aws', accountName: 'test', region: 'us-east-1'}], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.aws).toBeUndefined(); + expect(result.defaultRegions.aws).toBeUndefined(); + }); + + it('sets default region or default credentials if possible', function () { + var serverGroups = [], + loadBalancers = [{name: 'deck-frontend', account: 'prod', type: 'aws', region: 'us-east-1', serverGroups: []}], + securityGroupsByApplicationName = [{name: 'deck-test', type: 'aws', accountName: 'test', region: 'us-east-1'}], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.aws).toBeUndefined(); + expect(result.defaultRegions.aws).toBe('us-east-1'); + }); + + it('sets default credentials, even if region cannot be set', function () { + var serverGroups = [], + loadBalancers = [{name: 'deck-frontend', account: 'test', type: 'aws', region: 'us-east-1', serverGroups: []}], + securityGroupsByApplicationName = [{name: 'deck-test', type: 'aws', accountName: 'test', region: 'us-west-1'}], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.aws).toBe('test'); + expect(result.defaultRegions.aws).toBeUndefined(); + }); + + it('should set defaults for multiple providers', function () { + var serverGroups = [ + { + name: 'deck-test-v001', + account: 'test', + region: 'us-west-2', + provider: 'aws', + instances: [] + }, + { + name: 'deck-gce-v001', + account: 'gce-test', + region: 'us-central-1', + provider: 'gce', + instances: [], + } + ], + loadBalancers = [{name: 'deck-frontend', account: 'gce-test', type: 'gce', region: 'us-central-1', serverGroups: []}], + securityGroupsByApplicationName = [{name: 'deck-test', type: 'aws', accountName: 'test', region: 'us-west-2'}], + result = null; + + loadApplication(serverGroups, loadBalancers, securityGroupsByApplicationName).then((app) => { + result = app; + }); + $scope.$digest(); + $http.flush(); + expect(result.defaultCredentials.aws).toBe('test'); + expect(result.defaultRegions.aws).toBe('us-west-2'); + expect(result.defaultCredentials.gce).toBe('gce-test'); + expect(result.defaultRegions.gce).toBe('us-central-1'); + }); + }); }); describe('adding executions to applications', function () { diff --git a/app/scripts/modules/core/pipeline/config/stages/bake/aws/awsBakeStage.js b/app/scripts/modules/core/pipeline/config/stages/bake/aws/awsBakeStage.js index 59cc8705137..ca5d0e12bc9 100644 --- a/app/scripts/modules/core/pipeline/config/stages/bake/aws/awsBakeStage.js +++ b/app/scripts/modules/core/pipeline/config/stages/bake/aws/awsBakeStage.js @@ -63,11 +63,11 @@ module.exports = angular.module('spinnaker.core.pipeline.stage.aws.bakeStage', [ } else if ($scope.regions.indexOf($scope.stage.region) === -1) { delete $scope.stage.region; } - if (!$scope.stage.regions.length && $scope.application.defaultRegion) { - $scope.stage.regions.push($scope.application.defaultRegion); + if (!$scope.stage.regions.length && $scope.application.defaultRegions.aws) { + $scope.stage.regions.push($scope.application.defaultRegions.aws); } - if (!$scope.stage.regions.length && $scope.application.defaultRegion) { - $scope.stage.regions.push($scope.application.defaultRegion); + if (!$scope.stage.regions.length && $scope.application.defaultRegions.aws) { + $scope.stage.regions.push($scope.application.defaultRegions.aws); } $scope.baseOsOptions = results.baseOsOptions; $scope.baseLabelOptions = results.baseLabelOptions; diff --git a/app/scripts/modules/core/pipeline/config/stages/disableAsg/aws/awsDisableAsgStage.js b/app/scripts/modules/core/pipeline/config/stages/disableAsg/aws/awsDisableAsgStage.js index e86a88beeda..2544354cf2e 100644 --- a/app/scripts/modules/core/pipeline/config/stages/disableAsg/aws/awsDisableAsgStage.js +++ b/app/scripts/modules/core/pipeline/config/stages/disableAsg/aws/awsDisableAsgStage.js @@ -64,7 +64,7 @@ module.exports = angular.module('spinnaker.core.pipeline.stage.aws.disableAsgSta stage.credentials = $scope.application.defaultCredentials.aws; } if (!stage.regions.length && $scope.application.defaultRegions.aws) { - stage.regions.push($scope.application.defaultRegion.aws); + stage.regions.push($scope.application.defaultRegions.aws); } if (stage.credentials) { diff --git a/app/scripts/modules/core/pipeline/config/stages/resizeAsg/cf/cfResizeAsgStage.js b/app/scripts/modules/core/pipeline/config/stages/resizeAsg/cf/cfResizeAsgStage.js index 51d5a13b2c1..99351311445 100644 --- a/app/scripts/modules/core/pipeline/config/stages/resizeAsg/cf/cfResizeAsgStage.js +++ b/app/scripts/modules/core/pipeline/config/stages/resizeAsg/cf/cfResizeAsgStage.js @@ -92,8 +92,8 @@ module.exports = angular.module('spinnaker.core.pipeline.stage.cf.resizeAsgStage if (!stage.credentials && $scope.application.defaultCredentials) { stage.credentials = $scope.application.defaultCredentials; } - if (!stage.regions.length && $scope.application.defaultRegion) { - stage.regions.push($scope.application.defaultRegion); + if (!stage.regions.length && $scope.application.defaultRegions.cf) { + stage.regions.push($scope.application.defaultRegions.cf); } if (stage.credentials) {