@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
156 lines (139 loc) • 4.99 kB
text/typescript
import { StateService } from '@uirouter/angularjs';
import { IController, IScope, module } from 'angular';
import { IModalService } from 'angular-ui-bootstrap';
import { cloneDeep } from 'lodash';
import {
Application,
ConfirmationModalService,
ILoadBalancer,
ILoadBalancerDeleteCommand,
LoadBalancerWriter,
} from '@spinnaker/core';
import { IAppengineLoadBalancer } from 'appengine/domain';
interface ILoadBalancerFromStateParams {
accountId: string;
region: string;
name: string;
}
class AppengineLoadBalancerDetailsController implements IController {
public state = { loading: true };
private loadBalancerFromParams: ILoadBalancerFromStateParams;
public loadBalancer: IAppengineLoadBalancer;
public dispatchRules: string[] = [];
public static $inject = ['$uibModal', '$state', '$scope', 'loadBalancer', 'app'];
constructor(
private $uibModal: IModalService,
private $state: StateService,
private $scope: IScope,
loadBalancer: ILoadBalancerFromStateParams,
private app: Application,
) {
this.loadBalancerFromParams = loadBalancer;
this.app
.getDataSource('loadBalancers')
.ready()
.then(() => this.extractLoadBalancer());
}
public editLoadBalancer(): void {
this.$uibModal.open({
templateUrl: require('../configure/wizard/wizard.html'),
controller: 'appengineLoadBalancerWizardCtrl as ctrl',
size: 'lg',
resolve: {
application: () => this.app,
loadBalancer: () => cloneDeep(this.loadBalancer),
isNew: () => false,
forPipelineConfig: () => false,
},
});
}
public deleteLoadBalancer(): void {
const taskMonitor = {
application: this.app,
title: 'Deleting ' + this.loadBalancer.name,
};
const submitMethod = () => {
const loadBalancer: ILoadBalancerDeleteCommand = {
cloudProvider: this.loadBalancer.cloudProvider,
loadBalancerName: this.loadBalancer.name,
credentials: this.loadBalancer.account,
};
return LoadBalancerWriter.deleteLoadBalancer(loadBalancer, this.app);
};
ConfirmationModalService.confirm({
header: 'Really delete ' + this.loadBalancer.name + '?',
buttonText: 'Delete ' + this.loadBalancer.name,
body: this.getConfirmationModalBodyHtml(),
account: this.loadBalancer.account,
taskMonitorConfig: taskMonitor,
submitMethod,
});
}
public canDeleteLoadBalancer(): boolean {
return this.loadBalancer.name !== 'default';
}
private extractLoadBalancer(): void {
this.loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {
return test.name === this.loadBalancerFromParams.name && test.account === this.loadBalancerFromParams.accountId;
}) as IAppengineLoadBalancer;
if (this.loadBalancer) {
this.state.loading = false;
this.buildDispatchRules();
this.app.getDataSource('loadBalancers').onRefresh(this.$scope, () => this.extractLoadBalancer());
} else {
this.autoClose();
}
}
private buildDispatchRules(): void {
this.dispatchRules = [];
if (this.loadBalancer && this.loadBalancer.dispatchRules) {
this.loadBalancer.dispatchRules.forEach((rule) => {
if (rule.service === this.loadBalancer.name) {
this.dispatchRules.push(rule.domain + rule.path);
}
});
}
}
private getConfirmationModalBodyHtml(): string {
const serverGroupNames = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);
const hasAny = serverGroupNames ? serverGroupNames.length > 0 : false;
const hasMoreThanOne = serverGroupNames ? serverGroupNames.length > 1 : false;
// HTML accepted by the confirmationModalService is static (i.e., not managed by angular).
if (hasAny) {
if (hasMoreThanOne) {
const listOfServerGroupNames = serverGroupNames.map((name) => `<li>${name}</li>`).join('');
return `<div class="alert alert-warning">
<p>
Deleting <b>${this.loadBalancer.name}</b> will destroy the following server groups:
<ul>
${listOfServerGroupNames}
</ul>
</p>
</div>
`;
} else {
return `<div class="alert alert-warning">
<p>
Deleting <b>${this.loadBalancer.name}</b> will destroy <b>${serverGroupNames[0]}</b>.
</p>
</div>
`;
}
} else {
return null;
}
}
private autoClose(): void {
if (this.$scope.$$destroyed) {
return;
} else {
this.$state.params.allowModalToStayOpen = true;
this.$state.go('^', null, { location: 'replace' });
}
}
}
export const APPENGINE_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.appengine.loadBalancerDetails.controller';
module(APPENGINE_LOAD_BALANCER_DETAILS_CTRL, []).controller(
'appengineLoadBalancerDetailsCtrl',
AppengineLoadBalancerDetailsController,
);