UNPKG

@spotinst/spinnaker-deck

Version:

Spinnaker-Deck service, forked with support to Spotinst

315 lines (280 loc) 12.6 kB
import { mock } from 'angular'; import { Application } from './application.model'; import { ApplicationModelBuilder } from './applicationModel.builder'; import { ApplicationDataSourceRegistry } from './service/ApplicationDataSourceRegistry'; import { LOAD_BALANCER_DATA_SOURCE } from 'core/loadBalancer/loadBalancer.dataSource'; import { SecurityGroupReader } from 'core/securityGroup/securityGroupReader.service'; import { SERVER_GROUP_DATA_SOURCE } from 'core/serverGroup/serverGroup.dataSource'; import { SECURITY_GROUP_DATA_SOURCE } from 'core/securityGroup/securityGroup.dataSource'; import { IEntityTag, IEntityTags, IServerGroup, IInstanceCounts, ILoadBalancer } from 'core/domain'; describe('Application Model', function () { let application: Application, securityGroupReader: SecurityGroupReader, loadBalancerReader: any, clusterService: any, $q: ng.IQService, $scope: ng.IScope; beforeEach(() => ApplicationDataSourceRegistry.clearDataSources()); beforeEach(mock.module(SECURITY_GROUP_DATA_SOURCE, SERVER_GROUP_DATA_SOURCE, LOAD_BALANCER_DATA_SOURCE)); beforeEach( mock.inject(function ( _securityGroupReader_: SecurityGroupReader, _clusterService_: any, _$q_: ng.IQService, _loadBalancerReader_: any, $rootScope: any, ) { securityGroupReader = _securityGroupReader_; clusterService = _clusterService_; loadBalancerReader = _loadBalancerReader_; $q = _$q_; $scope = $rootScope.$new(); }), ); function configureApplication(serverGroups: any[], loadBalancers: any[], securityGroupsByApplicationName: any[]) { 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([] as any)); spyOn(securityGroupReader, 'getApplicationSecurityGroups').and.callFake(function ( _app: Application, groupsByName: any[], ) { return $q.when(groupsByName || []); }); application = ApplicationModelBuilder.createApplicationForTests( 'app', ...ApplicationDataSourceRegistry.getDataSources(), ); application.refresh(); $scope.$digest(); } describe('lazy dataSources', function () { beforeEach(function () { ApplicationDataSourceRegistry.registerDataSource({ key: 'lazySource', lazy: true, defaultData: [], loader: () => $q.resolve(['a']), onLoad: (_app, data) => $q.resolve(data), }); }); describe('activate', function () { it('refreshes section if not already active and not already loaded', function () { configureApplication([], [], []); spyOn(application.getDataSource('lazySource'), 'refresh').and.callThrough(); application.getDataSource('lazySource').activate(); $scope.$digest(); expect((application.getDataSource('lazySource').refresh as any).calls.count()).toBe(1); expect(application.getDataSource('lazySource').active).toBe(true); expect(application.getDataSource('lazySource').loaded).toBe(true); application.getDataSource('lazySource').deactivate(); expect(application.getDataSource('lazySource').active).toBe(false); application.getDataSource('lazySource').activate(); // not refreshed since still loaded expect(application.getDataSource('lazySource').active).toBe(true); expect((application.getDataSource('lazySource').refresh as any).calls.count()).toBe(1); application.getDataSource('lazySource').deactivate(); application.getDataSource('lazySource').loaded = false; application.getDataSource('lazySource').activate(); expect((application.getDataSource('lazySource').refresh as any).calls.count()).toBe(2); }); }); describe('refresh behavior', function () { it('clears data on inactive lazy dataSources and sets loaded flag to false', function () { configureApplication([], [], []); expect(application.getDataSource('lazySource').active).toBeFalsy(); application.getDataSource('lazySource').activate(); $scope.$digest(); expect(application.getDataSource('lazySource').active).toBe(true); expect(application.getDataSource('lazySource').loaded).toBe(true); expect(application.getDataSource('lazySource').data.length).toBe(1); application.getDataSource('lazySource').deactivate(); application.refresh(); $scope.$digest(); expect(application.getDataSource('lazySource').data).toEqual([]); expect(application.getDataSource('lazySource').loaded).toBe(false); }); it('adds entityTags that contain alerts if found on data', function () { const alertTag: IEntityTag = { name: 'spinnaker_ui_alert:alert1', value: { message: 'an alert' } }; const tags: IEntityTags = { id: 'zzzz', tags: [alertTag], tagsMetadata: null, entityRef: null, alerts: [alertTag], notices: [], }; const nonAlertTags: IEntityTags = { id: 'zzzz', tags: [{ name: 'spinnaker_ui_notice:notice1', value: { message: 'a notice' } }], tagsMetadata: null, entityRef: null, alerts: [], notices: [{ name: 'spinnaker_ui_notice:notice1', value: { message: 'a notice' } }], }; const serverGroups: IServerGroup[] = [ { account: 'test', cloudProvider: 'aws', cluster: 'myapp', instanceCounts: null, instances: [], name: 'myapp-v001', region: 'us-east-1', type: 'aws', entityTags: tags, }, { account: 'test', cloudProvider: 'aws', cluster: 'myapp', instanceCounts: null, instances: [], name: 'myapp-v001', region: 'us-east-1', type: 'aws', entityTags: nonAlertTags, }, { account: 'test', cloudProvider: 'aws', cluster: 'myapp', instanceCounts: null, instances: [], name: 'myapp-no-alerts-v002', region: 'us-east-1', type: 'aws', }, ]; configureApplication(serverGroups, [], []); expect(application.getDataSource('serverGroups').alerts).toEqual([tags]); }); }); describe('application ready', function () { it('ignores lazy dataSources when determining if application is ready', function () { let isReady = false; configureApplication([], [], []); application.ready().then(() => (isReady = true)); $scope.$digest(); expect(isReady).toBe(true); }); }); }); describe('setting default credentials and regions', function () { it('sets default credentials and region from server group when only one account/region found', function () { const serverGroups: IServerGroup[] = [ { name: 'deck-test-v001', cluster: 'deck-test', account: 'test', region: 'us-west-2', type: 'aws', cloudProvider: 'aws', instances: [], instanceCounts: {} as IInstanceCounts, }, ], loadBalancers: ILoadBalancer[] = [], securityGroupsByApplicationName: any[] = []; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.aws).toBe('test'); expect(application.defaultRegions.aws).toBe('us-west-2'); }); it('sets default credentials and region from load balancer when only one account/region found', function () { const serverGroups: IServerGroup[] = [], loadBalancers: ILoadBalancer[] = [ { name: 'deck-frontend', cloudProvider: 'gce', vpcId: 'vpc0', region: 'us-central-1', account: 'prod' }, ], securityGroupsByApplicationName: any[] = []; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.gce).toBe('prod'); expect(application.defaultRegions.gce).toBe('us-central-1'); }); it('sets default credentials and region from firewall', function () { const serverGroups: any[] = [], loadBalancers: ILoadBalancer[] = [], securityGroupsByApplicationName: any[] = [ { name: 'deck-test', provider: 'cf', accountName: 'test', region: 'us-south-7' }, ]; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.cf).toBe('test'); expect(application.defaultRegions.cf).toBe('us-south-7'); }); it('does not set defaults when multiple values found for the same provider', function () { const serverGroups: IServerGroup[] = [], loadBalancers: ILoadBalancer[] = [ { name: 'deck-frontend', cloudProvider: 'aws', vpcId: 'vpcId', region: 'us-west-1', account: 'prod' }, ], securityGroupsByApplicationName: any[] = [ { name: 'deck-test', provider: 'aws', accountName: 'test', region: 'us-east-1' }, ]; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.aws).toBeUndefined(); expect(application.defaultRegions.aws).toBeUndefined(); }); it('sets default region or default credentials if possible', function () { const serverGroups: IServerGroup[] = [], loadBalancers: ILoadBalancer[] = [ { name: 'deck-frontend', cloudProvider: 'aws', vpcId: 'vpcId', region: 'us-east-1', account: 'prod' }, ], securityGroupsByApplicationName: any[] = [ { name: 'deck-test', provider: 'aws', accountName: 'test', region: 'us-east-1' }, ]; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.aws).toBeUndefined(); expect(application.defaultRegions.aws).toBe('us-east-1'); }); it('sets default credentials, even if region cannot be set', function () { const serverGroups: IServerGroup[] = [], loadBalancers: ILoadBalancer[] = [ { name: 'deck-frontend', cloudProvider: 'aws', vpcId: 'vpc0', region: 'us-east-1', account: 'test' }, ], securityGroupsByApplicationName: any[] = [ { name: 'deck-test', provider: 'aws', accountName: 'test', region: 'us-west-1' }, ]; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.aws).toBe('test'); expect(application.defaultRegions.aws).toBeUndefined(); }); it('should set defaults for multiple providers', function () { const serverGroups: any[] = [ { name: 'deck-test-v001', account: 'test', region: 'us-west-2', provider: 'aws', instances: [], instanceCounts: { up: 0, down: 0, starting: 0, unknown: 0, outOfService: 0 }, }, { name: 'deck-gce-v001', account: 'gce-test', region: 'us-central-1', provider: 'gce', instances: [], instanceCounts: { up: 0, down: 0, starting: 0, unknown: 0, outOfService: 0 }, }, ], loadBalancers: ILoadBalancer[] = [ { name: 'deck-frontend', account: 'gce-test', cloudProvider: 'gce', region: 'us-central-1', serverGroups: [], }, ], securityGroupsByApplicationName: any[] = [ { name: 'deck-test', provider: 'aws', accountName: 'test', region: 'us-west-2' }, ]; configureApplication(serverGroups, loadBalancers, securityGroupsByApplicationName); expect(application.defaultCredentials.aws).toBe('test'); expect(application.defaultRegions.aws).toBe('us-west-2'); expect(application.defaultCredentials.gce).toBe('gce-test'); expect(application.defaultRegions.gce).toBe('us-central-1'); }); }); });