@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
270 lines (241 loc) • 9.91 kB
text/typescript
import { ApplicationModelBuilder } from 'core/application/applicationModel.builder';
import { Application } from 'core/application/application.model';
import { mock, IQService, IScope, IRootScopeService } from 'angular';
import { AccountService, IAccountDetails } from 'core/account/AccountService';
import { CloudProviderRegistry } from 'core/cloudProvider';
import { ProviderSelectionModal } from 'core/cloudProvider/providerSelection/ProviderSelectionModal';
import { ProviderSelectionService } from './ProviderSelectionService';
import { SETTINGS } from 'core/config/settings';
function fakeAccount(provider: string): IAccountDetails {
return {
cloudProvider: provider,
accountId: 'foobaraccount',
name: 'foo-bar-account',
requiredGroupMembership: [],
type: 'foobaraccount',
accountType: 'foo',
authorized: true,
challengeDestructiveActions: true,
environment: 'foo-env',
primaryAccount: true,
regions: [],
};
}
describe('ProviderSelectionService: API', () => {
// required to ensure registry provider is available
let $q: IQService, $scope: IScope;
beforeEach(
mock.inject((_$q_: IQService, $rootScope: IRootScopeService) => {
$q = _$q_;
$scope = $rootScope.$new();
}),
);
let hasValue: boolean, accounts: IAccountDetails[];
beforeEach(() => {
spyOn(AccountService, 'applicationAccounts').and.callFake(() => $q.when(accounts));
spyOn(CloudProviderRegistry, 'hasValue').and.callFake(() => hasValue);
spyOn(ProviderSelectionModal, 'show').and.returnValue($q.when('modalProvider') as any);
});
beforeEach(() => {
SETTINGS.providers.testProvider = {
defaults: {
account: 'testProviderAccount',
region: 'testProviderRegion',
},
};
});
afterEach(SETTINGS.resetToOriginal);
let application: Application, config: any;
beforeEach(() => {
hasValue = false;
accounts = [];
delete SETTINGS.defaultProvider;
application = ApplicationModelBuilder.createApplicationForTests('app');
application.attributes = { cloudProviders: 'testProvider' };
config = {
name: 'testProvider',
securityGroup: {},
};
});
it('should use the specified, default provider if the requested provider cannot be found', () => {
let provider = '';
SETTINGS.defaultProvider = 'defaultProvider';
CloudProviderRegistry.registerProvider('fakeProvider', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('defaultProvider');
});
it('should use "aws" as the default provider if the requested provider cannot be found and there is no default set', () => {
let provider = '';
CloudProviderRegistry.registerProvider('fakeProvider', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('aws');
});
it('should return the specified provider if that provider is registered', () => {
let provider = '';
hasValue = true;
accounts = [fakeAccount('testProvider')];
CloudProviderRegistry.registerProvider('testProvider', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('testProvider');
});
it('should return the "use provider" value instead of the configured one if one is specified', () => {
let provider = '';
hasValue = true;
accounts = [fakeAccount('testProvider')];
config.securityGroup.useProvider = 'titus';
CloudProviderRegistry.registerProvider('testProvider', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('titus');
});
it('should use the specified provider from the configuration', () => {
let provider = '';
hasValue = true;
accounts = [fakeAccount('aws'), fakeAccount('titus')];
CloudProviderRegistry.registerProvider('aws', { securityGroup: {} } as any);
CloudProviderRegistry.registerProvider('titus', { securityGroup: { useProvider: 'aws' } } as any);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('aws');
});
it('should use the provider "selected" from the "modal"', () => {
let provider = '';
hasValue = true;
accounts = [fakeAccount('aws'), fakeAccount('titus'), fakeAccount('testProvider')];
CloudProviderRegistry.registerProvider('aws', { securityGroup: {} } as any);
CloudProviderRegistry.registerProvider('titus', { securityGroup: { useProvider: 'aws' } } as any);
CloudProviderRegistry.registerProvider('testProvider', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('modalProvider');
});
it('should not return a filtered provider', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
accounts = [k8s];
CloudProviderRegistry.registerProvider('kubernetes', config);
SETTINGS.defaultProvider = 'defaultProvider';
const filterFn = (_app: Application, acc: IAccountDetails) => acc.cloudProvider !== 'kubernetes';
ProviderSelectionService.selectProvider(application, 'securityGroup', filterFn).then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('defaultProvider');
});
it('should not launch a modal if one of two providers is filtered out by filter function', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
accounts = [k8s, fakeAccount('titus')];
CloudProviderRegistry.registerProvider('titus', config);
CloudProviderRegistry.registerProvider('kubernetes', config);
const filterFn = (_app: Application, acc: IAccountDetails) => acc.cloudProvider !== 'kubernetes';
ProviderSelectionService.selectProvider(application, 'securityGroup', filterFn).then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('titus');
});
it('should return k8s provider in case the kubernetesAdHocInfraWritesEnabled is set to true and is the only provider configured', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
k8s.type = 'kubernetes';
accounts = [k8s];
let configuration = {
name: 'Kubernetes',
kubernetesAdHocInfraWritesEnabled: true,
};
CloudProviderRegistry.registerProvider('kubernetes', configuration);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('kubernetes');
});
it('should use "aws" as the default provider in case the only provider is k8s and the kubernetesAdHocInfraWritesEnabled is set to false', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
k8s.type = 'kubernetes';
accounts = [k8s];
let configuration = {
name: 'Kubernetes',
kubernetesAdHocInfraWritesEnabled: false,
};
CloudProviderRegistry.registerProvider('kubernetes', configuration);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('aws');
});
it('should use "aws" as the default provider in case the only provider is k8s and the kubernetesAdHocInfraWritesEnabled is not specified', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
k8s.type = 'kubernetes';
accounts = [k8s];
let configuration = {
name: 'Kubernetes',
};
CloudProviderRegistry.registerProvider('kubernetes', configuration);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('aws');
});
it('should not use "k8s" as an option for the modal when the k8s kubernetesAdHocInfraWritesEnabled is set to false and there are others providers', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
k8s.type = 'kubernetes';
accounts = [k8s, fakeAccount('gce')];
let configuration = {
name: 'Kubernetes',
kubernetesAdHocInfraWritesEnabled: false,
};
CloudProviderRegistry.registerProvider('kubernetes', configuration);
CloudProviderRegistry.registerProvider('gce', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('gce');
});
it('should use "modalProvider" when the k8s kubernetesAdHocInfraWritesEnabled is set to true and there are others providers', () => {
let provider = '';
hasValue = true;
const k8s = fakeAccount('kubernetes');
k8s.type = 'kubernetes';
accounts = [k8s, fakeAccount('gce')];
let configuration = {
name: 'Kubernetes',
kubernetesAdHocInfraWritesEnabled: true,
};
CloudProviderRegistry.registerProvider('kubernetes', configuration);
CloudProviderRegistry.registerProvider('gce', config);
ProviderSelectionService.selectProvider(application, 'securityGroup').then((_provider) => {
provider = _provider;
});
$scope.$digest();
expect(provider).toBe('modalProvider');
});
});