Skip to content

Commit

Permalink
refactor(amazon/loadBalancer): Make load balancer actions button a re…
Browse files Browse the repository at this point in the history
…act component
  • Loading branch information
Justin Reynolds committed Jan 19, 2018
1 parent c8d9d6d commit 9bc4bde
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 97 deletions.
@@ -0,0 +1,129 @@
import { IModalSettings } from 'angular-ui-bootstrap';
import * as React from 'react';
import { Dropdown } from 'react-bootstrap';
import { cloneDeep, get } from 'lodash';
import { BindAll } from 'lodash-decorators';

import { Application, SETTINGS } from 'core';
import { NgReact, ReactInjector } from 'core/reactShims';

import { IAmazonLoadBalancer, IAmazonLoadBalancerDeleteCommand } from 'amazon';

import { ILoadBalancerFromStateParams } from './loadBalancerDetails.controller';
import { LoadBalancerTypes } from '../configure/choice/LoadBalancerTypes';

export interface ILoadBalancerActionsProps {
app: Application;
loadBalancer: IAmazonLoadBalancer;
loadBalancerFromParams: ILoadBalancerFromStateParams;
}

@BindAll()
export class LoadBalancerActions extends React.Component<ILoadBalancerActionsProps> {
public editLoadBalancer(): void {
const { loadBalancer } = this.props;

const wizard = LoadBalancerTypes.find(t => t.type === loadBalancer.loadBalancerType);

let application = this.props.app;

const modalOptions: IModalSettings = {
templateUrl: wizard.editTemplateUrl,
controller: `${wizard.controller} as ctrl`,
size: 'lg',
resolve: {
application: () => application,
loadBalancer: () => cloneDeep(loadBalancer),
isNew: () => false,
forPipelineConfig: () => false
}
};

const loadBalancerAppName = loadBalancer.name.split('-')[0];

if (loadBalancerAppName === application.name) {
// Name matches the currently active application
ReactInjector.modalService.open(modalOptions);
} else {
// Load balancer a part of a different application
ReactInjector.applicationReader.getApplication(loadBalancerAppName)
.then((loadBalancerApp) => {
application = loadBalancerApp;
ReactInjector.modalService.open(modalOptions);
})
.catch(() => {
// If the application can't be found, just use the old one
ReactInjector.modalService.open(modalOptions);
});
}
}

public deleteLoadBalancer(): void {
const { app, loadBalancer, loadBalancerFromParams } = this.props;

if (loadBalancer.instances && loadBalancer.instances.length) {
return;
}

const taskMonitor = {
application: app,
title: 'Deleting ' + loadBalancerFromParams.name,
};

const command: IAmazonLoadBalancerDeleteCommand = {
cloudProvider: loadBalancer.cloudProvider,
loadBalancerName: loadBalancer.name,
loadBalancerType: loadBalancer.loadBalancerType || 'classic',
regions: [loadBalancer.region],
credentials: loadBalancer.account,
vpcId: get(loadBalancer, 'elb.vpcId', null),
};

const submitMethod = () => ReactInjector.loadBalancerWriter.deleteLoadBalancer(command, app);

ReactInjector.confirmationModalService.confirm({
header: `Really delete ${loadBalancerFromParams.name} in ${loadBalancerFromParams.region}: ${loadBalancerFromParams.accountId}?`,
buttonText: `Delete ${loadBalancerFromParams.name}`,
provider: 'aws',
account: loadBalancerFromParams.accountId,
applicationName: app.name,
taskMonitorConfig: taskMonitor,
submitMethod: submitMethod
});
}

private entityTagUpdate(): void {
this.props.app.loadBalancers.refresh();
}

public render() {
const { app, loadBalancer } = this.props;

const { AddEntityTagLinks } = NgReact;

return (
<Dropdown className="dropdown" id="load-balancer-actions-dropdown">
<Dropdown.Toggle className="btn btn-sm btn-primary dropdown-toggle">
<span>Load Balancer Actions</span>
</Dropdown.Toggle>
<Dropdown.Menu className="dropdown-menu">
<li><a className="clickable" onClick={this.editLoadBalancer}>Edit Load Balancer</a></li>
{!loadBalancer.instances.length && <li><a className="clickable" onClick={this.deleteLoadBalancer}>Delete Load Balancer</a></li>}
{loadBalancer.instances.length > 0 && (
<li className="disabled" uib-tooltip="You must detach all instances before you can delete this load balancer.">
<a className="clickable" onClick={this.deleteLoadBalancer}>Delete Load Balancer</a>
</li>
)}
{SETTINGS && SETTINGS.feature.entityTags && (
<AddEntityTagLinks
component={loadBalancer}
application={app}
entityType="loadBalancer"
onUpdate={this.entityTagUpdate}
/>
)}
</Dropdown.Menu>
</Dropdown>
);
}
}
@@ -0,0 +1,8 @@
import { module } from 'angular';
import { react2angular } from 'react2angular';

import { LoadBalancerActions } from './LoadBalancerActions';

export const LOAD_BALANCER_ACTIONS = 'spinnaker.amazon.loadBalancer.details.loadBalancerActions.component';
module(LOAD_BALANCER_ACTIONS, [])
.component('loadBalancerActions', react2angular(LoadBalancerActions, ['app', 'loadBalancer', 'loadBalancerFromParams']));
@@ -1,22 +1,18 @@
import { IController, IPromise, IQService, IScope, module } from 'angular';
import { IModalService, IModalSettings } from 'angular-ui-bootstrap';
import { StateService } from '@uirouter/angularjs';
import { cloneDeep, head, get, sortBy, uniq } from 'lodash';
import { head, sortBy, uniq } from 'lodash';

import {
Application,
APPLICATION_READ_SERVICE,
ApplicationReader,
CONFIRMATION_MODAL_SERVICE,
ConfirmationModalService,
IApplicationSecurityGroup,
ILoadBalancer,
ISecurityGroup,
ISubnet,
LOAD_BALANCER_READ_SERVICE,
LOAD_BALANCER_WRITE_SERVICE,
LoadBalancerReader,
LoadBalancerWriter,
SECURITY_GROUP_READER,
SecurityGroupReader,
SUBNET_READ_SERVICE,
Expand All @@ -26,13 +22,11 @@ import {
import {
IAmazonApplicationLoadBalancer,
IAmazonLoadBalancer,
IAmazonLoadBalancerDeleteCommand,
IAmazonLoadBalancerSourceData,
IApplicationLoadBalancerSourceData,
IClassicLoadBalancerSourceData,
ITargetGroup
} from 'amazon';
import { LoadBalancerTypes } from '../configure/choice/LoadBalancerTypes';

export interface ILoadBalancerFromStateParams {
accountId: string;
Expand All @@ -44,23 +38,19 @@ export class AwsLoadBalancerDetailsController implements IController {
public application: Application;
public elbProtocol: string;
public listeners: {in: string, targets: ITargetGroup[]}[];
private loadBalancerFromParams: ILoadBalancerFromStateParams;
public loadBalancerFromParams: ILoadBalancerFromStateParams;
public loadBalancer: IAmazonLoadBalancer;
public securityGroups: ISecurityGroup[];
public ipAddressTypeDescription: string;
public state = { loading: true };

constructor(private $scope: IScope,
private $state: StateService,
private $uibModal: IModalService,
private $q: IQService,
loadBalancer: ILoadBalancerFromStateParams,
private app: Application,
private applicationReader: ApplicationReader,
private securityGroupReader: SecurityGroupReader,
private confirmationModalService: ConfirmationModalService,
private loadBalancerReader: LoadBalancerReader,
private loadBalancerWriter: LoadBalancerWriter,
private subnetReader: SubnetReader) {
'ngInject';
this.application = app;
Expand All @@ -75,73 +65,6 @@ export class AwsLoadBalancerDetailsController implements IController {
});
}

public editLoadBalancer(): void {
const wizard = LoadBalancerTypes.find(t => t.type === this.loadBalancer.loadBalancerType);

let application = this.app;
const modalOptions: IModalSettings = {
templateUrl: wizard.editTemplateUrl,
controller: `${wizard.controller} as ctrl`,
size: 'lg',
resolve: {
application: () => application,
loadBalancer: () => cloneDeep(this.loadBalancer),
isNew: () => false,
forPipelineConfig: () => false
}
};

const loadBalancerAppName = this.loadBalancer.name.split('-')[0];

if (loadBalancerAppName === this.app.name) {
// Name matches the currently active application
this.$uibModal.open(modalOptions);
} else {
// Load balancer a part of a different application
this.applicationReader.getApplication(loadBalancerAppName)
.then((loadBalancerApp) => {
application = loadBalancerApp;
this.$uibModal.open(modalOptions);
})
.catch(() => {
// If the application can't be found, just use the old one
this.$uibModal.open(modalOptions);
});
}
}

public deleteLoadBalancer(): void {
if (this.loadBalancer.instances && this.loadBalancer.instances.length) {
return;
}

const taskMonitor = {
application: this.app,
title: 'Deleting ' + this.loadBalancerFromParams.name,
};

const command: IAmazonLoadBalancerDeleteCommand = {
cloudProvider: this.loadBalancer.cloudProvider,
loadBalancerName: this.loadBalancer.name,
loadBalancerType: this.loadBalancer.loadBalancerType || 'classic',
regions: [this.loadBalancer.region],
credentials: this.loadBalancer.account,
vpcId: get(this.loadBalancer, 'elb.vpcId', null),
};

const submitMethod = () => this.loadBalancerWriter.deleteLoadBalancer(command, this.app);

this.confirmationModalService.confirm({
header: `Really delete ${this.loadBalancerFromParams.name} in ${this.loadBalancerFromParams.region}: ${this.loadBalancerFromParams.accountId}?`,
buttonText: `Delete ${this.loadBalancerFromParams.name}`,
provider: 'aws',
account: this.loadBalancerFromParams.accountId,
applicationName: this.app.name,
taskMonitorConfig: taskMonitor,
submitMethod: submitMethod
});
}

public autoClose(): void {
if (this.$scope.$$destroyed) {
return;
Expand Down
Expand Up @@ -40,24 +40,11 @@ <h3 select-on-dbl-click>
</div>
<div>
<div class="actions" ng-if="ctrl.loadBalancer.loadBalancerType !== 'network'">
<div class="dropdown" uib-dropdown dropdown-append-to-body>
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>
Load Balancer Actions <span class="caret"></span>
</button>
<ul class="dropdown-menu" uib-dropdown-menu role="menu">
<li><a href ng-click="ctrl.editLoadBalancer()">Edit Load Balancer</a></li>
<li ng-if="!ctrl.loadBalancer.instances.length"><a href ng-click="ctrl.deleteLoadBalancer()">Delete Load Balancer</a></li>
<li ng-if="ctrl.loadBalancer.instances.length" class="disabled" uib-tooltip="You must detach all instances before you can delete this load balancer.">
<a href ng-click="ctrl.deleteLoadBalancer()">Delete Load Balancer</a>
</li>
<render-if-feature feature="entityTags">
<add-entity-tag-links component="ctrl.loadBalancer"
application="ctrl.application"
entity-type="loadBalancer"
on-update="ctrl.application.loadBalancers.refresh()"></add-entity-tag-links>
</render-if-feature>
</ul>
</div>
<load-balancer-actions
app="ctrl.application"
load-balancer="ctrl.loadBalancer"
load-balancer-from-params="ctrl.loadBalancerFromParams"
></load-balancer-actions>
</div>
</div>
</div>
Expand Down

0 comments on commit 9bc4bde

Please sign in to comment.