UNPKG

@spotinst/spinnaker-deck

Version:

Spinnaker-Deck service, forked with support to Spotinst

267 lines (224 loc) 8.78 kB
'use strict'; import UIROUTER_ANGULARJS from '@uirouter/angularjs'; import { module } from 'angular'; import { AccountService, FirewallLabels, NetworkReader, TaskMonitor } from '@spinnaker/core'; import { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service'; const _ = require('lodash'); export const AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL = 'spinnaker.azure.securityGroup.create.controller'; export const name = AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL; // for backwards compatibility module(AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL, [ UIROUTER_ANGULARJS, AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE, ]).controller('azureCreateSecurityGroupCtrl', [ '$scope', '$uibModalInstance', '$state', '$controller', 'application', 'securityGroup', 'azureSecurityGroupWriter', function ($scope, $uibModalInstance, $state, $controller, application, securityGroup, azureSecurityGroupWriter) { $scope.pages = { location: require('./createSecurityGroupProperties.html'), ingress: require('./createSecurityGroupIngress.html'), }; $scope.regions = []; $scope.firewallLabel = FirewallLabels.get('Firewall'); const ctrl = this; $scope.isNew = true; $scope.state = { submitting: false, infiniteScroll: { numToAdd: 20, currentItems: 20, }, }; AccountService.listAccounts('azure').then(function (accounts) { $scope.accounts = accounts; ctrl.accountUpdated(); }); ctrl.addMoreItems = function () { $scope.state.infiniteScroll.currentItems += $scope.state.infiniteScroll.numToAdd; }; function onApplicationRefresh() { // If the user has already closed the modal, do not navigate to the new details view if ($scope.$$destroyed) { return; } $uibModalInstance.close(); const newStateParams = { name: $scope.securityGroup.name, accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName, region: $scope.securityGroup.regions[0], provider: 'azure', }; if (!$state.includes('**.firewallDetails')) { $state.go('.firewallDetails', newStateParams); } else { $state.go('^.firewallDetails', newStateParams); } } function onTaskComplete() { application.securityGroups.refresh(); application.securityGroups.onNextRefresh($scope, onApplicationRefresh); } $scope.taskMonitor = new TaskMonitor({ application: application, title: `Creating your ${FirewallLabels.get('firewall')}`, modalInstance: $uibModalInstance, onTaskComplete: onTaskComplete, }); $scope.securityGroup = securityGroup; ctrl.accountUpdated = function () { AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) { $scope.regions = regions; $scope.securityGroup.regions = regions; ctrl.updateName(); ctrl.regionUpdated(); }); }; this.regionUpdated = function () { ctrl.vnetUpdated(); }; this.vnetUpdated = function () { const account = $scope.securityGroup.credentials; const region = $scope.securityGroup.region; $scope.securityGroup.selectedVnet = null; $scope.securityGroup.vnet = null; $scope.securityGroup.vnetResourceGroup = null; ctrl.selectedVnets = []; NetworkReader.listNetworks().then(function (vnets) { if (vnets.azure) { vnets.azure.forEach((vnet) => { if (vnet.account === account && vnet.region === region) { ctrl.selectedVnets.push(vnet); } }); } }); ctrl.subnetUpdated(); }; this.subnetUpdated = function () { $scope.securityGroup.selectedSubnet = null; $scope.securityGroup.subnet = null; ctrl.selectedSubnets = []; }; this.selectedVnetChanged = function (item) { $scope.securityGroup.vnet = item.name; $scope.securityGroup.vnetResourceGroup = item.resourceGroup; $scope.securityGroup.selectedSubnet = null; $scope.securityGroup.subnet = null; ctrl.selectedSubnets = []; if (item.subnets) { item.subnets.map(function (subnet) { ctrl.selectedSubnets.push(subnet); }); } }; ctrl.cancel = function () { $uibModalInstance.dismiss(); }; ctrl.updateName = function () { const securityGroup = $scope.securityGroup; let name = application.name; if (securityGroup.detail) { name += '-' + securityGroup.detail; } securityGroup.name = name; $scope.namePreview = name; }; ctrl.upsert = function () { $scope.taskMonitor.submit(function () { const params = { cloudProvider: 'azure', appName: application.name, region: $scope.securityGroup.region, vpcId: 'null', }; if ($scope.securityGroup.selectedVnet) { $scope.securityGroup.vnet = $scope.securityGroup.selectedVnet.name; $scope.securityGroup.vnetResourceGroup = $scope.securityGroup.selectedVnet.resourceGroup; } if ($scope.securityGroup.selectedSubnet) { $scope.securityGroup.subnet = $scope.securityGroup.selectedSubnet.name; } $scope.securityGroup.type = 'upsertSecurityGroup'; return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Create', params); }); }; ctrl.addRule = function (ruleset) { ruleset.push({ name: $scope.securityGroup.name + '-Rule' + ruleset.length, priority: ruleset.length == 0 ? 100 : 100 * (ruleset.length + 1), protocolUI: 'tcp', protocol: 'tcp', access: 'Allow', direction: 'InBound', sourceAddressPrefix: '*', sourceAddressPrefixes: [], sourcePortRange: '*', destinationAddressPrefix: '*', destinationPortRange: '*', destinationPortRanges: [], destPortRanges: '*', sourceIPCIDRRanges: '*', }); }; ctrl.portUpdated = function (ruleset, index) { if (!_.isEmpty(ruleset[index].destPortRanges)) { const ruleRanges = ruleset[index].destPortRanges.split(','); if (ruleRanges.length > 1) { ruleset[index].destinationPortRanges = []; ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v)); // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation. ruleset[index].destinationPortRange = null; } else { ruleset[index].destinationPortRange = ruleset[index].destPortRanges; // If there is a single port range then set null to the port array otherwise ARM template will fail in validation. ruleset[index].destinationPortRanges = []; } } }; ctrl.sourceIPCIDRUpdated = function (ruleset, index) { if (!_.isEmpty(ruleset[index].destPortRanges)) { const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(','); if (ruleRanges.length > 1) { ruleset[index].sourceAddressPrefixes = []; ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v)); // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation ruleset[index].sourceAddressPrefix = null; } else { ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges; // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation. ruleset[index].sourceAddressPrefixes = []; } } }; ctrl.protocolUpdated = function (ruleset, index) { ruleset[index].protocol = ruleset[index].protocolUI; }; ctrl.removeRule = function (ruleset, index) { ruleset.splice(index, 1); }; ctrl.moveUp = function (ruleset, index) { if (index === 0) return; swapRules(ruleset, index, index - 1); }; ctrl.moveDown = function (ruleset, index) { if (index === ruleset.length - 1) return; swapRules(ruleset, index, index + 1); }; function swapRules(ruleset, a, b) { const temp = ruleset[b]; const priorityA = ruleset[a].priority; const priorityB = ruleset[b].priority; //swap elements ruleset[b] = ruleset[a]; ruleset[a] = temp; //swap priorities ruleset[a].priority = priorityA; ruleset[b].priority = priorityB; } $scope.securityGroup.securityRules = []; }, ]);