import { shallow } from 'enzyme';
import React from 'react';
import type { Application } from '@spinnaker/core';
import { ApplicationModelBuilder } from '@spinnaker/core';
import {
createCustomMockLaunchTemplate,
mockLaunchTemplate,
mockLaunchTemplateData,
mockServerGroup,
} from '@spinnaker/mocks';
import { LaunchTemplateDetailsSection } from './LaunchTemplateDetailsSection';
import { MultipleInstanceTypesSubSection } from './MultipleInstanceTypesSubSection';
import type { IAmazonMixedInstancesPolicy, IAmazonServerGroupView, IScalingPolicy } from '../../../domain';
describe('Launch template details', () => {
let app: Application;
beforeEach(() => {
app = ApplicationModelBuilder.createApplicationForTests('testapp');
});
const baseServerGroupWithLt = {
...mockServerGroup,
launchTemplate: createCustomMockLaunchTemplate('test123', {
...mockLaunchTemplateData,
kernelId: 'kernal-abc',
ramDiskId: 'ramDisk-123',
instanceMarketOptions: {
spotOptions: {
maxPrice: '0.50',
},
},
}),
image: {
description: 'ancestor_name=testBaseImage',
imageLocation: 'location',
},
scalingPolicies: [] as IScalingPolicy[],
} as IAmazonServerGroupView;
const baseServerGroupWithMipOverrides = {
...mockServerGroup,
image: {
description: 'ancestor_name=testBaseImage',
imageLocation: 'location',
},
scalingPolicies: [] as IScalingPolicy[],
mixedInstancesPolicy: {
allowedInstanceTypes: ['some.type.medium', 'some.type.large'],
instancesDistribution: {
onDemandAllocationStrategy: 'prioritized',
onDemandBaseCapacity: 1,
onDemandPercentageAboveBaseCapacity: 50,
spotAllocationStrategy: 'capacity-optimized',
spotMaxPrice: '1.5',
},
launchTemplates: [
{
createdBy: 'testuser@test.com',
createdTime: 1588787656527,
defaultVersion: true,
launchTemplateData: mockLaunchTemplateData,
launchTemplateId: '123456',
launchTemplateName: 'testLaunchTemplatev001',
versionDescription: 'Test purposes',
versionNumber: 1,
},
],
launchTemplateOverridesForInstanceType: [
{
instanceType: 'some.type.medium',
weightedCapacity: '2',
},
{
instanceType: 'some.type.large',
weightedCapacity: '4',
},
],
} as IAmazonMixedInstancesPolicy,
} as IAmazonServerGroupView;
it('should not render if no launch template', () => {
const testServerGroup = {
...mockServerGroup,
scalingPolicies: [] as IScalingPolicy[],
} as IAmazonServerGroupView;
const wrapper = shallow();
expect(wrapper.type()).toEqual(null);
});
it('should render base info', () => {
const wrapper = shallow();
const labeledValues = wrapper.find('LabeledValue');
expect(labeledValues.length).toEqual(12);
expect(labeledValues.at(0).prop('value')).toEqual('test123');
expect(labeledValues.at(1).prop('value')).toEqual('ami-0123456789');
expect(labeledValues.at(4).prop('value')).toEqual('m5.large');
expect(labeledValues.at(5).prop('value')).toEqual('testapplicationInstanceProfile');
expect(labeledValues.at(6).prop('value')).toEqual('disabled');
});
it('should render launch template details for server group with launchTemplate', () => {
const testServerGroup = {
...mockServerGroup,
launchTemplate: createCustomMockLaunchTemplate('ltWithCredits', {
...mockLaunchTemplateData,
instanceMarketOptions: {
spotOptions: {
maxPrice: '0.50',
},
},
creditSpecification: {
cpuCredits: 'unlimited',
},
keyName: 'test',
kernelId: 'kernal-abc',
ramDiskId: 'ramDisk-123',
userData: 'thisisfakeuserdata',
}),
image: {
description: 'ancestor_name=testBaseImage',
imageLocation: 'location',
},
} as IAmazonServerGroupView;
const wrapper = shallow();
const actualLabeledValues = wrapper.find('LabeledValue');
expect(actualLabeledValues.length).toEqual(13);
const expectedLabels = new Map([
['Name', 'ltWithCredits'],
['Image ID', 'ami-0123456789'],
['Image Name', 'location'],
['Base Image Name', 'testBaseImage'],
['Instance Type', 'm5.large'],
['CPU Credit Specification', 'unlimited'],
['IAM Profile', 'testapplicationInstanceProfile'],
['Instance Monitoring', 'disabled'],
['Max Spot Price', '0.50'],
['Key Name', 'test'],
['Kernel ID', 'kernal-abc'],
['Ramdisk ID', 'ramDisk-123'],
['User Data', ''],
]);
let index = 0;
expectedLabels.forEach((value, key) => {
const labeledValue = actualLabeledValues.at(index++);
expect(labeledValue.prop('label')).toEqual(key);
value != '' && expect(labeledValue.prop('value')).toEqual(value);
});
});
it('should conditionally render launch template details for server group with mixedInstancesPolicy', () => {
const testServerGroup = baseServerGroupWithMipOverrides;
const wrapper = shallow();
const labeledValues = wrapper.find('LabeledValue');
expect(labeledValues.length).toEqual(9);
expect(labeledValues.at(0).prop('value')).toEqual('testLaunchTemplatev001');
expect(labeledValues.at(1).prop('value')).toEqual('ami-0123456789');
expect(labeledValues.at(2).prop('value')).toEqual('location');
expect(labeledValues.at(3).prop('value')).toEqual('testBaseImage');
expect(labeledValues.at(4).prop('value')).toEqual('testapplicationInstanceProfile');
expect(labeledValues.at(5).prop('value')).toEqual('disabled');
expect(labeledValues.at(6).prop('value')).toEqual('1.5');
expect(labeledValues.at(7).prop('value')).toEqual('test');
expect(labeledValues.at(8).prop('label')).toEqual('User Data');
const multipleInstanceTypes = shallow(
,
);
expect(multipleInstanceTypes.isEmptyRender()).toEqual(false);
const multipleInstanceTypesTableRows = multipleInstanceTypes.find('td');
expect(multipleInstanceTypesTableRows.length).toEqual(4);
expect(multipleInstanceTypesTableRows.at(0).text()).toEqual('some.type.medium');
expect(multipleInstanceTypesTableRows.at(1).text()).toEqual('2');
expect(multipleInstanceTypesTableRows.at(2).text()).toEqual('some.type.large');
expect(multipleInstanceTypesTableRows.at(3).text()).toEqual('4');
});
it('should conditionally render image information', () => {
const wrapper = shallow();
const labeledValues = wrapper.find('LabeledValue');
expect(labeledValues.at(2).prop('label')).toEqual('Image Name');
expect(labeledValues.at(3).prop('label')).toEqual('Base Image Name');
const newServerGroup = {
...baseServerGroupWithLt,
};
delete newServerGroup.image;
wrapper.setProps({
serverGroup: newServerGroup,
});
const imageName = wrapper.findWhere((lv) => lv.prop('label') === 'Image Name');
const baseImage = wrapper.findWhere((lv) => lv.prop('label') === 'Base Image Name');
expect(imageName.length).toEqual(0);
expect(baseImage.length).toEqual(0);
});
it('should conditionally render additional info', () => {
const wrapper = shallow();
const labeledValues = wrapper.find('LabeledValue');
expect(labeledValues.at(7).prop('label')).toEqual('Max Spot Price');
expect(labeledValues.at(8).prop('label')).toEqual('Key Name');
expect(labeledValues.at(9).prop('label')).toEqual('Kernel ID');
expect(labeledValues.at(10).prop('label')).toEqual('Ramdisk ID');
expect(labeledValues.at(11).prop('label')).toEqual('User Data');
const newServerGroup = {
...baseServerGroupWithLt,
launchTemplate: mockLaunchTemplate,
};
delete newServerGroup.launchTemplate.launchTemplateData.userData;
delete newServerGroup.launchTemplate.launchTemplateData.keyName;
wrapper.setProps({
serverGroup: newServerGroup,
});
const spotPrice = wrapper.findWhere((lv) => lv.prop('label') === 'Max Spot Price');
const keyName = wrapper.findWhere((lv) => lv.prop('label') === 'Key Name');
const kernelId = wrapper.findWhere((lv) => lv.prop('label') === 'Kernel ID');
const ramdiskId = wrapper.findWhere((lv) => lv.prop('label') === 'Ramdisk ID');
const userData = wrapper.findWhere((lv) => lv.prop('label') === 'User Data');
expect(spotPrice.length).toEqual(0);
expect(keyName.length).toEqual(0);
expect(ramdiskId.length).toEqual(0);
expect(kernelId.length).toEqual(0);
expect(userData.length).toEqual(0);
});
it('should not render multiple instance types subsection when overrides are not specified', () => {
const testServerGroup = baseServerGroupWithMipOverrides;
testServerGroup.mixedInstancesPolicy.launchTemplateOverridesForInstanceType = null;
const multipleInstanceTypes = shallow(
,
);
expect(multipleInstanceTypes.isEmptyRender()).toEqual(true);
});
});