From 775d8e5c4dedbf85d078cde6adfd5a08d580dcc1 Mon Sep 17 00:00:00 2001 From: neil-yechenwei Date: Mon, 8 Apr 2019 09:30:13 +0800 Subject: [PATCH 1/3] fix(provider/azure): Enable Azure Load Balancer from Azure VM Scale Set --- app/scripts/modules/azure/help/azure.help.ts | 2 ++ .../serverGroupCommandBuilder.service.js | 29 ++++++++++++++++ .../advancedSettingsSelector.directive.html | 9 +++++ .../ServerGroupLoadBalancers.controller.js | 34 ++++++++++++------- .../serverGroup/serverGroup.transformer.js | 1 + 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/app/scripts/modules/azure/help/azure.help.ts b/app/scripts/modules/azure/help/azure.help.ts index 84d3d099d4d..1abfa083d62 100644 --- a/app/scripts/modules/azure/help/azure.help.ts +++ b/app/scripts/modules/azure/help/azure.help.ts @@ -33,6 +33,8 @@ const helpContents: { [key: string]: string } = { 'azure.serverGroup.customTags': `Custom tags on Virtual Machine Scale Set. Allow ${ Utility.TAG_LIMITATION } tags at most.`, + 'azure.serverGroup.enableInboundNAT': + 'An Azure load balancer of the basic sku will be created with adding inbound NAT port-forwarding rules to facilitate loggin on VM instances. There is no charge for creating an Azure load balancer of the basic sku.', }; Object.keys(helpContents).forEach(key => HelpContentsRegistry.register(key, helpContents[key])); diff --git a/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js b/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js index 3b1678159d4..8e9e86e4ddd 100644 --- a/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js +++ b/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js @@ -50,6 +50,7 @@ module.exports = angular networkSettingsConfigured: false, securityGroupsConfigured: false, }, + enableInboundNAT: false, }; }); } @@ -91,6 +92,7 @@ module.exports = angular }, tags: [], instanceTags: serverGroup.instanceTags, + instanceType: serverGroup.sku.name, selectedProvider: 'azure', source: { account: serverGroup.account, @@ -107,8 +109,35 @@ module.exports = angular mode: mode, disableStrategySelection: true, }, + enableInboundNAT: serverGroup.enableInboundNAT, }; + if (typeof serverGroup.customScriptsSettings !== 'undefined') { + command.customScriptsSettings = {}; + command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute; + if ( + typeof serverGroup.customScriptsSettings.fileUris !== 'undefined' && + serverGroup.customScriptsSettings.fileUris != '' + ) { + if (Array.isArray(serverGroup.customScriptsSettings.fileUris)) { + command.customScriptsSettings.fileUris = serverGroup.customScriptsSettings.fileUris; + } else { + var fileUrisTemp = serverGroup.customScriptsSettings.fileUris; + if (fileUrisTemp.includes(',')) { + command.customScriptsSettings.fileUris = fileUrisTemp.split(','); + } else if (fileUrisTemp.includes(';')) { + command.customScriptsSettings.fileUris = fileUrisTemp.split(';'); + } else { + command.customScriptsSettings.fileUris = [fileUrisTemp]; + } + + command.customScriptsSettings.fileUris.forEach(function(v, index) { + command.customScriptsSettings.fileUris[index] = v.trim(); + }); + } + } + } + return $q.when(command); } diff --git a/app/scripts/modules/azure/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html b/app/scripts/modules/azure/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html index 1f029d00059..f3ae72f7622 100644 --- a/app/scripts/modules/azure/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html +++ b/app/scripts/modules/azure/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html @@ -45,5 +45,14 @@ /> +
+
+ +
+
+ Enable inbound NAT port-forwarding rules to connect to VM instances + +
+
diff --git a/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js b/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js index 920831316c0..454350af386 100644 --- a/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js +++ b/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js @@ -12,19 +12,14 @@ module.exports = angular function($scope, loadBalancerReader) { ModalWizard.markClean('load-balancers'); - if ($scope.command.credentials && $scope.command.region && $scope.command.loadBalancerName) { - $scope.command.viewState.networkSettingsConfigured = true; - } - - this.loadBalancerChanged = function(item) { - $scope.command.viewState.networkSettingsConfigured = true; - ModalWizard.markComplete('load-balancers'); - $scope.command.selectedVnetSubnets = []; - $scope.command.selectedSubnet = null; - InfrastructureCaches.clearCache('networks'); - + function loadVnetSubnets() { loadBalancerReader - .getLoadBalancerDetails('azure', $scope.command.credentials, $scope.command.region, item) + .getLoadBalancerDetails( + 'azure', + $scope.command.credentials, + $scope.command.region, + $scope.command.loadBalancerName, + ) .then(function(LBs) { if (LBs && LBs.length === 1) { var selectedLoadBalancer = LBs[0]; @@ -57,6 +52,21 @@ module.exports = angular }); } }); + } + + if ($scope.command.credentials && $scope.command.region && $scope.command.loadBalancerName) { + $scope.command.viewState.networkSettingsConfigured = true; + $scope.command.selectedVnetSubnets = []; + loadVnetSubnets(); + } + + this.loadBalancerChanged = function(item) { + $scope.command.viewState.networkSettingsConfigured = true; + ModalWizard.markComplete('load-balancers'); + $scope.command.selectedVnetSubnets = []; + $scope.command.selectedSubnet = null; + InfrastructureCaches.clearCache('networks'); + loadVnetSubnets(); }; }, ]); diff --git a/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js b/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js index 7015976742d..5a555cdd7e6 100644 --- a/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js +++ b/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js @@ -79,6 +79,7 @@ module.exports = angular }, zonesEnabled: command.zonesEnabled, zones: command.zonesEnabled ? command.zones : [], + enableInboundNAT: command.enableInboundNAT, }; if (typeof command.stack !== 'undefined') { From ff4a2f86e8f92ae0475101052e5b32b9b304634d Mon Sep 17 00:00:00 2001 From: neil-yechenwei Date: Tue, 9 Apr 2019 15:42:53 +0800 Subject: [PATCH 2/3] fix(provider/azure): Enable Azure Load Balancer from Azure VM Scale Set --- .../serverGroupCommandBuilder.service.js | 25 +++------- .../serverGroup/serverGroup.transformer.js | 47 ++++++++++--------- app/scripts/modules/azure/utility.ts | 2 +- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js b/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js index 8e9e86e4ddd..99801bb5570 100644 --- a/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js +++ b/app/scripts/modules/azure/serverGroup/configure/serverGroupCommandBuilder.service.js @@ -5,11 +5,15 @@ const angular = require('angular'); import { NameUtils } from '@spinnaker/core'; module.exports = angular - .module('spinnaker.azure.serverGroupCommandBuilder.service', [require('../../image/image.reader').name]) + .module('spinnaker.azure.serverGroupCommandBuilder.service', [ + require('../../image/image.reader').name, + require('../serverGroup.transformer').name, + ]) .factory('azureServerGroupCommandBuilder', [ '$q', 'azureImageReader', - function($q, azureImageReader) { + 'azureServerGroupTransformer', + function($q, azureImageReader, azureServerGroupTransformer) { function buildNewServerGroupCommand(application, defaults) { defaults = defaults || {}; @@ -119,22 +123,7 @@ module.exports = angular typeof serverGroup.customScriptsSettings.fileUris !== 'undefined' && serverGroup.customScriptsSettings.fileUris != '' ) { - if (Array.isArray(serverGroup.customScriptsSettings.fileUris)) { - command.customScriptsSettings.fileUris = serverGroup.customScriptsSettings.fileUris; - } else { - var fileUrisTemp = serverGroup.customScriptsSettings.fileUris; - if (fileUrisTemp.includes(',')) { - command.customScriptsSettings.fileUris = fileUrisTemp.split(','); - } else if (fileUrisTemp.includes(';')) { - command.customScriptsSettings.fileUris = fileUrisTemp.split(';'); - } else { - command.customScriptsSettings.fileUris = [fileUrisTemp]; - } - - command.customScriptsSettings.fileUris.forEach(function(v, index) { - command.customScriptsSettings.fileUris[index] = v.trim(); - }); - } + azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command); } } diff --git a/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js b/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js index 5a555cdd7e6..1e1021c363f 100644 --- a/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js +++ b/app/scripts/modules/azure/serverGroup/serverGroup.transformer.js @@ -9,6 +9,30 @@ module.exports = angular return serverGroup; } + function parseCustomScriptsSettings(command, configuration) { + /* + At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following + occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios + to assign the correct value to model. + */ + if (Array.isArray(command.customScriptsSettings.fileUris)) { + configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris; + } else { + var fileUrisTemp = command.customScriptsSettings.fileUris; + if (fileUrisTemp.includes(',')) { + configuration.customScriptsSettings.fileUris = fileUrisTemp.split(','); + } else if (fileUrisTemp.includes(';')) { + configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';'); + } else { + configuration.customScriptsSettings.fileUris = [fileUrisTemp]; + } + + configuration.customScriptsSettings.fileUris.forEach(function(v, index) { + configuration.customScriptsSettings.fileUris[index] = v.trim(); + }); + } + } + function convertServerGroupCommandToDeployConfiguration(command) { var tempImage; @@ -95,27 +119,7 @@ module.exports = angular typeof command.customScriptsSettings.fileUris !== 'undefined' && command.customScriptsSettings.fileUris != '' ) { - /* - At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following - occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios - to assign the correct value to model. - */ - if (Array.isArray(command.customScriptsSettings.fileUris)) { - configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris; - } else { - var fileUrisTemp = command.customScriptsSettings.fileUris; - if (fileUrisTemp.includes(',')) { - configuration.customScriptsSettings.fileUris = fileUrisTemp.split(','); - } else if (fileUrisTemp.includes(';')) { - configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';'); - } else { - configuration.customScriptsSettings.fileUris = [fileUrisTemp]; - } - - configuration.customScriptsSettings.fileUris.forEach(function(v, index) { - configuration.customScriptsSettings.fileUris[index] = v.trim(); - }); - } + parseCustomScriptsSettings(command, configuration); } } @@ -135,5 +139,6 @@ module.exports = angular return { convertServerGroupCommandToDeployConfiguration: convertServerGroupCommandToDeployConfiguration, normalizeServerGroup: normalizeServerGroup, + parseCustomScriptsSettings: parseCustomScriptsSettings, }; }); diff --git a/app/scripts/modules/azure/utility.ts b/app/scripts/modules/azure/utility.ts index 2787f40187d..8a61a8e1ee1 100644 --- a/app/scripts/modules/azure/utility.ts +++ b/app/scripts/modules/azure/utility.ts @@ -14,7 +14,7 @@ export enum TagError { } export default class Utility { - public static readonly TAG_LIMITATION: number = 12; + public static readonly TAG_LIMITATION: number = 8; public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512; public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256; public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\?/]/; From 3eac9c43ea27ff920c6607c579eafcb1834bbf1e Mon Sep 17 00:00:00 2001 From: neil-yechenwei Date: Tue, 9 Apr 2019 17:44:27 +0800 Subject: [PATCH 3/3] fix(provider/azure): Enable Azure Load Balancer from Azure VM Scale Set --- .../ServerGroupLoadBalancers.controller.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js b/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js index 454350af386..01aa646cbae 100644 --- a/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js +++ b/app/scripts/modules/azure/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js @@ -12,14 +12,9 @@ module.exports = angular function($scope, loadBalancerReader) { ModalWizard.markClean('load-balancers'); - function loadVnetSubnets() { + function loadVnetSubnets(item) { loadBalancerReader - .getLoadBalancerDetails( - 'azure', - $scope.command.credentials, - $scope.command.region, - $scope.command.loadBalancerName, - ) + .getLoadBalancerDetails('azure', $scope.command.credentials, $scope.command.region, item) .then(function(LBs) { if (LBs && LBs.length === 1) { var selectedLoadBalancer = LBs[0]; @@ -57,7 +52,7 @@ module.exports = angular if ($scope.command.credentials && $scope.command.region && $scope.command.loadBalancerName) { $scope.command.viewState.networkSettingsConfigured = true; $scope.command.selectedVnetSubnets = []; - loadVnetSubnets(); + loadVnetSubnets($scope.command.loadBalancerName); } this.loadBalancerChanged = function(item) { @@ -66,7 +61,7 @@ module.exports = angular $scope.command.selectedVnetSubnets = []; $scope.command.selectedSubnet = null; InfrastructureCaches.clearCache('networks'); - loadVnetSubnets(); + loadVnetSubnets(item); }; }, ]);