UNPKG

@spotinst/spinnaker-deck

Version:

Spinnaker-Deck service, forked with support to Spotinst

281 lines (247 loc) 9.1 kB
import { mock } from 'angular'; import { PROVIDER_SERVICE_DELEGATE } from 'core/cloudProvider'; import { IMultiInstanceGroup, InstanceWriter } from 'core/instance/instance.write.service'; import { Application } from 'core/application/application.model'; import { REACT_MODULE } from 'core/reactShims'; import { ApplicationModelBuilder } from '../application/applicationModel.builder'; import { IInstance, IServerGroup } from 'core/domain'; import * as State from 'core/state'; import { ServerGroupReader } from '../serverGroup/serverGroupReader.service'; import { IJob, ITaskCommand, TaskExecutor } from '../task/taskExecutor'; describe('Service: instance writer', function () { let $q: ng.IQService; let $scope: ng.IScope; beforeEach(mock.module(REACT_MODULE, PROVIDER_SERVICE_DELEGATE)); beforeEach( mock.inject((_$q_: ng.IQService, $rootScope: ng.IRootScopeService) => { $q = _$q_; $scope = $rootScope.$new(); State.initialize(); }), ); describe('terminate and decrement server group', () => { it('should set setMaxToNewDesired flag based on current server group capacity', function () { const serverGroup = { asg: { minSize: 4, maxSize: 4, }, }; const instance: IInstance = { name: 'i-123456', id: 'i-123456', account: 'test', region: 'us-east-1', serverGroup: 'asg-1', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }; const application: Application = ApplicationModelBuilder.createApplicationForTests('app', { key: 'serverGroups', lazy: true, defaultData: [], }); let executedTask: IJob = null; spyOn(TaskExecutor, 'executeTask').and.callFake((task: ITaskCommand) => { executedTask = task.job[0]; return undefined; }); spyOn(ServerGroupReader, 'getServerGroup').and.returnValue($q.when(serverGroup as any)); InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, application, {}); $scope.$digest(); $scope.$digest(); expect(TaskExecutor.executeTask).toHaveBeenCalled(); expect(executedTask['setMaxToNewDesired']).toBe(true); }); }); describe('multi-instance operations', () => { let task: ITaskCommand, serverGroupA: IServerGroup, serverGroupB: IServerGroup; function getInstanceGroup(serverGroup: IServerGroup): IMultiInstanceGroup { return State.ClusterState.multiselectModel.getOrCreateInstanceGroup(serverGroup); } function addInstance(serverGroup: IServerGroup, instance: IInstance) { const instanceGroup: IMultiInstanceGroup = getInstanceGroup(serverGroup); instanceGroup.instanceIds.push(instance.id); instanceGroup.instances.push(instance); } beforeEach(function () { task = null; serverGroupA = { type: 'aws', cloudProvider: 'aws', name: 'asg-v001', account: 'prod', region: 'us-east-1', cluster: 'asg', instanceCounts: null, instances: [], }; serverGroupB = { type: 'gce', cloudProvider: 'gce', name: 'asg-v002', account: 'test', region: 'us-west-1', cluster: 'asg', instanceCounts: null, instances: [], }; spyOn(TaskExecutor, 'executeTask').and.callFake((command: ITaskCommand) => { task = command; return undefined; }); }); it('only sends jobs for groups with instances', () => { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupB, { name: 'i-234', id: 'i-234', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); addInstance(serverGroupB, { name: 'i-345', id: 'i-345', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.terminateInstances([getInstanceGroup(serverGroupA), getInstanceGroup(serverGroupB)], application); expect(task.job.length).toBe(1); const job = task.job[0]; expect(job.type).toBe('terminateInstances'); expect(job['instanceIds']).toEqual(['i-234', 'i-345']); expect(job['region']).toBe('us-west-1'); expect(job['cloudProvider']).toBe('gce'); expect(job['credentials']).toBe('test'); expect(job['serverGroupName']).toBe('asg-v002'); }); it('includes additional job properties for terminate and shrink', () => { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupA, { name: 'i-234', id: 'i-234', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); addInstance(serverGroupA, { name: 'i-345', id: 'i-345', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.terminateInstancesAndShrinkServerGroups([getInstanceGroup(serverGroupA)], application); expect(task.job.length).toBe(1); const job: IJob = task.job[0]; expect(job.type).toBe('detachInstances'); expect(job['instanceIds']).toEqual(['i-234', 'i-345']); expect(job['region']).toBe('us-east-1'); expect(job['cloudProvider']).toBe('aws'); expect(job['credentials']).toBe('prod'); expect(job['serverGroupName']).toBe('asg-v001'); expect(job['terminateDetachedInstances']).toBe(true); expect(job['decrementDesiredCapacity']).toBe(true); }); it('includes a useful descriptor on terminate instances', () => { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupA, { name: 'i-123', id: 'i-123', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.terminateInstances([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Terminate 1 instance'); addInstance(serverGroupA, { name: 'i-1234', id: 'i-1234', health: [], healthState: 'Up', zone: 'a', launchTime: 1, }); InstanceWriter.terminateInstances([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Terminate 2 instances'); }); it('includes a useful descriptor on reboot instances', function () { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupA, { name: 'i-123', id: 'i-123', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.rebootInstances([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Reboot 1 instance'); addInstance(serverGroupA, { name: 'i-1234', id: 'i-1234', health: [], healthState: 'Up', zone: 'a', launchTime: 1, }); InstanceWriter.rebootInstances([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Reboot 2 instances'); }); it('includes a useful descriptor on disable in discovery', function () { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupA, { name: 'i-123', id: 'i-123', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.disableInstancesInDiscovery([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Disable 1 instance in discovery'); addInstance(serverGroupA, { name: 'i-1234', id: 'i-1234', health: [], healthState: 'Up', zone: 'a', launchTime: 1, }); InstanceWriter.disableInstancesInDiscovery([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Disable 2 instances in discovery'); }); it('includes a useful descriptor on enable in discovery', function () { const application: Application = ApplicationModelBuilder.createApplicationForTests('app'); addInstance(serverGroupA, { name: 'i-123', id: 'i-123', health: [], healthState: 'Up', zone: 'a', launchTime: 2, }); InstanceWriter.enableInstancesInDiscovery([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Enable 1 instance in discovery'); addInstance(serverGroupA, { name: 'i-1234', id: 'i-1234', health: [], healthState: 'Up', zone: 'a', launchTime: 1, }); InstanceWriter.enableInstancesInDiscovery([getInstanceGroup(serverGroupA)], application); expect(task.description).toBe('Enable 2 instances in discovery'); }); }); });