@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
255 lines (211 loc) • 8.57 kB
JavaScript
;
import * as angular from 'angular';
import _ from 'lodash';
import { AccountService } from '@spinnaker/core';
import { DCOS_IMAGE_IMAGE_READER } from '../../image/image.reader';
export const DCOS_SERVERGROUP_CONFIGURE_CONFIGURATION_SERVICE =
'spinnaker.dcos.serverGroup.configure.configuration.service';
export const name = DCOS_SERVERGROUP_CONFIGURE_CONFIGURATION_SERVICE; // for backwards compatibility
angular
.module(DCOS_SERVERGROUP_CONFIGURE_CONFIGURATION_SERVICE, [DCOS_IMAGE_IMAGE_READER])
.factory('dcosServerGroupConfigurationService', [
'$q',
'dcosImageReader',
function ($q, dcosImageReader) {
function configureCommand(application, command, query = '') {
const queries = command.docker.image ? [grabImageAndTag(command.docker.image.imageId)] : [];
if (query) {
queries.push(query);
}
let imagesPromise;
if (queries.length) {
imagesPromise = $q
.all(
queries.map((q) =>
dcosImageReader.findImages({
provider: 'dockerRegistry',
count: 50,
q: q,
}),
),
)
.then(_.flatten);
} else {
imagesPromise = $q.when([]);
}
return $q
.all({
credentialsKeyedByAccount: AccountService.getCredentialsKeyedByAccount('dcos'),
allImages: imagesPromise,
})
.then(function (backingData) {
backingData.accounts = _.keys(backingData.credentialsKeyedByAccount);
backingData.filtered = {};
backingData.allSecrets = {};
if (application.attributes && application.attributes.secrets) {
backingData.allSecrets = JSON.parse(application.attributes.secrets);
}
if (command.viewState.contextImages) {
backingData.allImages = backingData.allImages.concat(command.viewState.contextImages);
}
command.backingData = backingData;
return $q.all().then(function () {
configureAccount(command);
attachEventHandlers(command);
});
});
}
function grabImageAndTag(imageId) {
return imageId.split('/').pop();
}
function buildImageId(image) {
if (image.fromContext) {
return `${image.cluster} ${image.pattern}`;
} else if (image.fromTrigger && !image.tag) {
return `${image.registry}/${image.repository} (Tag resolved at runtime)`;
} else {
return `${image.registry}/${image.repository}:${image.tag}`;
}
}
function configureDockerRegistries(command) {
const result = { dirty: {} };
const selectedDcosCluster = _.find(command.backingData.filtered.dcosClusters, { name: command.dcosCluster });
if (selectedDcosCluster) {
command.backingData.filtered.dockerRegistries = selectedDcosCluster.dockerRegistries;
} else {
command.backingData.filtered.dockerRegistries = [];
}
return result;
}
function configureImages(command) {
const result = { dirty: {} };
const registryAccountNames = _.map(command.backingData.filtered.dockerRegistries, function (registry) {
return registry.accountName;
});
command.backingData.filtered.images = _.map(
_.filter(command.backingData.allImages, function (image) {
return (
image.fromContext || image.fromTrigger || _.includes(registryAccountNames, image.account) || image.message
);
}),
function (image) {
return mapImage(image);
},
);
if (
command.docker.image &&
!_.some(command.backingData.filtered.images, { imageId: command.docker.image.imageId })
) {
result.dirty.imageId = command.docker.image.imageId;
command.docker.image = null;
}
return result;
}
function mapImage(image) {
if (image.message !== undefined) {
return image;
}
return {
repository: image.repository,
tag: image.tag,
imageId: buildImageId(image),
registry: image.registry,
fromContext: image.fromContext,
fromTrigger: image.fromTrigger,
cluster: image.cluster,
account: image.account,
pattern: image.pattern,
stageId: image.stageId,
};
}
function configureSecrets(command) {
const result = { dirty: {} };
if (!command.region || !command.backingData.allSecrets[command.dcosCluster]) {
command.backingData.filtered.secrets = [];
} else {
const appPath = command.account + '/' + command.region + '/';
command.backingData.filtered.secrets = _.filter(
command.backingData.allSecrets[command.dcosCluster].sort(),
function (secret) {
const secretPath = secret.substring(0, secret.lastIndexOf('/') + 1);
return appPath.startsWith(secretPath);
},
);
}
if (command.viewModel.env) {
command.viewModel.env.forEach(function (envModel) {
if (
envModel.isSecret &&
envModel.rawValue != null &&
!command.backingData.filtered.secrets.includes(envModel.rawValue)
) {
result.dirty.secrets = result.dirty.secrets || [];
result.dirty.secrets.push(envModel.rawValue);
envModel.rawValue = null;
envModel.value = null;
}
});
}
return result;
}
function configureDcosClusters(command) {
const result = { dirty: {} };
command.backingData.filtered.dcosClusters = command.backingData.account.dcosClusters;
if (!_.chain(command.backingData.filtered.dcosClusters).some({ name: command.dcosCluster }).value()) {
result.dirty.dcosCluster = command.dcosCluster;
command.dcosCluster = null;
}
angular.extend(result.dirty, configureDockerRegistries(command).dirty);
angular.extend(result.dirty, configureImages(command).dirty);
angular.extend(result.dirty, configureSecrets(command).dirty);
return result;
}
function configureAccount(command) {
const result = { dirty: {} };
command.backingData.account = command.backingData.credentialsKeyedByAccount[command.account];
if (command.backingData.account) {
angular.extend(result.dirty, configureDcosClusters(command).dirty);
}
return result;
}
function updateRegion(command) {
command.region =
command.dcosCluster +
(command.group ? (command.group.substring(0, 1) == '/' ? '' : '/') + command.group : '');
}
function attachEventHandlers(command) {
command.accountChanged = function accountChanged() {
const result = { dirty: {} };
angular.extend(result.dirty, configureAccount(command).dirty);
command.viewState.dirty = command.viewState.dirty || {};
angular.extend(command.viewState.dirty, result.dirty);
return result;
};
command.dcosClusterChanged = function dcosClusterChanged() {
updateRegion(command);
const result = { dirty: {} };
angular.extend(result.dirty, configureDockerRegistries(command).dirty);
angular.extend(result.dirty, configureSecrets(command).dirty);
command.viewState.dirty = command.viewState.dirty || {};
angular.extend(command.viewState.dirty, result.dirty);
return result;
};
command.groupChanged = function groupChanged() {
updateRegion(command);
const result = { dirty: {} };
angular.extend(result.dirty, configureSecrets(command).dirty);
command.viewState.dirty = command.viewState.dirty || {};
angular.extend(command.viewState.dirty, result.dirty);
return result;
};
}
return {
configureCommand: configureCommand,
configureAccount: configureAccount,
configureImages: configureImages,
configureDockerRegistries: configureDockerRegistries,
configureSecrets: configureSecrets,
buildImageId: buildImageId,
};
},
]);