@spinnaker/azure 0.3.31 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utility.ts","../src/help/azure.help.ts","../src/image/image.reader.js","../src/instance/azureInstanceType.service.js","../src/instance/details/instance.details.controller.js","../src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx","../src/azure.settings.ts","../src/loadBalancer/loadBalancer.transformer.js","../src/loadBalancer/configure/createLoadBalancer.controller.js","../src/loadBalancer/details/loadBalancerDetail.controller.js","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/pipeline/stages/bake/azureBakeStage.js","../src/pipeline/stages/destroyAsg/azureDestroyAsgStage.js","../src/pipeline/stages/disableAsg/azureDisableAsgStage.js","../src/pipeline/stages/enableAsg/azureEnableAsgStage.js","../src/securityGroup/securityGroup.write.service.js","../src/securityGroup/configure/CreateSecurityGroupCtrl.js","../src/securityGroup/configure/EditSecurityGroupCtrl.js","../src/securityGroup/clone/cloneSecurityGroup.controller.js","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/serverGroup.transformer.js","../src/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.js","../src/serverGroup/configure/wizard/ServerGroupInstanceType.controller.js","../src/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.js","../src/serverGroup/configure/wizard/basicSettings/image.regional.filter.js","../src/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/capacity/capacitySelector.directive.js","../src/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.js","../src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.js","../src/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.js","../src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.js","../src/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js","../src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.js","../src/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.js","../src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.js","../src/serverGroup/configure/wizard/tags/tagsSelector.directive.js","../src/serverGroup/configure/wizard/zones/zoneSelector.directive.js","../src/serverGroup/configure/serverGroup.configure.azure.module.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.azure.controller.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/common/AzureModalFooter.tsx","../src/serverGroup/details/rollback/RollbackServerGroupModal.tsx","../src/serverGroup/details/serverGroupDetails.azure.controller.js","../src/serverGroup/details/serverGroup.details.module.js","../src/validation/applicationName.validator.js","../../../node_modules/style-inject/dist/style-inject.es.js","../src/azure.module.ts","../src/logo/logo_azure.png"],"sourcesContent":["export interface ITagResult {\n isValid: boolean;\n error: TagError | null;\n errorMessage?: string;\n}\n\nexport enum TagError {\n TAG_NUMBER_EXCEED,\n TAG_KEY_LENGTH_EXCEED,\n TAG_VALUE_LENGTH_EXCEED,\n TAG_KEY_INVALID_CHARACTER,\n TAG_VALUE_INVALID_CHARACTER,\n TAG_OBJECT_UNDEFINED,\n}\n\nexport interface IAzureLoadBalancer {\n type: string;\n description: string;\n}\n\nexport const AzureLoadBalancerTypes: IAzureLoadBalancer[] = [\n {\n type: 'Azure Load Balancer',\n description: '',\n },\n {\n type: 'Azure Application Gateway',\n description: '',\n },\n];\n\nexport default class Utility {\n public static readonly TAG_LIMITATION: number = 8;\n public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512;\n public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256;\n public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\\\?/]/;\n\n public static checkTags(tagsObject: { [s: string]: string }): ITagResult {\n if (!tagsObject) {\n return {\n isValid: false,\n error: TagError.TAG_OBJECT_UNDEFINED,\n errorMessage: 'instanceTags is not defined',\n };\n }\n const length: number = Object.keys(tagsObject).length;\n if (!(length >= 0 && length <= Utility.TAG_LIMITATION)) {\n return {\n isValid: false,\n error: TagError.TAG_NUMBER_EXCEED,\n errorMessage: `Number of tags exceeds the limit: ${Utility.TAG_LIMITATION}`,\n };\n }\n\n for (const [k, v] of Object.entries(tagsObject)) {\n if (k.length > Utility.TAG_KEY_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_LENGTH_EXCEED,\n errorMessage: `Length of Tag key: ${k} exceeds the limit: ${Utility.TAG_KEY_LENGTH_LIMITATION}`,\n };\n }\n if (v.length > Utility.TAG_VALUE_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_LENGTH_EXCEED,\n errorMessage: `Length of Tag value: ${v} exceeds the limit: ${Utility.TAG_VALUE_LENGTH_LIMITATION}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(k)) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag key: ${k}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(v)) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag value: ${v}`,\n };\n }\n }\n return {\n isValid: true,\n error: null,\n };\n }\n\n public static getLoadBalancerType(typeString: string): IAzureLoadBalancer | null {\n typeString = typeString.toLowerCase().split('_').join(' ');\n return AzureLoadBalancerTypes.find((lb: IAzureLoadBalancer) => lb.type.toLowerCase() === typeString) || null;\n }\n}\n","import { HelpContentsRegistry } from '@spinnaker/core';\nimport Utility from '../utility';\n\nconst helpContents: { [key: string]: string } = {\n 'azure.securityGroup.ingress.description': 'Friendly description of the rule you want to enable (limit 80 chars.)',\n 'azure.securityGroup.ingress.priority':\n \"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.\",\n 'azure.securityGroup.ingress.source':\n \"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.sourcePortRange':\n 'The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.destination':\n \"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.destinationPortRange':\n 'The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.direction': 'Specifies whether the rule is for inbound or outbound traffic.',\n 'azure.securityGroup.ingress.actions':\n 'To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.',\n 'azure.securityGroup.ingress.destPortRanges':\n 'Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.',\n 'azure.securityGroup.ingress.sourceIPCIDRRanges':\n 'Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24',\n 'azure.serverGroup.imageName': '(Required) <b>Image</b> is the deployable Azure Machine Image.',\n 'azure.serverGroup.stack':\n '(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'azure.serverGroup.detail':\n '(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n 'azure.serverGroup.scriptLocation':\n 'The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2',\n 'azure.serverGroup.commandToExecute':\n 'Command(s) to execute custom scripts provided during provisioning of an instance.',\n 'azure.serverGroup.customData': 'Script or metadata to be injected into each instances.',\n 'azure.serverGroup.customTags': `Custom tags on Virtual Machine Scale Set. Allow ${Utility.TAG_LIMITATION} tags at most.`,\n 'azure.serverGroup.enableInboundNAT':\n '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. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.',\n 'azure.serverGroup.lun':\n 'Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.',\n 'azure.serverGroup.diskSizeGB':\n 'Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB',\n 'azure.serverGroup.managedDisk.storageAccountType':\n 'You can choose between Azure managed disks types to support your workload or scenario.',\n 'azure.serverGroup.caching':\n 'Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.',\n 'azure.serverGroup.userAssignedIdentities':\n 'Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview',\n 'azure.loadBalancer.dnsName':\n 'If there is no custom DNS label specified, a default DNS name will be created. The default value will be \"GeneratedText.cloudapp.net\" for Azure Application Gateway or \"GeneratedText.[region].cloudapp.azure.com\" for Azure Load Balancer.',\n 'azure.loadBalancer.probes.probeInterval':\n 'Probe interval in seconds. This value is the time interval between two consecutive probes.',\n 'azure.loadBalancer.probes.timeout':\n 'Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.',\n 'azure.loadBalancer.probes.unhealthyThreshold':\n 'Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.',\n 'azure.loadBalancer.loadBalancingRules.idleTimeout':\n 'Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.',\n 'azure.loadBalancer.loadBalancingRules.sessionPersistence':\n 'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. \"None\" specifies that successive requests from the same client may be handled by any virtual machine. \"Client IP\" specifies that successive requests from the same client IP address will be handled by the same virtual machine. \"Client IP and protocol\" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nexport const AZURE_IMAGE_IMAGE_READER = 'spinnaker.azure.image.reader';\nexport const name = AZURE_IMAGE_IMAGE_READER; // for backwards compatibility\nmodule(AZURE_IMAGE_IMAGE_READER, []).factory('azureImageReader', function () {\n function findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .then(\n function (results) {\n return results;\n },\n function () {\n return [];\n },\n );\n }\n\n function getImage(amiName, region, credentials) {\n return REST('/images')\n .path(credentials, region, amiName)\n .query({ provider: 'azure' })\n .get()\n .then(\n function (results) {\n return results && results.length ? results[0] : null;\n },\n function () {\n return null;\n },\n );\n }\n\n return {\n findImages: findImages,\n getImage: getImage,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE = 'spinnaker.azure.instanceType.service';\nexport const name = AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE; // for backwards compatibility\nmodule(AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE, []).factory('azureInstanceTypeService', [\n '$q',\n function ($q) {\n const B = {\n type: 'B-series',\n description:\n 'The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.',\n instanceTypes: [\n {\n name: 'Standard_B1ms',\n label: 'Standard_B1ms',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 4,\n },\n },\n {\n name: 'Standard_B1s',\n label: 'Standard_B1s',\n cpu: 1,\n memory: 1,\n storage: {\n type: 'SSD',\n count: 2,\n size: 2,\n },\n },\n {\n name: 'Standard_B2ms',\n label: 'Standard_B2ms',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_B2s',\n label: 'Standard_B2s',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 8,\n },\n },\n {\n name: 'Standard_B4ms',\n label: 'Standard_B4ms',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_B8ms',\n label: 'Standard_B8ms',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_B1ls',\n label: 'Standard_B1ls',\n cpu: 1,\n memory: 0.5,\n storage: {\n type: 'SSD',\n count: 2,\n size: 1,\n },\n },\n ],\n };\n\n const DSV3 = {\n type: 'Dsv3-series',\n description:\n 'The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2s_v3',\n label: 'Standard_D2s_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_D4s_v3',\n label: 'Standard_D4s_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_D8s_v3',\n label: 'Standard_D8s_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_D16s_v3',\n label: 'Standard_D16s_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 128,\n },\n },\n {\n name: 'Standard_D32s_v3',\n label: 'Standard_D32s_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 256,\n },\n },\n {\n name: 'Standard_D64s_v3',\n label: 'Standard_D64s_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 512,\n },\n },\n ],\n };\n\n const DV3 = {\n type: 'Dv3-series',\n description:\n 'The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2_v3',\n label: 'Standard_D2_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D4_v3',\n label: 'Standard_D4_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D8_v3',\n label: 'Standard_D8_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D16_v3',\n label: 'Standard_D16_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D32_v3',\n label: 'Standard_D32_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 800,\n },\n },\n {\n name: 'Standard_D64_v3',\n label: 'Standard_D64_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 1600,\n },\n },\n ],\n };\n\n const DSV2 = {\n type: 'DSv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DS1_v2',\n label: 'Standard_DS1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 7,\n },\n },\n {\n name: 'Standard_DS2_v2',\n label: 'Standard_DS2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 14,\n },\n },\n {\n name: 'Standard_DS3_v2',\n label: 'Standard_DS3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 28,\n },\n },\n {\n name: 'Standard_DS4_v2',\n label: 'Standard_DS4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 56,\n },\n },\n {\n name: 'Standard_DS5_v2',\n label: 'Standard_DS5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 112,\n },\n },\n {\n name: 'Standard_DS11_v2',\n label: 'Standard_DS11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 28,\n },\n },\n {\n name: 'Standard_DS12_v2',\n label: 'Standard_DS12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 56,\n },\n },\n {\n name: 'Standard_DS13_v2',\n label: 'Standard_DS13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 112,\n },\n },\n {\n name: 'Standard_DS14_v2',\n label: 'Standard_DS14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 224,\n },\n },\n {\n name: 'Standard_DS15_v2',\n label: 'Standard_DS15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const DV2 = {\n type: 'Dv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_D1_v2',\n label: 'Standard_D1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D2_v2',\n label: 'Standard_D2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D3_v2',\n label: 'Standard_D3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D4_v2',\n label: 'Standard_D4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D5_v2',\n label: 'Standard_D5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D11_v2',\n label: 'Standard_D11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D12_v2',\n label: 'Standard_D12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D13_v2',\n label: 'Standard_D13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D14_v2',\n label: 'Standard_D14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D15_v2',\n label: 'Standard_D15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const AV2 = {\n type: 'Av2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_A1_v2',\n label: 'Standard_A1_v2',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 10,\n },\n },\n {\n name: 'Standard_A2m_v2',\n label: 'Standard_A2m_v2',\n cpu: 2,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A2_v2',\n label: 'Standard_A2_v2',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A4m_v2',\n label: 'Standard_A4m_v2',\n cpu: 4,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A4_v2',\n label: 'Standard_A4_v2',\n cpu: 4,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A8m_v2',\n label: 'Standard_A8m_v2',\n cpu: 8,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n {\n name: 'Standard_A8_v2',\n label: 'Standard_A8_v2',\n cpu: 8,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n ],\n };\n\n const DC = {\n type: 'DC-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DC2s',\n label: 'Standard_DC2s',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 2,\n size: 100,\n },\n },\n {\n name: 'Standard_DC4s',\n label: 'Standard_DC4s',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 200,\n },\n },\n ],\n };\n\n const FSV2 = {\n type: 'Fsv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F2s_v2',\n label: 'Standard_F2s_v2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F4s_v2',\n label: 'Standard_F4s_v2',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F8s_v2',\n label: 'Standard_F8s_v2',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F16s_v2',\n label: 'Standard_F16s_v2',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F32s_v2',\n label: 'Standard_F32s_v2',\n cpu: 32,\n memory: 64,\n storage: { type: 'SSD', count: 32, size: 256 },\n },\n {\n name: 'Standard_F64s_v2',\n label: 'Standard_F64s_v2',\n cpu: 64,\n memory: 128,\n storage: { type: 'SSD', count: 32, size: 512 },\n },\n {\n name: 'Standard_F72s_v2',\n label: 'Standard_F72s_v2',\n cpu: 72,\n memory: 144,\n storage: { type: 'SSD', count: 32, size: 576 },\n },\n ],\n };\n\n const FS = {\n type: 'Fs-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1s',\n label: 'Standard_F1s',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 4 },\n },\n {\n name: 'Standard_F2s',\n label: 'Standard_F2s',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 8 },\n },\n {\n name: 'Standard_F4s',\n label: 'Standard_F4s',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 16 },\n },\n {\n name: 'Standard_F8s',\n label: 'Standard_F8s',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 32 },\n },\n {\n name: 'Standard_F16s',\n label: 'Standard_F16s',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 64 },\n },\n ],\n };\n\n const F = {\n type: 'F-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1',\n label: 'Standard_F1',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F2',\n label: 'Standard_F2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F4',\n label: 'Standard_F4',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F8',\n label: 'Standard_F8',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F16',\n label: 'Standard_F16',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 256 },\n },\n ],\n };\n\n const categories = [\n {\n type: 'general',\n label: 'General Purpose',\n description:\n 'Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.',\n families: [B, DSV3, DV3, DSV2, DV2, AV2, DC],\n icon: 'hdd',\n },\n {\n type: 'compute',\n label: 'Compute Optimized',\n description:\n 'High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.',\n families: [FSV2, FS, F],\n icon: 'hdd',\n },\n {\n type: 'custom',\n label: 'Custom Type',\n description: 'Select the instance type below.',\n families: [],\n icon: 'asterisk',\n },\n ];\n\n function calculateStorage(type) {\n if (!type || !type.storage) {\n return 0;\n }\n return type.storage.count * type.storage.size;\n }\n\n function buildStats(category) {\n const stats = {\n cpu: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n memory: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n storage: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n families: [],\n };\n\n if (category.families && category.families.length) {\n category.families.forEach(function (family) {\n stats.families.push(family.type);\n const cpuMin = _.minBy(family.instanceTypes, 'cpu').cpu || Number.MAX_VALUE;\n const cpuMax = _.maxBy(family.instanceTypes, 'cpu').cpu || -Number.MAX_VALUE;\n const memoryMin = _.minBy(family.instanceTypes, 'memory').memory || Number.MAX_VALUE;\n const memoryMax = _.maxBy(family.instanceTypes, 'memory').memory || -Number.MAX_VALUE;\n const storageMin = calculateStorage(_.minBy(family.instanceTypes, calculateStorage)) || Number.MAX_VALUE;\n const storageMax = calculateStorage(_.maxBy(family.instanceTypes, calculateStorage)) || -Number.MAX_VALUE;\n\n stats.cpu.min = Math.min(stats.cpu.min, cpuMin);\n stats.cpu.max = Math.max(stats.cpu.max, cpuMax);\n stats.memory.min = Math.min(stats.memory.min, memoryMin);\n stats.memory.max = Math.max(stats.memory.max, memoryMax);\n stats.storage.min = Math.min(stats.storage.min, storageMin);\n stats.storage.max = Math.max(stats.storage.max, storageMax);\n });\n }\n\n return stats;\n }\n\n function getCategories() {\n categories.map(function (category) {\n for (const family of category.families) {\n for (const inst of family.instanceTypes) {\n if (inst.costFactor == undefined) inst.costFactor = 0;\n }\n }\n category.stats = buildStats(category);\n });\n return $q.when(categories);\n }\n\n const getAllTypesByRegion = function getAllTypesByRegion() {\n return getCategories();\n };\n\n function getAvailableTypesForRegions(locationToInstanceTypesMap, selectedLocations) {\n // This function is only ever called with one location.\n const [location] = selectedLocations;\n return locationToInstanceTypesMap[location];\n }\n\n return {\n getCategories: getCategories,\n getAvailableTypesForRegions: getAvailableTypesForRegions,\n getAllTypesByRegion: getAllTypesByRegion,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n} from '@spinnaker/core';\n\nexport const AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.azure.instance.detail.controller';\nexport const name = AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'azureInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n '$q',\n function ($scope, $state, $uibModal, instance, app, $q) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('azure', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Azure' || metric.state !== 'Unknown';\n });\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then(\n function (details) {\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n const discoveryMetric = _.find($scope.healthMetrics, function (metric) {\n return metric.type === 'Discovery';\n });\n if (discoveryMetric && discoveryMetric.vipAddress) {\n const vipList = discoveryMetric.vipAddress;\n $scope.instance.vipAddress = vipList.includes(',') ? vipList.split(',') : [vipList];\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n },\n function () {\n // When an instance is first starting up, we may not have the details cached in oort yet, but we still\n // want to let the user see what details we have\n $scope.state.loading = false;\n $state.go('^');\n },\n );\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n this.canDeregisterFromLoadBalancer = function () {\n return $scope.instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n };\n\n this.canRegisterWithLoadBalancer = function () {\n const instance = $scope.instance;\n if (!instance.loadBalancers || !instance.loadBalancers.length) {\n return false;\n }\n const outOfService = instance.health.some(function (health) {\n return health.type === 'LoadBalancer' && health.state === 'OutOfService';\n });\n const hasLoadBalancerHealth = instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n return outOfService || !hasLoadBalancerHealth;\n };\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const discoveryHealth = instance.health.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rebootInstance = function rebootInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Rebooting ' + instance.instanceId,\n };\n\n const submitMethod = function () {\n return InstanceWriter.rebootInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really reboot ' + instance.instanceId + '?',\n buttonText: 'Reboot ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.registerInstanceWithLoadBalancer = function registerInstanceWithLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Registering ' + instance.instanceId + ' with ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.registerInstanceWithLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really register ' + instance.instanceId + ' with ' + loadBalancerNames + '?',\n buttonText: 'Register ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.deregisterInstanceFromLoadBalancer = function deregisterInstanceFromLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Deregistering ' + instance.instanceId + ' from ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.deregisterInstanceFromLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really deregister ' + instance.instanceId + ' from ' + loadBalancerNames + '?',\n buttonText: 'Deregister ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n return instance.health.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import React from 'react';\nimport { Button, Modal } from 'react-bootstrap';\n\nimport type { ILoadBalancerModalProps } from '@spinnaker/core';\nimport { CloudProviderRegistry, ModalClose, ModalInjector, noop, ReactModal } from '@spinnaker/core';\n\nimport type { IAzureLoadBalancer } from '../../utility';\nimport { AzureLoadBalancerTypes } from '../../utility';\n\nexport interface IAzureLoadBalancerChoiceModalState {\n choices: IAzureLoadBalancer[];\n selectedChoice: IAzureLoadBalancer;\n}\n\nexport class AzureLoadBalancerChoiceModal extends React.Component<\n ILoadBalancerModalProps,\n IAzureLoadBalancerChoiceModalState\n> {\n public static defaultProps: Partial<ILoadBalancerModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: ILoadBalancerModalProps): Promise<void> {\n return ReactModal.show(AzureLoadBalancerChoiceModal, {\n ...props,\n className: 'create-pipeline-modal-overflow-visible',\n });\n }\n\n constructor(props: ILoadBalancerModalProps) {\n super(props);\n this.state = {\n choices: AzureLoadBalancerTypes,\n selectedChoice: AzureLoadBalancerTypes[0],\n };\n }\n\n public choiceSelected(choice: IAzureLoadBalancer): void {\n this.setState({ selectedChoice: choice });\n }\n\n private choose = (): void => {\n this.close();\n const provider: any = CloudProviderRegistry.getValue('azure', 'loadBalancer');\n ModalInjector.modalService\n .open({\n templateUrl: provider.createLoadBalancerTemplateUrl,\n windowClass: 'modal-z-index',\n controller: `${provider.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.props.app,\n loadBalancer: (): any => null,\n isNew: () => true,\n forPipelineConfig: () => false,\n loadBalancerType: () => this.state.selectedChoice,\n },\n })\n .result.catch(() => {});\n };\n\n public close = (reason?: any): void => {\n this.props.dismissModal(reason);\n };\n\n public render() {\n const { choices, selectedChoice } = this.state;\n\n return (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Select Type of Load Balancer</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"modal-body\">\n <div className=\"card-choices\">\n {choices.map((choice) => (\n <div\n key={choice.type}\n className={`card ${selectedChoice === choice ? 'active' : ''}`}\n onClick={() => this.choiceSelected(choice)}\n >\n <h3 className=\"load-balancer-label\">{choice.type}</h3>\n <div>{choice.description}</div>\n </div>\n ))}\n </div>\n <div className=\"load-balancer-description\" />\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={this.choose}>\n Configure Load Balancer <span className=\"glyphicon glyphicon-chevron-right\" />\n </Button>\n </Modal.Footer>\n </>\n );\n }\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IAzureProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const AzureProviderSettings: IAzureProviderSettings = (SETTINGS.providers.azure as IAzureProviderSettings) || {\n defaults: {},\n};\nif (AzureProviderSettings) {\n AzureProviderSettings.resetToOriginal = SETTINGS.resetProvider('azure');\n}\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AzureProviderSettings } from '../azure.settings';\n\nexport const AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER = 'spinnaker.azure.loadBalancer.transformer';\nexport const name = AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER, []).factory('azureLoadBalancerTransformer', [\n '$q',\n function ($q) {\n function normalizeLoadBalancer(loadBalancer) {\n loadBalancer.serverGroups.forEach(function (serverGroup) {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {\n return { id: instanceId };\n });\n serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);\n } else {\n serverGroup.detachedInstances = [];\n }\n });\n const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();\n return $q.resolve(loadBalancer);\n }\n\n function convertLoadBalancerForEditing(loadBalancer) {\n const toEdit = {\n region: loadBalancer.region,\n credentials: loadBalancer.account,\n name: loadBalancer.name,\n stack: loadBalancer.stack,\n detail: loadBalancer.detail,\n vnet: loadBalancer.vnet,\n subnet: loadBalancer.subnet,\n probes: [],\n loadBalancingRules: [],\n };\n\n if (loadBalancer.elb) {\n const elb = loadBalancer.elb;\n\n toEdit.securityGroups = elb.securityGroups;\n toEdit.vnet = elb.vnet;\n\n if (elb.loadBalancingRules) {\n toEdit.loadBalancingRules = elb.loadBalancingRules;\n }\n\n toEdit.probes = elb.probes;\n if (elb.dnsName && elb.dnsName !== 'dns-not-found') {\n toEdit.dnsName = elb.dnsName.split('.')[0];\n }\n }\n return toEdit;\n }\n\n function constructNewLoadBalancerTemplate(application) {\n const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;\n const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;\n return {\n stack: '',\n detail: 'frontend',\n credentials: defaultCredentials,\n region: defaultRegion,\n cloudProvider: 'azure',\n vnet: null,\n subnet: null,\n probes: [\n {\n probeName: '',\n probeProtocol: 'HTTP',\n probePort: '80',\n probePath: '/',\n probeInterval: 30,\n unhealthyThreshold: 8,\n timeout: 120,\n },\n ],\n securityGroups: [],\n loadBalancingRules: [\n {\n ruleName: '',\n protocol: 'HTTP',\n externalPort: 80,\n backendPort: 80,\n probeName: '',\n persistence: 'None',\n idleTimeout: 4,\n },\n ],\n sku: 'Standard_v2',\n };\n }\n\n return {\n normalizeLoadBalancer: normalizeLoadBalancer,\n convertLoadBalancerForEditing: convertLoadBalancerForEditing,\n constructNewLoadBalancerTemplate: constructNewLoadBalancerTemplate,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, LoadBalancerWriter, NameUtils, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from '../loadBalancer.transformer';\n\nexport const AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER =\n 'spinnaker.azure.loadBalancer.create.controller';\nexport const name = AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n]).controller('azureCreateLoadBalancerCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n 'azureLoadBalancerTransformer',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'loadBalancerType',\n function (\n $scope,\n $uibModalInstance,\n $state,\n azureLoadBalancerTransformer,\n application,\n loadBalancer,\n isNew,\n loadBalancerType,\n ) {\n const ctrl = this;\n\n $scope.regions = [];\n\n $scope.pages = {\n location: require('./createLoadBalancerProperties.html'),\n listeners: require('./listeners.html'),\n healthCheck: require('./healthCheck.html'),\n advancedSettings: require('./advancedSettings.html'),\n };\n\n $scope.isNew = isNew;\n $scope.loadBalancerType = loadBalancerType.type;\n $scope.isALB = loadBalancerType.type === 'Azure Load Balancer';\n\n $scope.state = {\n accountsLoaded: false,\n submitting: false,\n };\n\n $scope.validSkus = ['Standard_v2', 'Standard_Small'];\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.loadBalancer.name,\n accountId: $scope.loadBalancer.credentials,\n region: $scope.loadBalancer.region,\n provider: 'azure',\n };\n\n if (!$state.includes('**.loadBalancerDetails')) {\n $state.go('.loadBalancerDetails', newStateParams);\n } else {\n $state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.loadBalancers.refresh();\n application.loadBalancers.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: (isNew ? 'Creating ' : 'Updating ') + 'your load balancer',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function initializeCreateMode() {\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accountsLoaded = true;\n ctrl.accountUpdated();\n });\n }\n\n function initializeController() {\n if (loadBalancer) {\n $scope.loadBalancer = azureLoadBalancerTransformer.convertLoadBalancerForEditing(loadBalancer);\n if (isNew) {\n const nameParts = NameUtils.parseLoadBalancerName($scope.loadBalancer.name);\n $scope.loadBalancer.stack = nameParts.stack;\n $scope.loadBalancer.detail = nameParts.freeFormDetails;\n delete $scope.loadBalancer.name;\n }\n } else {\n $scope.loadBalancer = azureLoadBalancerTransformer.constructNewLoadBalancerTemplate(application);\n }\n if (isNew) {\n updateLoadBalancerNames();\n initializeCreateMode();\n }\n }\n\n function updateLoadBalancerNames() {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n\n const accountLoadBalancersByRegion = {};\n application\n .getDataSource('loadBalancers')\n .refresh(true)\n .then(() => {\n application.getDataSource('loadBalancers').data.forEach((loadBalancer) => {\n if (loadBalancer.account === account) {\n accountLoadBalancersByRegion[loadBalancer.region] =\n accountLoadBalancersByRegion[loadBalancer.region] || [];\n accountLoadBalancersByRegion[loadBalancer.region].push(loadBalancer.name);\n }\n });\n\n $scope.existingLoadBalancerNames = accountLoadBalancersByRegion[region] || [];\n });\n }\n\n initializeController();\n\n this.requiresHealthCheckPath = function () {\n return (\n $scope.loadBalancer.probes[0].probeProtocol && $scope.loadBalancer.probes[0].probeProtocol.indexOf('HTTP') === 0\n );\n };\n\n this.updateName = function () {\n $scope.loadBalancer.name = this.getName();\n };\n\n this.getName = function () {\n const elb = $scope.loadBalancer;\n const elbName = [application.name, elb.stack || '', elb.detail || ''].join('-');\n return _.trimEnd(elbName, '-');\n };\n\n this.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.loadBalancer.credentials).then(function (regions) {\n $scope.regions = regions;\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n updateLoadBalancerNames();\n ctrl.updateName();\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n $scope.loadBalancer.selectedVnet = null;\n $scope.loadBalancer.vnet = null;\n $scope.loadBalancer.vnetResourceGroup = null;\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.loadBalancer.vnet = item.name;\n $scope.loadBalancer.vnetResourceGroup = item.resourceGroup;\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n if (device && device.type !== 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n ctrl.selectedSubnets.push(subnet);\n }\n });\n }\n };\n\n this.removeListener = function (index) {\n $scope.loadBalancer.loadBalancingRules.splice(index, 1);\n };\n\n this.addListener = function () {\n $scope.loadBalancer.loadBalancingRules.push({ protocol: 'HTTP' });\n };\n\n this.submit = function () {\n const descriptor = isNew ? 'Create' : 'Update';\n\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n clusterName: $scope.loadBalancer.clusterName,\n resourceGroupName: $scope.loadBalancer.clusterName,\n loadBalancerName: $scope.loadBalancer.name,\n };\n\n if ($scope.loadBalancer.selectedVnet) {\n $scope.loadBalancer.vnet = $scope.loadBalancer.selectedVnet.name;\n $scope.loadBalancer.vnetResourceGroup = $scope.loadBalancer.selectedVnet.resourceGroup;\n }\n\n if ($scope.loadBalancer.selectedSubnet) {\n $scope.loadBalancer.subnet = $scope.loadBalancer.selectedSubnet.name;\n }\n\n const name = $scope.loadBalancer.clusterName || $scope.loadBalancer.name;\n const probeName = name + '-probe';\n const ruleNameBase = name + '-rule';\n $scope.loadBalancer.type = 'upsertLoadBalancer';\n $scope.loadBalancer.loadBalancerType = $scope.loadBalancerType;\n if (!$scope.loadBalancer.vnet && !$scope.loadBalancer.subnetType) {\n $scope.loadBalancer.securityGroups = null;\n }\n\n $scope.loadBalancer.probes[0].probeName = probeName;\n\n $scope.loadBalancer.loadBalancingRules.forEach((rule, index) => {\n rule.ruleName = ruleNameBase + index;\n rule.probeName = probeName;\n });\n\n if ($scope.loadBalancer.probes[0].probeProtocol === 'TCP') {\n $scope.loadBalancer.probes[0].probePath = undefined;\n }\n\n return LoadBalancerWriter.upsertLoadBalancer($scope.loadBalancer, application, descriptor, params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n LOAD_BALANCER_READ_SERVICE,\n LoadBalancerWriter,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER =\n 'spinnaker.azure.loadBalancer.details.controller';\nexport const name = AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER, [\n ANGULAR_UI_BOOTSTRAP,\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n LOAD_BALANCER_READ_SERVICE,\n ])\n .controller('azureLoadBalancerDetailsCtrl', [\n '$scope',\n '$state',\n '$exceptionHandler',\n '$uibModal',\n 'loadBalancer',\n 'app',\n 'securityGroupReader',\n 'loadBalancerReader',\n '$q',\n function (\n $scope,\n $state,\n $exceptionHandler,\n $uibModal,\n loadBalancer,\n app,\n securityGroupReader,\n loadBalancerReader,\n $q,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n function extractLoadBalancer() {\n $scope.loadBalancer = app.loadBalancers.data.filter(function (test) {\n return (\n test.name === loadBalancer.name &&\n test.region === loadBalancer.region &&\n test.account === loadBalancer.accountId\n );\n })[0];\n\n if ($scope.loadBalancer) {\n const detailsLoader = loadBalancerReader.getLoadBalancerDetails(\n $scope.loadBalancer.provider,\n loadBalancer.accountId,\n loadBalancer.region,\n loadBalancer.name,\n );\n\n return detailsLoader.then(function (details) {\n $scope.state.loading = false;\n const securityGroups = [];\n\n const filtered = details.filter(function (test) {\n return test.name === loadBalancer.name;\n });\n\n if (filtered.length) {\n $scope.loadBalancer.elb = filtered[0];\n\n $scope.loadBalancer.account = loadBalancer.accountId;\n\n if ($scope.loadBalancer.elb.securityGroups) {\n $scope.loadBalancer.elb.securityGroups.forEach(function (securityGroupId) {\n const match = securityGroupReader.getApplicationSecurityGroup(\n app,\n loadBalancer.accountId,\n loadBalancer.region,\n securityGroupId,\n );\n if (match) {\n securityGroups.push(match);\n }\n });\n $scope.securityGroups = _.sortBy(securityGroups, 'name');\n }\n\n if ($scope.loadBalancer.loadBalancerType && $scope.loadBalancer.loadBalancerType.includes('_')) {\n const type = $scope.loadBalancer.loadBalancerType;\n $scope.loadBalancer.loadBalancerType = type\n .split('_')\n .map((s) => {\n const ss = s.toLowerCase();\n return ss.substring(0, 1).toUpperCase() + ss.substring(1);\n })\n .join(' ');\n }\n }\n });\n }\n if (!$scope.loadBalancer) {\n $state.go('^');\n }\n\n return $q.when(null);\n }\n\n app\n .ready()\n .then(extractLoadBalancer)\n .then(() => {\n // If the user navigates away from the view before the initial extractLoadBalancer call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.onRefresh($scope, extractLoadBalancer);\n }\n });\n\n this.editLoadBalancer = function editLoadBalancer() {\n $uibModal.open({\n templateUrl: require('../configure/editLoadBalancer.html'),\n controller: 'azureCreateLoadBalancerCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: function () {\n return app;\n },\n loadBalancer: function () {\n return angular.copy($scope.loadBalancer);\n },\n isNew: function () {\n return false;\n },\n loadBalancerType: function () {\n return { type: $scope.loadBalancer.loadBalancerType };\n },\n },\n });\n };\n\n this.deleteLoadBalancer = function deleteLoadBalancer() {\n if ($scope.loadBalancer.instances && $scope.loadBalancer.instances.length) {\n return;\n }\n\n const taskMonitor = {\n application: app,\n title: 'Deleting ' + loadBalancer.name,\n };\n\n const command = {\n cloudProvider: 'azure',\n loadBalancerName: $scope.loadBalancer.name,\n loadBalancerType: $scope.loadBalancer.loadBalancerType,\n credentials: $scope.loadBalancer.account,\n region: loadBalancer.region,\n appName: app.name,\n };\n\n const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, app);\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + loadBalancer.name + '?',\n buttonText: 'Delete ' + loadBalancer.name,\n account: loadBalancer.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { SETTINGS } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.azure.pipeline.stage.bake.executionDetails.controller';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'azureBakeExecutionDetailsCtrl',\n [\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($scope, $stateParams, executionDetailsSectionService, $interpolate) {\n $scope.configSections = ['bakeConfig', 'taskStatus'];\n\n const initialized = () => {\n $scope.detailsSection = $stateParams.details;\n $scope.provider = $scope.stage.context.cloudProviderType || 'azure';\n $scope.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' &&\n SETTINGS.feature.roscoSelector($scope.stage.context));\n $scope.bakeryDetailUrl = $interpolate(\n $scope.roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl,\n );\n };\n\n const initialize = () => executionDetailsSectionService.synchronizeSection($scope.configSections, initialized);\n\n initialize();\n\n $scope.$on('$stateChangeSuccess', initialize);\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n PipelineTemplates,\n Registry,\n SETTINGS,\n} from '@spinnaker/core';\n\nimport { AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE = 'spinnaker.azure.pipeline.stage.bakeStage';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE, [AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'azure',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'package' },\n { type: 'requiredField', fieldName: 'regions' },\n {\n type: 'upstreamVersionProvided',\n checkParentTriggers: true,\n getMessage: (labels) =>\n 'Bake stages should always have a stage or trigger preceding them that provides version information: ' +\n '<ul>' +\n labels.map((label) => `<li>${label}</li>`).join('') +\n '</ul>' +\n 'Otherwise, Spinnaker will bake and deploy the most-recently built package.',\n },\n ],\n restartable: true,\n });\n })\n .controller('azureBakeStageCtrl', [\n '$scope',\n '$q',\n '$uibModal',\n function ($scope, $q, $uibModal) {\n $scope.stage.extendedAttributes = $scope.stage.extendedAttributes || {};\n $scope.stage.regions = $scope.stage.regions || [];\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n $scope.viewState = {\n loading: true,\n };\n\n function initialize() {\n $q.all([\n BakeryReader.getRegions('azure'),\n BakeryReader.getBaseOsOptions('azure'),\n BakeryReader.getBaseLabelOptions(),\n ]).then(function ([regions, baseOsOptions, baseLabelOptions]) {\n $scope.regions = regions;\n if ($scope.regions.length === 1) {\n $scope.stage.region = $scope.regions[0];\n } else if (!$scope.regions.includes($scope.stage.region)) {\n delete $scope.stage.region;\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n $scope.baseOsOptions = baseOsOptions.baseImages;\n if ($scope.baseOsOptions.length) {\n $scope.stage.osType = baseOsOptions.baseImages[0].osType;\n }\n\n $scope.baseLabelOptions = baseLabelOptions;\n\n if (!$scope.stage.baseOs && $scope.baseOsOptions && $scope.baseOsOptions.length) {\n $scope.stage.baseOs = $scope.baseOsOptions[0].id;\n }\n\n if (!$scope.stage.baseLabel && $scope.baseLabelOptions && $scope.baseLabelOptions.length) {\n $scope.stage.baseLabel = $scope.baseLabelOptions[0];\n }\n $scope.viewState.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector($scope.stage));\n $scope.showAdvancedOptions = showAdvanced();\n $scope.viewState.loading = false;\n });\n }\n\n this.baseOsChanged = () => {\n const selectedOption = _.find($scope.baseOsOptions, { id: $scope.stage.baseOs });\n $scope.stage.osType = selectedOption.osType;\n };\n\n function stageUpdated() {\n deleteEmptyProperties();\n // Since the selector computes using stage as an input, it needs to be able to recompute roscoMode on updates\n if (typeof SETTINGS.feature.roscoSelector === 'function') {\n $scope.viewState.roscoMode = SETTINGS.feature.roscoSelector($scope.stage);\n }\n }\n\n function showAdvanced() {\n const stg = $scope.stage;\n return !!(\n stg.templateFileName ||\n (stg.extendedAttributes && _.size(stg.extendedAttributes) > 0) ||\n stg.varFileName\n );\n }\n\n function deleteEmptyProperties() {\n _.forOwn($scope.stage, function (val, key) {\n if (val === '') {\n delete $scope.stage[key];\n }\n });\n }\n\n this.addExtendedAttribute = function () {\n if (!$scope.stage.extendedAttributes) {\n $scope.stage.extendedAttributes = {};\n }\n $uibModal\n .open({\n templateUrl: PipelineTemplates.addExtendedAttributes,\n controller: 'bakeStageAddExtendedAttributeController',\n controllerAs: 'addExtendedAttribute',\n resolve: {\n extendedAttribute: function () {\n return {\n key: '',\n value: '',\n };\n },\n },\n })\n .result.then(function (extendedAttribute) {\n $scope.stage.extendedAttributes[extendedAttribute.key] = extendedAttribute.value;\n })\n .catch(() => {});\n };\n\n this.removeExtendedAttribute = function (key) {\n delete $scope.stage.extendedAttributes[key];\n };\n\n this.showTemplateFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.templateFileName;\n };\n\n this.showExtendedAttributes = function () {\n return (\n $scope.viewState.roscoMode || ($scope.stage.extendedAttributes && _.size($scope.stage.extendedAttributes) > 0)\n );\n };\n\n this.showVarFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.varFileName;\n };\n\n $scope.$watch('stage', stageUpdated, true);\n\n initialize();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE = 'spinnaker.azure.pipeline.stage.destroyAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n cloudProvider: 'azure',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getAccountDetails(stage.credentials).then(function (details) {\n stage.regions = [details.org];\n // stage.regions = ['eastus', 'westus'];\n });\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n\n if (stage.credentials) {\n ctrl.accountUpdated();\n }\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.disableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./disableAsgStage.html'),\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew && $scope.application.attributes.platformHealthOnly) {\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.enableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew) {\n // bypass the health check for now; will change this later to ['azureService'] and we will also add back the check for $scope.application.attributes.platformHealthOnly\n stage.interestingHealthProviderNames = [];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { FirewallLabels, InfrastructureCaches, TaskExecutor } from '@spinnaker/core';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE = 'spinnaker.azure.securityGroup.write.service';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE, [UIROUTER_ANGULARJS]).factory(\n 'azureSecurityGroupWriter',\n function () {\n function upsertSecurityGroup(securityGroup, application, descriptor, params = {}) {\n params.securityGroupName = securityGroup.name;\n\n // We want to extend params with all attributes from securityGroup, but only if they don't already exist.\n _.assignWith(params, securityGroup, function (value, other) {\n return _.isUndefined(value) ? other : value;\n });\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `${descriptor} ${FirewallLabels.get('Firewall')}: ${name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n function deleteSecurityGroup(securityGroup, application, params = {}) {\n params.type = 'deleteSecurityGroup';\n params.securityGroupName = securityGroup.name;\n params.regions = [securityGroup.region];\n params.credentials = securityGroup.accountId;\n //params.cloudProvider = securityGroup.providerType;\n params.appName = application.name;\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `Delete ${FirewallLabels.get('Firewalls')}: ${securityGroup.name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n return {\n deleteSecurityGroup: deleteSecurityGroup,\n upsertSecurityGroup: upsertSecurityGroup,\n };\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL = 'spinnaker.azure.securityGroup.create.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureCreateSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n '$controller',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function ($scope, $uibModalInstance, $state, $controller, application, securityGroup, azureSecurityGroupWriter) {\n $scope.pages = {\n location: require('./createSecurityGroupProperties.html'),\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n $scope.regions = [];\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n const ctrl = this;\n $scope.isNew = true;\n $scope.state = {\n submitting: false,\n infiniteScroll: {\n numToAdd: 20,\n currentItems: 20,\n },\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addMoreItems = function () {\n $scope.state.infiniteScroll.currentItems += $scope.state.infiniteScroll.numToAdd;\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.regions[0],\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Creating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n $scope.securityGroup = securityGroup;\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.securityGroup.credentials;\n const region = $scope.securityGroup.region;\n $scope.securityGroup.selectedVnet = null;\n $scope.securityGroup.vnet = null;\n $scope.securityGroup.vnetResourceGroup = null;\n\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.securityGroup.vnet = item.name;\n $scope.securityGroup.vnetResourceGroup = item.resourceGroup;\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n ctrl.selectedSubnets.push(subnet);\n });\n }\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n vpcId: 'null',\n };\n\n if ($scope.securityGroup.selectedVnet) {\n $scope.securityGroup.vnet = $scope.securityGroup.selectedVnet.name;\n $scope.securityGroup.vnetResourceGroup = $scope.securityGroup.selectedVnet.resourceGroup;\n }\n\n if ($scope.securityGroup.selectedSubnet) {\n $scope.securityGroup.subnet = $scope.securityGroup.selectedSubnet.name;\n }\n\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Create', params);\n });\n };\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length == 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n ctrl.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n ctrl.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n ctrl.protocolUpdated = function (ruleset, index) {\n ruleset[index].protocol = ruleset[index].protocolUI;\n };\n\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.securityGroup.securityRules = [];\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n CACHE_INITIALIZER_SERVICE,\n FirewallLabels,\n InfrastructureCaches,\n SECURITY_GROUP_READER,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL =\n 'spinnaker.azure.securityGroup.azure.edit.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n CACHE_INITIALIZER_SERVICE,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureEditSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$exceptionHandler',\n '$state',\n 'securityGroupReader',\n 'cacheInitializer',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function (\n $scope,\n $uibModalInstance,\n $exceptionHandler,\n $state,\n securityGroupReader,\n cacheInitializer,\n application,\n securityGroup,\n azureSecurityGroupWriter,\n ) {\n $scope.pages = {\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n if (!_.isEmpty(rule.protocol)) {\n rule.protocolUI = rule.protocol.toLowerCase();\n }\n\n rule.destPortRanges = rule.destinationPortRangeModel;\n rule.sourceIPCIDRRanges = rule.sourceAddressPrefixModel;\n\n return rule;\n });\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n this.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n this.refreshSecurityGroups = function () {\n $scope.state.refreshingSecurityGroups = true;\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n initializeSecurityGroups().then(function () {\n $scope.state.refreshingSecurityGroups = false;\n });\n });\n };\n\n function initializeSecurityGroups() {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n const account = securityGroup.accountName;\n const region = securityGroup.region;\n const availableGroups = _.filter(securityGroups[account].azure[region], {\n /*vpcId: vpcId*/\n });\n $scope.availableSecurityGroups = _.map(availableGroups, 'name');\n });\n }\n\n this.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n this.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n this.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n this.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n this.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n this.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.taskMonitor.onTaskComplete = $uibModalInstance.dismiss;\n\n this.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: null,\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Update', params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from '../configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER = 'spinnaker.azure.securityGroup.clone.controller';\nexport const name = AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER, [\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n]).controller('azureCloneSecurityGroupController', [\n '$scope',\n '$uibModalInstance',\n '$controller',\n '$state',\n 'azureSecurityGroupWriter',\n 'securityGroup',\n 'application',\n function ($scope, $uibModalInstance, $controller, $state, azureSecurityGroupWriter, securityGroup, application) {\n const ctrl = this;\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n $scope.pages = {\n location: require('../configure/createSecurityGroupProperties.html'),\n ingress: require('../configure/createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n const temp = rule.destinationPortRange.split('-');\n rule.startPort = Number(temp[0]);\n rule.endPort = Number(temp[1]);\n return rule;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n });\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '7001-7001',\n startPort: 7001,\n endPort: 7001,\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n ctrl.portUpdated = function (ruleset, index) {\n ruleset[index].destinationPortRange = ruleset[index].startPort + '-' + ruleset[index].endPort;\n };\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: 'none',\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Clone', params);\n });\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { ConfirmationModalService, FirewallLabels, SECURITY_GROUP_READER } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER } from '../clone/cloneSecurityGroup.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.azure.securityGroup.azure.details.controller';\nexport const name = AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER,\n ])\n .controller('azureSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'azureSecurityGroupWriter',\n 'securityGroupReader',\n '$uibModal',\n function ($scope, $state, resolvedSecurityGroup, app, azureSecurityGroupWriter, securityGroupReader, $uibModal) {\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(\n function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n $scope.securityGroup = details;\n }\n },\n function () {\n fourOhFour();\n },\n );\n }\n\n function fourOhFour() {\n $state.go('^');\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n this.editInboundRules = function editInboundRules() {\n $uibModal.open({\n templateUrl: require('../configure/editSecurityGroup.html'),\n controller: 'azureEditSecurityGroupCtrl as ctrl',\n resolve: {\n securityGroup: function () {\n return angular.copy($scope.securityGroup);\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.cloneSecurityGroup = function cloneSecurityGroup() {\n $uibModal.open({\n templateUrl: require('../clone/cloneSecurityGroup.html'),\n controller: 'azureCloneSecurityGroupController as ctrl',\n resolve: {\n securityGroup: function () {\n const securityGroup = angular.copy($scope.securityGroup);\n if (securityGroup.region) {\n securityGroup.regions = [securityGroup.region];\n }\n return securityGroup;\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.deleteSecurityGroup = function deleteSecurityGroup() {\n const taskMonitor = {\n application: application,\n title: 'Deleting ' + securityGroup.name,\n };\n\n const submitMethod = function () {\n $scope.securityGroup.type = 'deleteSecurityGroup';\n return azureSecurityGroupWriter.deleteSecurityGroup(securityGroup, application, {\n cloudProvider: 'azure',\n vpcId: $scope.securityGroup.vpcId,\n });\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + securityGroup.name + '?',\n buttonText: 'Delete ' + securityGroup.name,\n account: securityGroup.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_READER = 'spinnaker.azure.securityGroup.reader';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_READER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_READER, []).factory('azureSecurityGroupReader', function () {\n function resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n //hack to get around securityGroupId not matching id in indexedSecurityGroups.\n const temp = securityGroupId.split('/');\n return indexedSecurityGroups[container.account][container.region][temp[temp.length - 1]];\n }\n\n return {\n resolveIndexedSecurityGroup: resolveIndexedSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.azure.securityGroup.transformer';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('azureSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.azure.serverGroup.transformer';\nexport const name = AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('azureServerGroupTransformer', function () {\n function normalizeServerGroup(serverGroup) {\n return serverGroup;\n }\n\n function parseCustomScriptsSettings(command, configuration) {\n /*\n At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following\n occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios\n to assign the correct value to model.\n */\n if (Array.isArray(command.customScriptsSettings.fileUris)) {\n configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris;\n } else {\n const fileUrisTemp = command.customScriptsSettings.fileUris;\n if (fileUrisTemp.includes(',')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(',');\n } else if (fileUrisTemp.includes(';')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';');\n } else {\n configuration.customScriptsSettings.fileUris = [fileUrisTemp];\n }\n\n configuration.customScriptsSettings.fileUris.forEach(function (v, index) {\n configuration.customScriptsSettings.fileUris[index] = v.trim();\n });\n }\n }\n\n function convertServerGroupCommandToDeployConfiguration(command) {\n let tempImage;\n\n if (command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline') {\n tempImage = {\n imageName: '',\n isCustom: 'true',\n publisher: '',\n offer: '',\n sku: '',\n version: '',\n region: command.region,\n uri: '',\n ostype: '',\n };\n } else {\n tempImage = command.selectedImage;\n }\n\n const configuration = {\n name: command.application,\n cloudProvider: command.selectedProvider,\n application: command.application,\n stack: command.stack,\n strategy: command.strategy,\n rollback: {\n onFailure: command.rollback ? command.rollback.onFailure : null,\n },\n scaleDown: command.scaleDown,\n maxRemainingAsgs: command.maxRemainingAsgs,\n delayBeforeDisableSec: command.delayBeforeDisableSec,\n delayBeforeScaleDownSec: command.delayBeforeScaleDownSec,\n allowDeleteActive: command.strategy === 'redblack' ? true : null,\n allowScaleDownActive: command.strategy === 'redblack' ? true : null,\n detail: command.freeFormDetails,\n freeFormDetails: command.freeFormDetails,\n healthSettings: command.healthSettings,\n image: command.image,\n account: command.credentials,\n selectedProvider: 'azure',\n vnet: command.vnet,\n vnetResourceGroup: command.selectedVnet.resourceGroup,\n subnet: command.subnet,\n useSourceCapacity: false,\n capacity: {\n min: command.sku.capacity,\n max: command.sku.capacity,\n },\n credentials: command.credentials,\n region: command.region,\n securityGroupName: command.securityGroupName,\n loadBalancerName: command.loadBalancerName,\n loadBalancerType: command.loadBalancerType,\n user: '[anonymous]',\n upgradePolicy: 'Manual',\n type: 'createServerGroup',\n sku: {\n name: 'Standard_DS1_v2',\n tier: 'Standard',\n capacity: command.sku.capacity,\n },\n instanceTags: command.instanceTags,\n dataDisks: command.dataDisks,\n userAssignedIdentities: command.userAssignedIdentities,\n viewState: command.viewState,\n osConfig: {\n customData: command.osConfig ? command.osConfig.customData : null,\n },\n customScriptsSettings: {\n fileUris: null,\n commandToExecute: '',\n },\n zonesEnabled: command.zonesEnabled,\n zones: command.zonesEnabled ? command.zones : [],\n enableInboundNAT: command.enableInboundNAT,\n };\n\n if (command.image == null || command.image.isCustom == false) {\n configuration.image = tempImage;\n }\n\n if (typeof command.stack !== 'undefined') {\n configuration.name = configuration.name + '-' + command.stack;\n }\n if (typeof command.freeFormDetails !== 'undefined') {\n configuration.name = configuration.name + '-' + command.freeFormDetails;\n }\n\n if (typeof command.customScriptsSettings !== 'undefined') {\n configuration.customScriptsSettings.commandToExecute = command.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(command.customScriptsSettings.fileUris)) {\n parseCustomScriptsSettings(command, configuration);\n }\n }\n\n if (command.instanceType) {\n const vmsku = command.instanceType;\n configuration.instanceType = command.instanceType;\n configuration.sku.name = vmsku;\n configuration.sku.tier = vmsku.substring(0, vmsku.indexOf('_'));\n }\n\n // Default to an empty list of health provider names for now.\n configuration.interestingHealthProviderNames = [];\n\n return configuration;\n }\n\n return {\n convertServerGroupCommandToDeployConfiguration: convertServerGroupCommandToDeployConfiguration,\n normalizeServerGroup: normalizeServerGroup,\n parseCustomScriptsSettings: parseCustomScriptsSettings,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceArchetype.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER, []).controller(\n 'azureInstanceArchetypeCtrl',\n [\n '$scope',\n 'instanceTypeService',\n 'modalWizardService',\n function ($scope, instanceTypeService, modalWizardService) {\n const wizard = modalWizardService.getWizard();\n\n $scope.$watch('command.viewState.instanceProfile', function () {\n if (!$scope.command.viewState.instanceProfile || $scope.command.viewState.instanceProfile === 'custom') {\n wizard.excludePage('instance-type');\n } else {\n wizard.includePage('instance-type');\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n\n $scope.$watch('command.viewState.instanceType', function (newVal) {\n if (newVal) {\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceType.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER, []).controller('azureInstanceTypeCtrl', [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('instance-type');\n modalWizardService.getWizard().markClean('instance-type');\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.advancedSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupAdvancedSettingsCtrl',\n [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('advanced');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n modalWizardService.getWizard().markClean('advanced');\n } else {\n modalWizardService.getWizard().markDirty('advanced');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.advancedSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupAdvancedSettingsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./advancedSettingsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'adv',\n controller: 'azureServerGroupAdvancedSettingsSelectorCtrl',\n };\n })\n .controller('azureServerGroupAdvancedSettingsSelectorCtrl', function () {\n this.addDataDisk = () => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n this.command.dataDisks = newDataDisks.concat([\n {\n lun: 0,\n managedDisk: {\n storageAccountType: 'Standard_LRS',\n },\n diskSizeGB: 1,\n caching: 'None',\n createOption: 'Empty',\n },\n ]);\n };\n\n this.removeDataDisk = (index) => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n newDataDisks.splice(index, 1);\n this.command.dataDisks = newDataDisks;\n };\n });\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER =\n 'spinnaker.azure.serverGroup.configure.basicSettings.image.filter';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER, []).filter('regional', function () {\n return function (input, selectedRegion) {\n return _.filter(input, function (image) {\n return image.region === selectedRegion || image.region === null;\n });\n };\n});\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { IMAGE_READER, ModalWizard } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER } from './image.regional.filter';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.basicSettings';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER,\n IMAGE_READER,\n ])\n .controller('azureServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n 'imageReader',\n function ($scope, $controller, $uibModalStack, $state, imageReader) {\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basic-settings');\n ModalWizard.markComplete('basic-settings');\n } else {\n ModalWizard.markIncomplete('basic-settings');\n }\n });\n\n this.imageChanged = (image) => {\n $scope.command.imageName = image.imageName;\n $scope.command.selectedImage = image;\n ModalWizard.markClean('basic-settings');\n };\n\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n imageReader: imageReader,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n this.stackPattern = {\n test: function (stack) {\n const pattern = $scope.command.viewState.templatingEnabled ? /^([a-zA-Z0-9]*(\\${.+})*)*$/ : /^[a-zA-Z0-9]*$/;\n\n return pattern.test(stack);\n },\n };\n\n this.detailPattern = {\n test: function (detail) {\n const pattern = $scope.command.viewState.templatingEnabled\n ? /^([a-zA-Z0-9-]*(\\${.+})*)*$/\n : /^[a-zA-Z0-9-]*$/;\n\n return pattern.test(detail);\n },\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupCapacitySelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./capacitySelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'cap',\n controller: 'azureServerGroupCapacitySelectorCtrl',\n };\n })\n .controller('azureServerGroupCapacitySelectorCtrl', function () {});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.healthSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupHealthSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n if (typeof $scope.command.healthSettings === 'undefined') {\n $scope.command.healthSettings = {};\n }\n\n this.healthCheckProtocols = [\n { displayName: 'N/A', name: null },\n { displayName: 'HTTP', name: 'http' },\n { displayName: 'TCP', name: 'tcp' },\n ];\n\n this.requiresHealthCheckPath = function () {\n return $scope.command.healthSettings.protocol === 'http';\n };\n\n this.changeHealthCheckProtocol = function (newProtocol) {\n if (newProtocol == null) {\n $scope.command.healthSettings.protocol = null;\n $scope.command.healthSettings.port = null;\n $scope.command.healthSettings.requestPath = null;\n } else if (!this.requiresHealthCheckPath()) {\n $scope.command.healthSettings.requestPath = null;\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.healthSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupHealthSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./healthSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.imageSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupImageSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n this.clearImage = function () {\n if ($scope.command.image.isCustom == false) {\n $scope.command.image = { isCustom: false };\n } else {\n $scope.command.image.region = $scope.command.region;\n }\n };\n\n ModalWizard.markComplete('image-settings');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('image-settings');\n } else {\n ModalWizard.markDirty('image-settings');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.imageSettingsSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE, []).directive(\n 'azureServerGroupImageSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./imageSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { InfrastructureCaches, LOAD_BALANCER_READ_SERVICE, ModalWizard, NetworkReader } from '@spinnaker/core';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER, [\n LOAD_BALANCER_READ_SERVICE,\n]).controller('azureServerGroupLoadBalancersCtrl', [\n '$scope',\n 'loadBalancerReader',\n function ($scope, loadBalancerReader) {\n ModalWizard.markClean('load-balancers');\n\n function loadVnetSubnets(item, type) {\n loadBalancerReader\n .getLoadBalancerDetails('azure', $scope.command.credentials, $scope.command.region, item)\n .then(function (LBs) {\n if (!LBs || LBs.length === 0) {\n // load the subnet and vnets without a load balancer\n const attachedVnet = $scope.command.selectedVnet;\n const attachedSubnet = $scope.command.selectedSubnet;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n if (subnet.name === attachedSubnet) {\n $scope.command.selectedSubnet = attachedSubnet;\n }\n }\n });\n }\n });\n }\n });\n } else if (LBs && LBs.length === 1) {\n const selectedLoadBalancer = LBs[0];\n const attachedVnet = $scope.command.selectedVnet;\n $scope.command.selectedVnet = null;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n }\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region &&\n ((type === 'Azure Application Gateway' && selectedVnet.name == selectedLoadBalancer.vnet) ||\n (type === 'Azure Load Balancer' && selectedVnet.name === attachedVnet.name))\n ) {\n $scope.command.selectedVnet = selectedVnet;\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n }\n });\n }\n });\n }\n });\n }\n });\n }\n\n if ($scope.command.credentials && $scope.command.region) {\n $scope.command.viewState.networkSettingsConfigured = true;\n $scope.command.selectedVnetSubnets = [];\n if ($scope.command.loadBalancerName !== null && typeof $scope.command.loadBalancerName !== 'undefined') {\n $scope.useLoadBalancer = true;\n }\n loadVnetSubnets($scope.command.loadBalancerName, $scope.command.loadBalancerType);\n }\n\n this.loadBalancerChanged = function (item) {\n $scope.command.viewState.networkSettingsConfigured = true;\n ModalWizard.markComplete('load-balancers');\n\n const loadBalancers = $scope.command.backingData.loadBalancers;\n let loadBalancerType = null;\n\n if (loadBalancers) {\n const loadBalancerToFind = loadBalancers.find((lb) => lb.name === item);\n if (loadBalancerToFind) {\n loadBalancerType = Utility.getLoadBalancerType(loadBalancerToFind.loadBalancerType).type;\n }\n }\n\n if (item === null) {\n $scope.command.loadBalancerName = null;\n }\n\n $scope.command.selectedVnetSubnets = [];\n $scope.command.loadBalancerType = loadBalancerType;\n InfrastructureCaches.clearCache('networks');\n loadVnetSubnets(item, loadBalancerType);\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupLoadBalancersSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupLoadBalancersSelector.directive.html'),\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.networkSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupNetworkSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('network-settings');\n\n $scope.command.selectedVnet = {\n name: $scope.command.vnet,\n };\n\n $scope.command.selectedSubnet = $scope.command.subnet;\n\n this.vnetChanged = function (item) {\n $scope.command.vnet = item;\n $scope.command.subnet = $scope.command.selectedSubnet = null;\n $scope.command.selectedVnetSubnets = item.subnets.map((s) => s.name);\n };\n\n this.networkSettingsChanged = function (item) {\n $scope.command.vnet = $scope.command.selectedVnet.name;\n $scope.command.subnet = item;\n ModalWizard.markComplete('network-settings');\n };\n\n this.getVnetName = function () {\n if ($scope.command.selectedVnet) {\n return $scope.command.selectedVnet.name;\n } else {\n return 'Virtual network was not selected';\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.networkSettings.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupNetworkSettingsSelector',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./ServerGroupNetworkSettingsSelector.directive.html'),\n };\n },\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.securityGroups.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER, []).controller(\n 'azureServerGroupSecurityGroupsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('security-groups');\n ModalWizard.markComplete('security-groups');\n\n $scope.command.selectedSecurityGroup = {\n id: $scope.command.securityGroupName,\n };\n\n this.securityGroupChanged = function (securityGroup) {\n $scope.command.securityGroupName = securityGroup.id;\n ModalWizard.markComplete('security-groups');\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { FirewallLabels, InfrastructureCaches } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.securityGroupSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupSecurityGroupsSelector',\n [\n 'azureServerGroupConfigurationService',\n function (azureServerGroupConfigurationService) {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupSecurityGroupsSelector.directive.html'),\n link: function (scope) {\n scope.firewallLabel = FirewallLabels.get('firewall');\n\n scope.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n scope.refreshSecurityGroups = function () {\n scope.refreshing = true;\n azureServerGroupConfigurationService.refreshSecurityGroups(scope.command).then(function () {\n scope.refreshing = false;\n });\n };\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.tags.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE, [])\n .directive('azureTagsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./tagsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'tagsSelectorCtrl',\n controller: 'TagsSelectorCtrl',\n };\n })\n .controller('TagsSelectorCtrl', [\n '$scope',\n function () {\n this.getTagResult = function () {\n return Utility.checkTags(this.command.instanceTags);\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.zone.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE, []).directive('azureZoneSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./zoneSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'vm',\n controller: [\n '$scope',\n function ($scope) {\n this.updateEnableInboundNAT = () => {\n if ($scope.vm.command.zonesEnabled) {\n $scope.vm.command.enableInboundNAT = false;\n }\n };\n },\n ],\n };\n});\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER } from './wizard/ServerGroupInstanceArchetype.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER } from './wizard/ServerGroupInstanceType.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER } from './wizard/advancedSettings/ServerGroupAdvancedSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE } from './wizard/advancedSettings/advancedSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER } from './wizard/basicSettings/ServerGroupBasicSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE } from './wizard/capacity/capacitySelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER } from './wizard/healthSettings/ServerGroupHealthSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE } from './wizard/healthSettings/healthSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER } from './wizard/image/ServerGroupImageSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE } from './wizard/image/imageSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER } from './wizard/loadBalancers/ServerGroupLoadBalancers.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE } from './wizard/loadBalancers/serverGroupLoadBalancersSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER } from './wizard/networkSettings/ServerGroupNetworkSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE } from './wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER } from './wizard/securityGroup/ServerGroupSecurityGroups.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE } from './wizard/securityGroup/serverGroupSecurityGroupsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE } from './wizard/tags/tagsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE } from './wizard/zones/zoneSelector.directive';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE = 'spinnaker.azure.serverGroup.configure';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE, [\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE,\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from '../../instance/azureInstanceType.service';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE =\n 'spinnaker.azure.serverGroup.configure.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n ])\n .factory('azureServerGroupConfigurationService', [\n '$q',\n 'azureImageReader',\n 'securityGroupReader',\n 'cacheInitializer',\n 'loadBalancerReader',\n 'azureInstanceTypeService',\n function (\n $q,\n azureImageReader,\n securityGroupReader,\n cacheInitializer,\n loadBalancerReader,\n azureInstanceTypeService,\n ) {\n const dataDiskTypes = ['Standard_LRS', 'StandardSSD_LRS', 'Premium_LRS'];\n const dataDiskCachingTypes = ['None', 'ReadOnly', 'ReadWrite'];\n\n const healthCheckTypes = ['EC2', 'ELB'];\n const terminationPolicies = [\n 'OldestInstance',\n 'NewestInstance',\n 'OldestLaunchConfiguration',\n 'ClosestToNextInstanceHour',\n 'Default',\n ];\n\n function configureUpdateCommand(command) {\n command.backingData = {\n healthCheckTypes: angular.copy(healthCheckTypes),\n terminationPolicies: angular.copy(terminationPolicies),\n };\n }\n\n function configureCommand(application, command) {\n return $q\n .all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n securityGroupReader.loadSecurityGroups(),\n loadBalancerReader.loadLoadBalancers(application.name),\n ])\n .then(function ([credentialsKeyedByAccount, securityGroups, loadBalancers]) {\n command.backingData = {\n credentialsKeyedByAccount,\n securityGroups,\n loadBalancers,\n dataDiskTypes: angular.copy(dataDiskTypes),\n dataDiskCachingTypes: angular.copy(dataDiskCachingTypes),\n accounts: _.keys(credentialsKeyedByAccount),\n filtered: {},\n };\n attachEventHandlers(command);\n });\n }\n\n function configureInstanceTypes(command) {\n const result = {\n dirty: {},\n };\n if (command.region) {\n const results = [result.dirty];\n\n // results.push(configureCustomInstanceTypes(command).dirty);\n results.push(configureStandardInstanceTypes(command).dirty);\n\n angular.extend(...results);\n } else {\n command.backingData.filtered.instanceTypes = [];\n }\n return result;\n }\n\n function configureStandardInstanceTypes(command) {\n const c = command;\n const result = {\n dirty: {},\n };\n\n const locations = [c.region];\n const { credentialsKeyedByAccount } = c.backingData;\n const { locationToInstanceTypesMap } = credentialsKeyedByAccount[c.credentials];\n\n if (locations.every((l) => !l)) {\n return result;\n }\n\n const filtered = azureInstanceTypeService\n .getAvailableTypesForRegions(locationToInstanceTypesMap, locations)\n .map((type) => type.name);\n\n const instanceType = c.instanceType;\n if (_.every([instanceType, !_.startsWith(instanceType, 'custom'), !_.includes(filtered, instanceType)])) {\n result.dirty.instanceType = c.instanceType;\n c.instanceType = null;\n }\n c.backingData.filtered.instanceTypes = filtered;\n return result;\n }\n\n function configureImages(command) {\n const result = {\n dirty: {},\n };\n let regionalImages = null;\n if (command.viewState.disableImageSelection) {\n return result;\n }\n if (command.region) {\n regionalImages = command.backingData.packageImages\n .filter(function (image) {\n return image.amis && image.amis[command.region];\n })\n .map(function (image) {\n return {\n imageName: image.imageName,\n ami: image.amis ? image.amis[command.region][0] : null,\n };\n });\n if (\n command.amiName &&\n !regionalImages.some(function (image) {\n return image.imageName === command.amiName;\n })\n ) {\n result.dirty.amiName = true;\n command.amiName = null;\n }\n } else {\n command.amiName = null;\n }\n command.backingData.filtered.images = regionalImages;\n return result;\n }\n\n function configureZones(command) {\n const result = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (!command.region) {\n return result;\n }\n let { regionsSupportZones, availabilityZones } = command.backingData.credentialsKeyedByAccount[\n command.credentials\n ];\n regionsSupportZones = regionsSupportZones || [];\n availabilityZones = availabilityZones || [];\n filteredData.zones = regionsSupportZones.includes(command.region) ? availabilityZones : [];\n\n return result;\n }\n\n function getRegionalSecurityGroups(command) {\n const newSecurityGroups = command.backingData.securityGroups[command.credentials] || {\n azure: {},\n };\n return _.chain(newSecurityGroups[command.region]).sortBy('name').value();\n }\n\n function configureSecurityGroupOptions(command) {\n const result = {\n dirty: {},\n };\n let currentOptions;\n if (command.backingData.filtered.securityGroups) {\n currentOptions = command.backingData.filtered.securityGroups;\n }\n const newRegionalSecurityGroups = getRegionalSecurityGroups(command);\n if (command.selectedSecurityGroup) {\n // one has not been previously selected. We are either configuring for the\n //first time or they changed regions or account\n command.selectedSecurityGroup = null;\n result.dirty.securityGroups = true;\n }\n if (currentOptions != newRegionalSecurityGroups) {\n command.backingData.filtered.securityGroups = newRegionalSecurityGroups;\n result.dirty.securityGroups = true;\n }\n\n if (command.backingData.filtered.securityGroups === []) {\n command.viewState.securityGroupsConfigured = false;\n } else {\n command.viewState.securityGroupsConfigured = true;\n }\n\n return result;\n }\n\n function refreshSecurityGroups(command, skipCommandReconfiguration) {\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n command.backingData.securityGroups = securityGroups;\n if (!skipCommandReconfiguration) {\n configureSecurityGroupOptions(command);\n }\n });\n });\n }\n\n function getLoadBalancerNames(loadBalancers) {\n return _.chain(loadBalancers).map('name').uniq().value().sort();\n }\n\n function configureLoadBalancerOptions(command) {\n const result = {\n dirty: {},\n };\n const current = command.loadBalancers;\n const newLoadBalancers = getLoadBalancerNames(command.backingData.loadBalancers);\n\n if (current && command.loadBalancers) {\n const matched = _.intersection(newLoadBalancers, command.loadBalancers);\n const removed = _.xor(matched, current);\n command.loadBalancers = matched;\n if (removed.length) {\n result.dirty.loadBalancers = removed;\n }\n }\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n return result;\n }\n\n function refreshLoadBalancers(command, skipCommandReconfiguration) {\n return loadBalancerReader.listLoadBalancers('azure').then(function (loadBalancers) {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n configureLoadBalancerOptions(command);\n }\n });\n }\n\n function configureLoadBalancers(command) {\n const result = {\n dirty: {},\n };\n const temp = command.backingData.loadBalancers;\n const filterlist = _.filter(temp, function (lb) {\n return lb.account === command.credentials && lb.region === command.region;\n });\n\n command.loadBalancers = getLoadBalancerNames(filterlist);\n command.viewState.loadBalancersConfigured = true;\n\n return result;\n }\n\n function attachEventHandlers(cmd) {\n cmd.regionChanged = function regionChanged(command, isInit = false) {\n const result = {\n dirty: {},\n };\n if (command.region && command.credentials) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n angular.extend(result.dirty, configureSecurityGroupOptions(command).dirty);\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n angular.extend(result.dirty, configureZones(command).dirty);\n }\n // reset previous set values\n if (!isInit) {\n command.loadBalancerName = null;\n command.loadBalancerType = null;\n command.vnet = null;\n command.vnetResourceGroup = null;\n command.subnet = null;\n command.selectedSubnet = null;\n command.selectedVnet = null;\n command.selectedVnetSubnets = [];\n command.viewState.networkSettingsConfigured = false;\n command.selectedSecurityGroup = null;\n command.securityGroupName = null;\n command.zonesEnabled = false;\n command.zones = [];\n }\n\n return result;\n };\n\n cmd.credentialsChanged = function credentialsChanged(command, isInit) {\n const result = {\n dirty: {},\n };\n const backingData = command.backingData;\n if (command.credentials) {\n const regionsForAccount = backingData.credentialsKeyedByAccount[command.credentials] || {\n regions: [],\n defaultKeyPair: null,\n };\n backingData.filtered.regions = regionsForAccount.regions;\n if (\n !_.chain(backingData.filtered.regions)\n .some({\n name: command.region,\n })\n .value()\n ) {\n command.region = null;\n result.dirty.region = true;\n } else {\n angular.extend(result.dirty, command.regionChanged(command, isInit).dirty);\n }\n if (command.region) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n }\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n } else {\n command.region = null;\n }\n return result;\n };\n }\n\n function refreshInstanceTypes(command) {\n return cacheInitializer.refreshCache('instanceTypes').then(function () {\n return azureInstanceTypeService.getAllTypesByRegion().then(function (instanceTypes) {\n command.backingData.instanceTypes = instanceTypes;\n configureInstanceTypes(command);\n });\n });\n }\n\n return {\n configureUpdateCommand: configureUpdateCommand,\n configureCommand: configureCommand,\n configureImages: configureImages,\n configureSecurityGroupOptions: configureSecurityGroupOptions,\n configureLoadBalancerOptions: configureLoadBalancerOptions,\n refreshLoadBalancers: refreshLoadBalancers,\n refreshSecurityGroups: refreshSecurityGroups,\n getRegionalSecurityGroups: getRegionalSecurityGroups,\n refreshInstanceTypes: refreshInstanceTypes,\n configureZones: configureZones,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { FirewallLabels, ModalWizard, SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\nimport Utility from '../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER =\n 'spinnaker.azure.cloneServerGroup.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n SERVER_GROUP_WRITER,\n]).controller('azureCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'azureServerGroupConfigurationService',\n 'serverGroupCommand',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n azureServerGroupConfigurationService,\n serverGroupCommand,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: require('./templateSelection.html'),\n basicSettings: require('./basicSettings/basicSettings.html'),\n imageSettings: require('./image/imageSettings.html'),\n healthSettings: require('./healthSettings/healthSettings.html'),\n loadBalancers: require('./loadBalancers/loadBalancers.html'),\n networkSettings: require('./networkSettings/networkSettings.html'),\n securityGroups: require('./securityGroup/securityGroups.html'),\n instanceType: require('./instanceType/instanceType.html'),\n zones: require('./capacity/zones.html'),\n tags: require('./tags/tags.html'),\n advancedSettings: require('./advancedSettings/advancedSettings.html'),\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n $scope.command = serverGroupCommand;\n\n // Give regions an init value to prevent it being undefined. If so, the React component RegionSelectField would get \"undefined\" for property regions\n // and then be unmounted so that the region selector would be hidden.\n $scope.command.backingData = $scope.command.backingData || {};\n $scope.command.backingData.filtered = $scope.command.backingData.filtered || {};\n $scope.command.backingData.filtered.regions = $scope.command.backingData.filtered.regions || [];\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: [\n 'account, region, subnet, cluster name (stack, details)',\n 'load balancers',\n FirewallLabels.get('firewalls'),\n 'instance type',\n 'all fields on the Advanced Settings page',\n ],\n notCopied: [],\n additionalCopyText:\n 'If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group.',\n };\n\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'azure',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n azureServerGroupConfigurationService.configureCommand(application, serverGroupCommand).then(function () {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'create') {\n serverGroupCommand.viewState.useAllImageSelection = true;\n }\n $scope.state.loaded = true;\n initializeWizardState();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWizardState() {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'editPipeline') {\n ModalWizard.markComplete('basic-settings');\n ModalWizard.markComplete('load-balancers');\n ModalWizard.markComplete('network-settings');\n ModalWizard.markComplete('security-groups');\n ModalWizard.markComplete('instance-type');\n ModalWizard.markComplete('zones');\n }\n }\n\n function initializeWatches() {\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged($scope.command, true));\n processCommandUpdateResult($scope.command.regionChanged($scope.command, true));\n }\n\n function createResultProcessor(method) {\n return function (newValue, oldValue) {\n if (newValue !== oldValue) {\n processCommandUpdateResult(method($scope.command));\n }\n };\n }\n\n function processCommandUpdateResult(result) {\n if (result.dirty.loadBalancers) {\n ModalWizard.markDirty('load-balancers');\n ModalWizard.markDirty('network-settings');\n }\n if (result.dirty.securityGroups) {\n ModalWizard.markDirty('security-groups');\n }\n if (result.dirty.instanceType) {\n ModalWizard.markDirty('instance-type');\n }\n if (result.dirty.zoneEnabled || result.dirty.zones) {\n ModalWizard.markDirty('zones');\n }\n }\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.toggleSuspendedProcess = function (process) {\n $scope.command.suspendedProcesses = $scope.command.suspendedProcesses || [];\n const processIndex = $scope.command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n $scope.command.suspendedProcesses.push(process);\n } else {\n $scope.command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n this.processIsSuspended = function (process) {\n return $scope.command.suspendedProcesses.includes(process);\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n this.isValid = function () {\n return (\n $scope.command &&\n $scope.command.application &&\n $scope.command.credentials &&\n $scope.command.instanceType &&\n $scope.command.region &&\n (!$scope.command.zonesEnabled || $scope.command.zones.length !== 0) &&\n Utility.checkTags($scope.command.instanceTags).isValid\n );\n };\n },\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.azure.serverGroupCommandBuilder.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n ])\n .factory('azureServerGroupCommandBuilder', [\n '$q',\n 'azureImageReader',\n 'azureServerGroupTransformer',\n function ($q, azureImageReader, azureServerGroupTransformer) {\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultCredentials = defaults.account || application.defaultCredentials.azure;\n const defaultRegion = defaults.region || application.defaultRegions.azure;\n\n return azureImageReader.findImages({ provider: 'azure' }).then(function (images) {\n return {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n images,\n loadBalancers: [],\n selectedVnetSubnets: [],\n strategy: '',\n sku: {\n capacity: 1,\n },\n zonesEnabled: false,\n zones: [],\n instanceTags: {},\n dataDisks: [],\n selectedProvider: 'azure',\n viewState: {\n instanceProfile: 'custom',\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n loadBalancersConfigured: false,\n networkSettingsConfigured: false,\n securityGroupsConfigured: false,\n },\n enableInboundNAT: false,\n };\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline() {\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n application: application.name,\n strategy: '',\n stack: serverGroupName.stack,\n freeFormDetails: serverGroupName.freeFormDetails,\n credentials: serverGroup.account,\n loadBalancers: serverGroup.loadBalancers,\n selectedSubnets: serverGroup.selectedVnetSubnets,\n selectedVnet: serverGroup.selectedVnet,\n securityGroups: serverGroup.securityGroups,\n loadBalancerName: serverGroup.loadBalancerName,\n loadBalancerType: serverGroup.loadBalancerType,\n securityGroupName: serverGroup.securityGroupName,\n region: serverGroup.region,\n vnet: serverGroup.vnet,\n vnetResourceGroup: serverGroup.vnetResourceGroup,\n subnet: serverGroup.subnet,\n zones: serverGroup.zones,\n zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,\n instanceTags: {},\n dataDisks: serverGroup.dataDisks,\n sku: serverGroup.sku,\n capacity: {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n },\n tags: [],\n instanceType: serverGroup.sku.name,\n selectedProvider: 'azure',\n source: {\n account: serverGroup.account,\n region: serverGroup.region,\n serverGroupName: serverGroup.name,\n asgName: serverGroup.name,\n },\n viewState: {\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: false,\n listImplicitSecurityGroups: false,\n mode: mode,\n disableStrategySelection: true,\n },\n enableInboundNAT: serverGroup.enableInboundNAT,\n };\n\n if (typeof serverGroup.customScriptsSettings !== 'undefined') {\n command.customScriptsSettings = {};\n command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {\n azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);\n }\n }\n\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = pipelineCluster.region;\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const viewState = {\n disableImageSelection: true,\n useSimpleCapacity: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n instanceProfile: originalCluster.viewState.instanceProfile,\n instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n viewState: viewState,\n };\n if (originalCluster.viewState.instanceTypeDetails) {\n viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;\n }\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n const extendedCommand = angular.extend({}, command, pipelineCluster, viewOverrides);\n\n return extendedCommand;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n };\n },\n ]);\n","import React from 'react';\n\nimport { UserVerification } from '@spinnaker/core';\n\nexport interface IAzureModalFooterProps {\n onSubmit: () => void;\n onCancel: () => void;\n isValid: boolean;\n account: string;\n}\n\nexport interface IAzureModalFooterState {\n verified: boolean;\n}\n\nexport class AzureModalFooter extends React.Component<IAzureModalFooterProps, IAzureModalFooterState> {\n constructor(props: any) {\n super(props);\n }\n\n public state = { verified: false };\n\n private handleVerification = (verified: boolean) => {\n this.setState({ verified });\n };\n\n public render() {\n const { onSubmit, onCancel, isValid, account } = this.props;\n const { verified } = this.state;\n\n return (\n <div className=\"modal-footer\">\n {<UserVerification expectedValue={account} onValidChange={this.handleVerification} />}\n <button className=\"btn btn-default\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"submit\" className=\"btn btn-primary\" onClick={onSubmit} disabled={!isValid || !verified}>\n Submit\n </button>\n </div>\n );\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport Select from 'react-select';\n\nimport type { IModalComponentProps } from '@spinnaker/core';\nimport {\n ModalClose,\n noop,\n ReactInjector,\n ReactModal,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n} from '@spinnaker/core';\n\nimport { AzureModalFooter } from '../../../common/AzureModalFooter';\n\nexport interface IAzureRollbackServerGroupModalProps extends IModalComponentProps {\n application: any;\n serverGroup: any;\n disabledServerGroups: any;\n}\n\nexport interface IAzureRollbackServerGroupModalState {\n taskMonitor: TaskMonitor;\n submitting: boolean;\n command: any;\n}\n\nexport class AzureRollbackServerGroupModal extends React.Component<\n IAzureRollbackServerGroupModalProps,\n IAzureRollbackServerGroupModalState\n> {\n public static defaultProps: Partial<IAzureRollbackServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IAzureRollbackServerGroupModalProps) {\n const modalProps = {};\n return ReactModal.show(AzureRollbackServerGroupModal, props, modalProps);\n }\n\n constructor(props: IAzureRollbackServerGroupModalProps) {\n super(props);\n\n const { application, serverGroup } = props;\n\n this.state = {\n taskMonitor: new TaskMonitor({\n application: application,\n title: 'Rolling back your server group',\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n }),\n submitting: true,\n command: {\n interestingHealthProviderNames: [],\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n enableAndDisableOnly: true,\n },\n },\n };\n }\n\n private close = (args?: any) => {\n this.props.dismissModal.apply(null, args);\n };\n\n private submit = () => {\n const { command, taskMonitor } = this.state;\n const { serverGroup, application } = this.props;\n\n taskMonitor.submit(() => {\n return ReactInjector.serverGroupWriter.rollbackServerGroup(serverGroup, application, command);\n });\n };\n\n private filterServerGroups = (disabledServerGroups: any) => {\n const filteredDisabledServerGroups = disabledServerGroups\n .filter((disabledServerGroup: any) => disabledServerGroup.instanceCounts.total !== 0)\n .sort((a: any, b: any) => b.name.localeCompare(a.name));\n\n return filteredDisabledServerGroups;\n };\n\n private isValid = () => {\n const restoreServerGroupName = this.state.command.rollbackContext.restoreServerGroupName;\n return restoreServerGroupName !== undefined;\n };\n\n private handleServerGroupChange = (restoreServerGroupOption: any) => {\n const { disabledServerGroups } = this.props;\n const newCommand = { ...this.state.command };\n newCommand.rollbackContext.restoreServerGroupName = restoreServerGroupOption.value;\n const restoreServerGroup = this.filterServerGroups(disabledServerGroups).find(function (disabledServerGroup: any) {\n return disabledServerGroup.name === restoreServerGroupOption.value;\n });\n newCommand.targetSize = restoreServerGroup.capacity.max;\n this.setState({\n command: newCommand,\n });\n };\n\n private handleTaskReasonChange = (taskReason?: any) => {\n const newCommand = { ...this.state.command };\n newCommand.reason = taskReason;\n this.setState({\n command: newCommand,\n });\n };\n\n public render() {\n const { command, taskMonitor, submitting } = this.state;\n const { serverGroup, disabledServerGroups } = this.props;\n const isValidSG = this.isValid();\n const disabledServerGroupOptions = this.filterServerGroups(disabledServerGroups).map(\n (disabledServerGroup: any) => ({\n label: disabledServerGroup.name,\n value: disabledServerGroup.name,\n }),\n );\n\n return (\n <Modal onHide={this.close}>\n <TaskMonitorWrapper monitor={taskMonitor} />\n {submitting && (\n <form role=\"form\">\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Rollback {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"row\">\n <div className=\"col-sm-3 sm-label-right\">Restore to</div>\n <div className=\"col-sm-6\">\n <Select\n value={command.rollbackContext.restoreServerGroupName}\n onChange={this.handleServerGroupChange}\n options={disabledServerGroupOptions}\n />\n </div>\n </div>\n <TaskReason reason={command.taskReason} onChange={this.handleTaskReasonChange} />\n </Modal.Body>\n <AzureModalFooter\n onSubmit={this.submit}\n onCancel={this.close}\n isValid={isValidSG}\n account={serverGroup.account}\n />\n </form>\n )}\n </Modal>\n );\n }\n}\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n} from '@spinnaker/core';\n\nimport '../configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { AzureRollbackServerGroupModal } from './rollback/RollbackServerGroupModal';\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER =\n 'spinnaker.azure.serverGroup.details.controller';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n SERVER_GROUP_WRITER,\n ])\n .controller('azureServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n '$templateCache',\n 'app',\n 'serverGroup',\n 'azureServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n function (\n $scope,\n $state,\n $templateCache,\n app,\n serverGroup,\n azureServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n function extractServerGroupSummary() {\n let summary = _.find(app.serverGroups.data, function (toCheck) {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some(function (loadBalancer) {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some(function (possibleServerGroup) {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n if (!summary) {\n $state.go('^');\n }\n return summary;\n }\n\n function retrieveServerGroup() {\n const summary = extractServerGroupSummary();\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then(function (details) {\n cancelLoader();\n\n angular.extend(details, summary);\n details.account = serverGroup.accountId; // it's possible the summary was not found because the clusters are still loading\n\n $scope.serverGroup = details;\n\n if (!_.isEmpty($scope.serverGroup)) {\n $scope.image = details.image ? details.image : undefined;\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach(function (tag) {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.launchConfig && details.launchConfig.securityGroups) {\n $scope.securityGroups = _.chain(details.launchConfig.securityGroups)\n .map(function (id) {\n return (\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n id: id,\n }) ||\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n name: id,\n })\n );\n })\n .compact()\n .value();\n }\n } else {\n $state.go('^');\n }\n });\n }\n\n function cancelLoader() {\n $scope.state.loading = false;\n }\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = function destroyServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: function () {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return serverGroupWriter.destroyServerGroup(serverGroup, app);\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = function disableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = () => serverGroupWriter.disableServerGroup(serverGroup, app);\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = function enableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(\n serverGroup,\n app,\n angular.extend(params, {\n interestingHealthProviderNames: [], // bypass the check for now; will change this later to ['azureService']\n }),\n );\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rollbackServerGroup = () => {\n const serverGroup = $scope.serverGroup;\n const cluster = _.find(app.clusters, { name: serverGroup.cluster, account: serverGroup.account });\n const disabledServerGroups = _.filter(cluster.serverGroups, { isDisabled: true, region: serverGroup.region });\n AzureRollbackServerGroupModal.show({ application: app, serverGroup, disabledServerGroups });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'azureCloneServerGroupCtrl as ctrl',\n size: 'lg',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n azureServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.truncateCommitHash = function () {\n if ($scope.serverGroup && $scope.serverGroup.buildInfo && $scope.serverGroup.buildInfo.commit) {\n return $scope.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n },\n ]);\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER } from './serverGroupDetails.azure.controller';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE = 'spinnaker.azure.serverGroup.details.azure';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE, [\n AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER,\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ApplicationNameValidator } from '@spinnaker/core';\n\nexport const AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR = 'spinnaker.azure.validation.applicationName';\nexport const name = AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR; // for backwards compatibility\nmodule(AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR, [])\n .factory('azureApplicationNameValidator', function () {\n function validateSpecialCharacters(name, errors) {\n const pattern = /^([a-zA-Z][a-zA-Z0-9]*)?$/;\n if (!pattern.test(name)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters or digits. No ' +\n 'special characters are allowed.',\n );\n }\n }\n\n function validate(name) {\n const warnings = [];\n const errors = [];\n\n if (name && name.length) {\n validateSpecialCharacters(name, errors);\n }\n\n return {\n warnings: warnings,\n errors: errors,\n };\n }\n\n return {\n validate: validate,\n };\n })\n .run([\n 'azureApplicationNameValidator',\n function (azureApplicationNameValidator) {\n ApplicationNameValidator.registerValidator('azure', azureApplicationNameValidator);\n },\n ]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './help/azure.help';\nimport { AZURE_IMAGE_IMAGE_READER } from './image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from './instance/azureInstanceType.service';\nimport { AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { AzureLoadBalancerChoiceModal } from './loadBalancer/configure/AzureLoadBalancerChoiceModal';\nimport { AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER } from './loadBalancer/configure/createLoadBalancer.controller';\nimport { AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER } from './loadBalancer/details/loadBalancerDetail.controller';\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from './loadBalancer/loadBalancer.transformer';\nimport logo from './logo/logo_azure.png';\nimport { AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE } from './pipeline/stages/bake/azureBakeStage';\nimport { AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/azureDestroyAsgStage';\nimport { AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE } from './pipeline/stages/disableAsg/azureDisableAsgStage';\nimport { AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE } from './pipeline/stages/enableAsg/azureEnableAsgStage';\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from './securityGroup/configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL } from './securityGroup/configure/EditSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './securityGroup/details/securityGroupDetail.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_READER } from './securityGroup/securityGroup.reader';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup/securityGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE } from './serverGroup/configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.azure.controller';\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE } from './serverGroup/details/serverGroup.details.module';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\nimport { AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR } from './validation/applicationName.validator';\n\nimport './logo/azure.logo.less';\n\nexport const AZURE_MODULE = 'spinnaker.azure';\nmodule(AZURE_MODULE, [\n AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE,\n AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE,\n AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER,\n AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER,\n AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n AZURE_SECURITYGROUP_SECURITYGROUP_READER,\n AZURE_IMAGE_IMAGE_READER,\n AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR,\n]).config(function () {\n CloudProviderRegistry.registerProvider('azure', {\n name: 'Azure',\n logo: {\n path: logo,\n },\n image: {\n reader: 'azureImageReader',\n },\n serverGroup: {\n transformer: 'azureServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'azureServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'azureCloneServerGroupCtrl',\n commandBuilder: 'azureServerGroupCommandBuilder',\n configurationService: 'azureServerGroupConfigurationService',\n },\n instance: {\n instanceTypeService: 'azureInstanceTypeService',\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'azureInstanceDetailsCtrl',\n },\n loadBalancer: {\n transformer: 'azureLoadBalancerTransformer',\n detailsTemplateUrl: require('./loadBalancer/details/loadBalancerDetail.html'),\n detailsController: 'azureLoadBalancerDetailsCtrl',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/createLoadBalancer.html'),\n createLoadBalancerController: 'azureCreateLoadBalancerCtrl',\n CreateLoadBalancerModal: AzureLoadBalancerChoiceModal,\n },\n securityGroup: {\n transformer: 'azureSecurityGroupTransformer',\n reader: 'azureSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'azureSecurityGroupDetailsCtrl',\n createSecurityGroupTemplateUrl: require('./securityGroup/configure/createSecurityGroup.html'),\n createSecurityGroupController: 'azureCreateSecurityGroupCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('azure', ['redblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHv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\""],"names":["TagError","TagError2","AzureLoadBalancerTypes","type","description","_Utility","[object Object]","tagsObject","isValid","error","errorMessage","length","Object","keys","TAG_LIMITATION","k","v","entries","TAG_KEY_LENGTH_LIMITATION","TAG_VALUE_LENGTH_LIMITATION","TAG_INVALID_CHAR_REG_EXR","test","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","azure.securityGroup.ingress.description","azure.securityGroup.ingress.priority","azure.securityGroup.ingress.source","azure.securityGroup.ingress.sourcePortRange","azure.securityGroup.ingress.destination","azure.securityGroup.ingress.destinationPortRange","azure.securityGroup.ingress.direction","azure.securityGroup.ingress.actions","azure.securityGroup.ingress.destPortRanges","azure.securityGroup.ingress.sourceIPCIDRRanges","azure.serverGroup.imageName","azure.serverGroup.stack","azure.serverGroup.detail","azure.serverGroup.scriptLocation","azure.serverGroup.commandToExecute","azure.serverGroup.customData","azure.serverGroup.customTags","azure.serverGroup.enableInboundNAT","azure.serverGroup.lun","azure.serverGroup.diskSizeGB","azure.serverGroup.managedDisk.storageAccountType","azure.serverGroup.caching","azure.serverGroup.userAssignedIdentities","azure.loadBalancer.dnsName","azure.loadBalancer.probes.probeInterval","azure.loadBalancer.probes.timeout","azure.loadBalancer.probes.unhealthyThreshold","azure.loadBalancer.loadBalancingRules.idleTimeout","azure.loadBalancer.loadBalancingRules.sessionPersistence","forEach","key","HelpContentsRegistry","register","module","factory","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","$q","categories","label","families","instanceTypes","name","cpu","memory","storage","count","size","icon","calculateStorage","getCategories","map","category","family","inst","costFactor","stats","min","Number","MAX_VALUE","max","push","cpuMin","_","minBy","cpuMax","maxBy","memoryMin","memoryMax","storageMin","storageMax","Math","buildStats","when","getAvailableTypesForRegions","locationToInstanceTypesMap","selectedLocations","location","getAllTypesByRegion","UIROUTER_ANGULARJS","ANGULAR_UI_BOOTSTRAP","controller","$scope","$state","$uibModal","instance","app","retrieveInstance","extraData","instanceSummary","loadBalancers","account","vpcId","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","loadBalancer","isDisabled","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","details","state","loading","instance2","latest","isStandalone","health","displayableMetrics","filter","metric","detailsMatch","latestHealth","defaults","healthMetrics","extractHealthMetrics","discoveryMetric","vipAddress","vipList","includes","baseIpAddress","publicDnsName","privateIpAddress","go","instanceIdNotFound","detailsTemplateUrl","CloudProviderRegistry","getValue","standalone","this","canDeregisterFromLoadBalancer","canRegisterWithLoadBalancer","outOfService","hasLoadBalancerHealth","canRegisterWithDiscovery","discoveryHealth","terminateInstance","taskMonitor","application","title","onTaskComplete","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","InstanceWriter","terminateInstanceAndShrinkServerGroup","rebootInstance","registerInstanceWithLoadBalancer","loadBalancerNames","deregisterInstanceFromLoadBalancer","enableInstanceInDiscovery","disableInstanceInDiscovery","hasHealthState","healthProviderType","all","ready","$$destroyed","onRefresh","_AzureLoadBalancerChoiceModal","React","Component","props","super","choose","close","ModalInjector","modalService","open","templateUrl","createLoadBalancerTemplateUrl","windowClass","createLoadBalancerController","resolve","isNew","forPipelineConfig","loadBalancerType","selectedChoice","result","catch","reason","dismissModal","choices","ReactModal","show","className","choice","setState","createElement","Fragment","ModalClose","dismiss","Modal","Header","Title","Body","onClick","choiceSelected","Footer","Button","AzureLoadBalancerChoiceModal","defaultProps","closeModal","noop","AzureProviderSettings","SETTINGS","providers","azure","resetToOriginal","resetProvider","normalizeLoadBalancer","detachedInstances","concat","activeServerGroups","chain","flatten","value","convertLoadBalancerForEditing","toEdit","stack","detail","vnet","subnet","probes","loadBalancingRules","elb","securityGroups","dnsName","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","cloudProvider","probeName","probeProtocol","probePort","probePath","probeInterval","unhealthyThreshold","timeout","ruleName","protocol","externalPort","backendPort","persistence","idleTimeout","sku","$uibModalInstance","ctrl","onApplicationRefresh","newStateParams","accountLoadBalancersByRegion","getDataSource","existingLoadBalancerNames","regions","listeners","healthCheck","advancedSettings","isALB","accountsLoaded","TaskMonitor","modalInstance","refresh","azureLoadBalancerTransformer","updateLoadBalancerNames","AccountService","listAccounts","accounts","initializeController","requiresHealthCheckPath","updateName","getName","elbName","getRegionsForAccount","regionUpdated","vnetUpdated","selectedVnet","NetworkReader","listNetworks","vnets","selectedVnets","selectedSubnet","selectedVnetChanged","item","vnetResourceGroup","resourceGroup","subnets","addSubnet","devices","removeListener","index","addListener","submit","descriptor","appName","name2","ruleNameBase","rule","cancel","window","angular","run","templateCache","put","SECURITY_GROUP_READER","LOAD_BALANCER_READ_SERVICE","filtered","match","sortBy","ss","s","substring","toUpperCase","firewallsLabel","extractLoadBalancer","editLoadBalancer","copy","deleteLoadBalancer","command","loadBalancerName","accountId","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","roscoSelector","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","provides","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","supportsCustomTimeout","validators","fieldName","checkParentTriggers","getMessage","labels","restartable","extendedAttributes","user","baseOsChanged","addExtendedAttribute","PipelineTemplates","controllerAs","extendedAttribute","removeExtendedAttribute","showTemplateFileName","showVarFileName","viewState","$watch","forOwn","val","BakeryReader","getRegions","getBaseOsOptions","getBaseLabelOptions","baseOsOptions","baseImages","osType","baseLabelOptions","baseOs","baseLabel","showAdvancedOptions","stg","templateFileName","showAdvanced","Registry","pipeline","registerStage","executionStepLabelUrl","accountExtractor","configAccountExtractor","message","fieldLabel","regionsLoaded","accountUpdated","getAccountDetails","targets","StageConstants","TARGET_LIST","alias","interestingHealthProviderNames","target","reset","deleteSecurityGroup","securityGroup","securityGroupName","operation","TaskExecutor","executeTask","job","FirewallLabels","InfrastructureCaches","clearCache","upsertSecurityGroup","assignWith","other","isUndefined","pages","ingress","firewallLabel","accountName","swapRules","ruleset","a","b","priorityA","priority","priorityB","submitting","numToAdd","addMoreItems","onNextRefresh","subnetUpdated","selectedSubnets","securityGroup2","namePreview","upsert","azureSecurityGroupWriter","addRule","access","direction","sourceAddressPrefix","sourceAddressPrefixes","sourcePortRange","destinationAddressPrefix","destinationPortRange","destinationPortRanges","sourceIPCIDRRanges","portUpdated","ruleRanges","destPortRanges","sourceIPCIDRUpdated","isEmpty","protocolUpdated","moveUp","moveDown","securityRules","CACHE_INITIALIZER_SERVICE","temp","refreshingSecurityGroups","getSecurityGroupRefreshTime","refreshSecurityGroups","securityGroupReader","getAllSecurityGroups","availableGroups","availableSecurityGroups","protocolUI","removeRule","splice","startPort","endPort","resolvedSecurityGroup","extractSecurityGroup","fourOhFour","editInboundRules","resolveIndexedSecurityGroup","indexedSecurityGroups","container","securityGroupId","normalizeSecurityGroup","parseCustomScriptsSettings","configuration","Array","isArray","customScriptsSettings","fileUris","fileUrisTemp","trim","convertServerGroupCommandToDeployConfiguration","tempImage","mode","imageName","isCustom","publisher","offer","version","uri","ostype","selectedImage","selectedProvider","strategy","rollback","onFailure","scaleDown","maxRemainingAsgs","delayBeforeDisableSec","delayBeforeScaleDownSec","allowDeleteActive","allowScaleDownActive","freeFormDetails","healthSettings","image","useSourceCapacity","capacity","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","instanceType","vmsku","indexOf","normalizeServerGroup","instanceTypeService","modalWizardService","wizard","getWizard","instanceProfile","includePage","markClean","markComplete","excludePage","newVal","markDirty","restrict","scope","bindToController","addDataDisk","newDataDisks","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","input","selectedRegion","IMAGE_READER","$controller","$uibModalStack","imageReader","ModalWizard","markIncomplete","imageChanged","extend","stackPattern","templatingEnabled","detailPattern","directive","healthCheckProtocols","displayName","changeHealthCheckProtocol","newProtocol","port","requestPath","clearImage","loadBalancerReader","loadVnetSubnets","getLoadBalancerDetails","LBs","selectedLoadBalancer","attachedVnet","selectedVnetSubnets","allVnets","device","attachedSubnet","networkSettingsConfigured","useLoadBalancer","loadBalancerChanged","backingData","loadBalancerToFind","getLoadBalancerType","vnetChanged","networkSettingsChanged","getVnetName","selectedSecurityGroup","securityGroupChanged","azureServerGroupConfigurationService","link","refreshing","getTagResult","updateEnableInboundNAT","vm","azureImageReader","cacheInitializer","azureInstanceTypeService","dataDiskTypes","dataDiskCachingTypes","healthCheckTypes","terminationPolicies","configureInstanceTypes","dirty","c","locations","credentialsKeyedByAccount","every","l","startsWith","configureStandardInstanceTypes","configureZones","filteredData","regionsSupportZones","availabilityZones","getRegionalSecurityGroups","newSecurityGroups","configureSecurityGroupOptions","currentOptions","newRegionalSecurityGroups","securityGroupsConfigured","getLoadBalancerNames","uniq","sort","configureLoadBalancerOptions","current","newLoadBalancers","matched","intersection","removed","xor","configureLoadBalancers","filterlist","loadBalancersConfigured","configureUpdateCommand","configureCommand","getCredentialsKeyedByAccount","loadSecurityGroups","loadLoadBalancers","cmd","regionChanged","isInit","credentialsChanged","regionsForAccount","defaultKeyPair","configureImages","regionalImages","disableImageSelection","packageImages","amis","ami","images","refreshLoadBalancers","skipCommandReconfiguration","listLoadBalancers","refreshCache","refreshInstanceTypes","SERVER_GROUP_WRITER","cloneStage","newServerGroupName","transitionTo","serverGroupCommand","loaded","initializeWizardState","processCommandUpdateResult","createResultProcessor","method","newValue","oldValue","zoneEnabled","templateSelection","basicSettings","imageSettings","networkSettings","tags","applicationName","requiresTemplateSelection","templateSelectionText","copied","notCopied","additionalCopyText","suspendedProcesses","processIndex","process","processIsSuspended","templateSelected","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","buildNewServerGroupCommandForPipeline","buildServerGroupCommandFromExisting","serverGroupName","NameUtils","parseServerGroupName","desired","source","asgName","listImplicitSecurityGroups","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","submitButtonLabel","instanceTypeDetails","viewOverrides","AzureModalFooter","verified","handleVerification","onSubmit","onCancel","UserVerification","expectedValue","onValidChange","disabled","_AzureRollbackServerGroupModal","args","apply","ReactInjector","serverGroupWriter","rollbackServerGroup","filterServerGroups","disabledServerGroups","disabledServerGroup","instanceCounts","total","localeCompare","rollbackContext","restoreServerGroupName","handleServerGroupChange","restoreServerGroupOption","newCommand","restoreServerGroup","targetSize","handleTaskReasonChange","taskReason","modalInstanceEmulation","rollbackType","rollbackServerGroupName","enableAndDisableOnly","isValidSG","disabledServerGroupOptions","onHide","TaskMonitorWrapper","monitor","role","Select","onChange","options","TaskReason","AzureRollbackServerGroupModal","retrieveServerGroup","summary","extractServerGroupSummary","ServerGroupReader","getServerGroup","tag","keyVal","launchConfig","compact","destroyServerGroup","serverGroup2","stateParams","confirmationModalParams","ServerGroupWarningMessageService","disableServerGroup","enableServerGroup","cloneServerGroup","validate","errors","validateSpecialCharacters","warnings","azureApplicationNameValidator","ApplicationNameValidator","registerValidator","css","ref","insertAt","document","head","getElementsByTagName","style","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","AZURE_MODULE","config","registerProvider","logo","reader","transformer","detailsController","cloneServerGroupTemplateUrl","cloneServerGroupController","commandBuilder","configurationService","CreateLoadBalancerModal","createSecurityGroupTemplateUrl","createSecurityGroupController","DeploymentStrategyRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utility.ts","../src/help/azure.help.ts","../src/image/image.reader.js","../src/instance/azureInstanceType.service.js","../src/instance/details/instance.details.controller.js","../src/loadBalancer/configure/AzureLoadBalancerChoiceModal.tsx","../src/azure.settings.ts","../src/loadBalancer/loadBalancer.transformer.js","../src/loadBalancer/configure/createLoadBalancer.controller.js","../src/loadBalancer/details/loadBalancerDetail.controller.js","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/serverGroup/serverGroup.transformer.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/pipeline/stages/bake/azureBakeStage.js","../src/pipeline/stages/destroyAsg/azureDestroyAsgStage.js","../src/pipeline/stages/disableAsg/azureDisableAsgStage.js","../src/pipeline/stages/enableAsg/azureEnableAsgStage.js","../src/securityGroup/securityGroup.write.service.js","../src/securityGroup/configure/CreateSecurityGroupCtrl.js","../src/securityGroup/configure/EditSecurityGroupCtrl.js","../src/securityGroup/clone/cloneSecurityGroup.controller.js","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/configure/wizard/ServerGroupInstanceArchetype.controller.js","../src/serverGroup/configure/wizard/ServerGroupInstanceType.controller.js","../src/serverGroup/configure/wizard/advancedSettings/ServerGroupAdvancedSettings.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.js","../src/serverGroup/configure/wizard/basicSettings/image.regional.filter.js","../src/serverGroup/configure/wizard/basicSettings/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/capacity/capacitySelector.directive.js","../src/serverGroup/configure/wizard/healthSettings/ServerGroupHealthSettings.controller.js","../src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.js","../src/serverGroup/configure/wizard/image/ServerGroupImageSettings.controller.js","../src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.js","../src/serverGroup/configure/wizard/loadBalancers/ServerGroupLoadBalancers.controller.js","../src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettings.controller.js","../src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.js","../src/serverGroup/configure/wizard/securityGroup/ServerGroupSecurityGroups.controller.js","../src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.js","../src/serverGroup/configure/wizard/tags/tagsSelector.directive.js","../src/serverGroup/configure/wizard/zones/zoneSelector.directive.js","../src/serverGroup/configure/serverGroup.configure.azure.module.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.azure.controller.js","../src/common/AzureModalFooter.tsx","../src/serverGroup/details/rollback/RollbackServerGroupModal.tsx","../src/serverGroup/details/serverGroupDetails.azure.controller.js","../src/serverGroup/details/serverGroup.details.module.js","../src/validation/applicationName.validator.js","../../../node_modules/style-inject/dist/style-inject.es.js","../src/azure.module.ts","../src/logo/logo_azure.png"],"sourcesContent":["export interface ITagResult {\n isValid: boolean;\n error: TagError | null;\n errorMessage?: string;\n}\n\nexport enum TagError {\n TAG_NUMBER_EXCEED,\n TAG_KEY_LENGTH_EXCEED,\n TAG_VALUE_LENGTH_EXCEED,\n TAG_KEY_INVALID_CHARACTER,\n TAG_VALUE_INVALID_CHARACTER,\n TAG_OBJECT_UNDEFINED,\n}\n\nexport interface IAzureLoadBalancer {\n type: string;\n description: string;\n}\n\nexport const AzureLoadBalancerTypes: IAzureLoadBalancer[] = [\n {\n type: 'Azure Load Balancer',\n description: '',\n },\n {\n type: 'Azure Application Gateway',\n description: '',\n },\n];\n\nexport default class Utility {\n public static readonly TAG_LIMITATION: number = 8;\n public static readonly TAG_KEY_LENGTH_LIMITATION: number = 512;\n public static readonly TAG_VALUE_LENGTH_LIMITATION: number = 256;\n public static readonly TAG_INVALID_CHAR_REG_EXR: RegExp = /[<>%&\\\\?/]/;\n\n public static checkTags(tagsObject: { [s: string]: string }): ITagResult {\n if (!tagsObject) {\n return {\n isValid: false,\n error: TagError.TAG_OBJECT_UNDEFINED,\n errorMessage: 'instanceTags is not defined',\n };\n }\n const length: number = Object.keys(tagsObject).length;\n if (!(length >= 0 && length <= Utility.TAG_LIMITATION)) {\n return {\n isValid: false,\n error: TagError.TAG_NUMBER_EXCEED,\n errorMessage: `Number of tags exceeds the limit: ${Utility.TAG_LIMITATION}`,\n };\n }\n\n for (const [k, v] of Object.entries(tagsObject)) {\n if (k.length > Utility.TAG_KEY_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_LENGTH_EXCEED,\n errorMessage: `Length of Tag key: ${k} exceeds the limit: ${Utility.TAG_KEY_LENGTH_LIMITATION}`,\n };\n }\n if (v.length > Utility.TAG_VALUE_LENGTH_LIMITATION) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_LENGTH_EXCEED,\n errorMessage: `Length of Tag value: ${v} exceeds the limit: ${Utility.TAG_VALUE_LENGTH_LIMITATION}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(k)) {\n return {\n isValid: false,\n error: TagError.TAG_KEY_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag key: ${k}`,\n };\n }\n if (Utility.TAG_INVALID_CHAR_REG_EXR.test(v)) {\n return {\n isValid: false,\n error: TagError.TAG_VALUE_INVALID_CHARACTER,\n errorMessage: `Invalid characters in Tag value: ${v}`,\n };\n }\n }\n return {\n isValid: true,\n error: null,\n };\n }\n\n public static getLoadBalancerType(typeString: string): IAzureLoadBalancer | null {\n typeString = typeString.toLowerCase().split('_').join(' ');\n return AzureLoadBalancerTypes.find((lb: IAzureLoadBalancer) => lb.type.toLowerCase() === typeString) || null;\n }\n}\n","import { HelpContentsRegistry } from '@spinnaker/core';\nimport Utility from '../utility';\n\nconst helpContents: { [key: string]: string } = {\n 'azure.securityGroup.ingress.description': 'Friendly description of the rule you want to enable (limit 80 chars.)',\n 'azure.securityGroup.ingress.priority':\n \"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.\",\n 'azure.securityGroup.ingress.source':\n \"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.sourcePortRange':\n 'The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.destination':\n \"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.\",\n 'azure.securityGroup.ingress.destinationPortRange':\n 'The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.',\n 'azure.securityGroup.ingress.direction': 'Specifies whether the rule is for inbound or outbound traffic.',\n 'azure.securityGroup.ingress.actions':\n 'To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.',\n 'azure.securityGroup.ingress.destPortRanges':\n 'Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.',\n 'azure.securityGroup.ingress.sourceIPCIDRRanges':\n 'Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24',\n 'azure.serverGroup.imageName': '(Required) <b>Image</b> is the deployable Azure Machine Image.',\n 'azure.serverGroup.stack':\n '(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'azure.serverGroup.detail':\n '(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n 'azure.serverGroup.scriptLocation':\n 'The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2',\n 'azure.serverGroup.commandToExecute':\n 'Command(s) to execute custom scripts provided during provisioning of an instance.',\n 'azure.serverGroup.customData': 'Script or metadata to be injected into each instances.',\n 'azure.serverGroup.customTags': `Custom tags on Virtual Machine Scale Set. Allow ${Utility.TAG_LIMITATION} tags at most.`,\n 'azure.serverGroup.enableInboundNAT':\n '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. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.',\n 'azure.serverGroup.lun':\n 'Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.',\n 'azure.serverGroup.diskSizeGB':\n 'Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB',\n 'azure.serverGroup.managedDisk.storageAccountType':\n 'You can choose between Azure managed disks types to support your workload or scenario.',\n 'azure.serverGroup.caching':\n 'Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.',\n 'azure.serverGroup.userAssignedIdentities':\n 'Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview',\n 'azure.loadBalancer.dnsName':\n 'If there is no custom DNS label specified, a default DNS name will be created. The default value will be \"GeneratedText.cloudapp.net\" for Azure Application Gateway or \"GeneratedText.[region].cloudapp.azure.com\" for Azure Load Balancer.',\n 'azure.loadBalancer.probes.probeInterval':\n 'Probe interval in seconds. This value is the time interval between two consecutive probes.',\n 'azure.loadBalancer.probes.timeout':\n 'Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.',\n 'azure.loadBalancer.probes.unhealthyThreshold':\n 'Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.',\n 'azure.loadBalancer.loadBalancingRules.idleTimeout':\n 'Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.',\n 'azure.loadBalancer.loadBalancingRules.sessionPersistence':\n 'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. \"None\" specifies that successive requests from the same client may be handled by any virtual machine. \"Client IP\" specifies that successive requests from the same client IP address will be handled by the same virtual machine. \"Client IP and protocol\" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nexport const AZURE_IMAGE_IMAGE_READER = 'spinnaker.azure.image.reader';\nexport const name = AZURE_IMAGE_IMAGE_READER; // for backwards compatibility\nmodule(AZURE_IMAGE_IMAGE_READER, []).factory('azureImageReader', function () {\n function findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .then(\n function (results) {\n return results;\n },\n function () {\n return [];\n },\n );\n }\n\n function getImage(amiName, region, credentials) {\n return REST('/images')\n .path(credentials, region, amiName)\n .query({ provider: 'azure' })\n .get()\n .then(\n function (results) {\n return results && results.length ? results[0] : null;\n },\n function () {\n return null;\n },\n );\n }\n\n return {\n findImages: findImages,\n getImage: getImage,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE = 'spinnaker.azure.instanceType.service';\nexport const name = AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE; // for backwards compatibility\nmodule(AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE, []).factory('azureInstanceTypeService', [\n '$q',\n function ($q) {\n const B = {\n type: 'B-series',\n description:\n 'The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.',\n instanceTypes: [\n {\n name: 'Standard_B1ms',\n label: 'Standard_B1ms',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 4,\n },\n },\n {\n name: 'Standard_B1s',\n label: 'Standard_B1s',\n cpu: 1,\n memory: 1,\n storage: {\n type: 'SSD',\n count: 2,\n size: 2,\n },\n },\n {\n name: 'Standard_B2ms',\n label: 'Standard_B2ms',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_B2s',\n label: 'Standard_B2s',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 8,\n },\n },\n {\n name: 'Standard_B4ms',\n label: 'Standard_B4ms',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_B8ms',\n label: 'Standard_B8ms',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_B1ls',\n label: 'Standard_B1ls',\n cpu: 1,\n memory: 0.5,\n storage: {\n type: 'SSD',\n count: 2,\n size: 1,\n },\n },\n ],\n };\n\n const DSV3 = {\n type: 'Dsv3-series',\n description:\n 'The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2s_v3',\n label: 'Standard_D2s_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 16,\n },\n },\n {\n name: 'Standard_D4s_v3',\n label: 'Standard_D4s_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 32,\n },\n },\n {\n name: 'Standard_D8s_v3',\n label: 'Standard_D8s_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 64,\n },\n },\n {\n name: 'Standard_D16s_v3',\n label: 'Standard_D16s_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 128,\n },\n },\n {\n name: 'Standard_D32s_v3',\n label: 'Standard_D32s_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 256,\n },\n },\n {\n name: 'Standard_D64s_v3',\n label: 'Standard_D64s_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 512,\n },\n },\n ],\n };\n\n const DV3 = {\n type: 'Dv3-series',\n description:\n 'The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.',\n instanceTypes: [\n {\n name: 'Standard_D2_v3',\n label: 'Standard_D2_v3',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D4_v3',\n label: 'Standard_D4_v3',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D8_v3',\n label: 'Standard_D8_v3',\n cpu: 8,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D16_v3',\n label: 'Standard_D16_v3',\n cpu: 16,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D32_v3',\n label: 'Standard_D32_v3',\n cpu: 32,\n memory: 128,\n storage: {\n type: 'SSD',\n count: 32,\n size: 800,\n },\n },\n {\n name: 'Standard_D64_v3',\n label: 'Standard_D64_v3',\n cpu: 64,\n memory: 256,\n storage: {\n type: 'SSD',\n count: 32,\n size: 1600,\n },\n },\n ],\n };\n\n const DSV2 = {\n type: 'DSv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DS1_v2',\n label: 'Standard_DS1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 7,\n },\n },\n {\n name: 'Standard_DS2_v2',\n label: 'Standard_DS2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 14,\n },\n },\n {\n name: 'Standard_DS3_v2',\n label: 'Standard_DS3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 28,\n },\n },\n {\n name: 'Standard_DS4_v2',\n label: 'Standard_DS4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 56,\n },\n },\n {\n name: 'Standard_DS5_v2',\n label: 'Standard_DS5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 112,\n },\n },\n {\n name: 'Standard_DS11_v2',\n label: 'Standard_DS11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 28,\n },\n },\n {\n name: 'Standard_DS12_v2',\n label: 'Standard_DS12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 56,\n },\n },\n {\n name: 'Standard_DS13_v2',\n label: 'Standard_DS13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 112,\n },\n },\n {\n name: 'Standard_DS14_v2',\n label: 'Standard_DS14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 224,\n },\n },\n {\n name: 'Standard_DS15_v2',\n label: 'Standard_DS15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const DV2 = {\n type: 'Dv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_D1_v2',\n label: 'Standard_D1_v2',\n cpu: 1,\n memory: 3.5,\n storage: {\n type: 'SSD',\n count: 4,\n size: 50,\n },\n },\n {\n name: 'Standard_D2_v2',\n label: 'Standard_D2_v2',\n cpu: 2,\n memory: 7,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D3_v2',\n label: 'Standard_D3_v2',\n cpu: 4,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D4_v2',\n label: 'Standard_D4_v2',\n cpu: 8,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D5_v2',\n label: 'Standard_D5_v2',\n cpu: 16,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D11_v2',\n label: 'Standard_D11_v2',\n cpu: 2,\n memory: 14,\n storage: {\n type: 'SSD',\n count: 8,\n size: 100,\n },\n },\n {\n name: 'Standard_D12_v2',\n label: 'Standard_D12_v2',\n cpu: 4,\n memory: 28,\n storage: {\n type: 'SSD',\n count: 16,\n size: 200,\n },\n },\n {\n name: 'Standard_D13_v2',\n label: 'Standard_D13_v2',\n cpu: 8,\n memory: 56,\n storage: {\n type: 'SSD',\n count: 32,\n size: 400,\n },\n },\n {\n name: 'Standard_D14_v2',\n label: 'Standard_D14_v2',\n cpu: 16,\n memory: 112,\n storage: {\n type: 'SSD',\n count: 64,\n size: 800,\n },\n },\n {\n name: 'Standard_D15_v2',\n label: 'Standard_D15_v2',\n cpu: 20,\n memory: 140,\n storage: {\n type: 'SSD',\n count: 64,\n size: 280,\n },\n },\n ],\n };\n\n const AV2 = {\n type: 'Av2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_A1_v2',\n label: 'Standard_A1_v2',\n cpu: 1,\n memory: 2,\n storage: {\n type: 'SSD',\n count: 2,\n size: 10,\n },\n },\n {\n name: 'Standard_A2m_v2',\n label: 'Standard_A2m_v2',\n cpu: 2,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A2_v2',\n label: 'Standard_A2_v2',\n cpu: 2,\n memory: 4,\n storage: {\n type: 'SSD',\n count: 4,\n size: 20,\n },\n },\n {\n name: 'Standard_A4m_v2',\n label: 'Standard_A4m_v2',\n cpu: 4,\n memory: 32,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A4_v2',\n label: 'Standard_A4_v2',\n cpu: 4,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 8,\n size: 40,\n },\n },\n {\n name: 'Standard_A8m_v2',\n label: 'Standard_A8m_v2',\n cpu: 8,\n memory: 64,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n {\n name: 'Standard_A8_v2',\n label: 'Standard_A8_v2',\n cpu: 8,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 16,\n size: 80,\n },\n },\n ],\n };\n\n const DC = {\n type: 'DC-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_DC2s',\n label: 'Standard_DC2s',\n cpu: 2,\n memory: 8,\n storage: {\n type: 'SSD',\n count: 2,\n size: 100,\n },\n },\n {\n name: 'Standard_DC4s',\n label: 'Standard_DC4s',\n cpu: 4,\n memory: 16,\n storage: {\n type: 'SSD',\n count: 4,\n size: 200,\n },\n },\n ],\n };\n\n const FSV2 = {\n type: 'Fsv2-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F2s_v2',\n label: 'Standard_F2s_v2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F4s_v2',\n label: 'Standard_F4s_v2',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F8s_v2',\n label: 'Standard_F8s_v2',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F16s_v2',\n label: 'Standard_F16s_v2',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F32s_v2',\n label: 'Standard_F32s_v2',\n cpu: 32,\n memory: 64,\n storage: { type: 'SSD', count: 32, size: 256 },\n },\n {\n name: 'Standard_F64s_v2',\n label: 'Standard_F64s_v2',\n cpu: 64,\n memory: 128,\n storage: { type: 'SSD', count: 32, size: 512 },\n },\n {\n name: 'Standard_F72s_v2',\n label: 'Standard_F72s_v2',\n cpu: 72,\n memory: 144,\n storage: { type: 'SSD', count: 32, size: 576 },\n },\n ],\n };\n\n const FS = {\n type: 'Fs-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1s',\n label: 'Standard_F1s',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 4 },\n },\n {\n name: 'Standard_F2s',\n label: 'Standard_F2s',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 8 },\n },\n {\n name: 'Standard_F4s',\n label: 'Standard_F4s',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 16 },\n },\n {\n name: 'Standard_F8s',\n label: 'Standard_F8s',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 32 },\n },\n {\n name: 'Standard_F16s',\n label: 'Standard_F16s',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 64 },\n },\n ],\n };\n\n const F = {\n type: 'F-series',\n description: '',\n instanceTypes: [\n {\n name: 'Standard_F1',\n label: 'Standard_F1',\n cpu: 1,\n memory: 2,\n storage: { type: 'SSD', count: 4, size: 16 },\n },\n {\n name: 'Standard_F2',\n label: 'Standard_F2',\n cpu: 2,\n memory: 4,\n storage: { type: 'SSD', count: 8, size: 32 },\n },\n {\n name: 'Standard_F4',\n label: 'Standard_F4',\n cpu: 4,\n memory: 8,\n storage: { type: 'SSD', count: 16, size: 64 },\n },\n {\n name: 'Standard_F8',\n label: 'Standard_F8',\n cpu: 8,\n memory: 16,\n storage: { type: 'SSD', count: 32, size: 128 },\n },\n {\n name: 'Standard_F16',\n label: 'Standard_F16',\n cpu: 16,\n memory: 32,\n storage: { type: 'SSD', count: 64, size: 256 },\n },\n ],\n };\n\n const categories = [\n {\n type: 'general',\n label: 'General Purpose',\n description:\n 'Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.',\n families: [B, DSV3, DV3, DSV2, DV2, AV2, DC],\n icon: 'hdd',\n },\n {\n type: 'compute',\n label: 'Compute Optimized',\n description:\n 'High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.',\n families: [FSV2, FS, F],\n icon: 'hdd',\n },\n {\n type: 'custom',\n label: 'Custom Type',\n description: 'Select the instance type below.',\n families: [],\n icon: 'asterisk',\n },\n ];\n\n function calculateStorage(type) {\n if (!type || !type.storage) {\n return 0;\n }\n return type.storage.count * type.storage.size;\n }\n\n function buildStats(category) {\n const stats = {\n cpu: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n memory: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n storage: {\n min: Number.MAX_VALUE,\n max: -Number.MAX_VALUE,\n },\n families: [],\n };\n\n if (category.families && category.families.length) {\n category.families.forEach(function (family) {\n stats.families.push(family.type);\n const cpuMin = _.minBy(family.instanceTypes, 'cpu').cpu || Number.MAX_VALUE;\n const cpuMax = _.maxBy(family.instanceTypes, 'cpu').cpu || -Number.MAX_VALUE;\n const memoryMin = _.minBy(family.instanceTypes, 'memory').memory || Number.MAX_VALUE;\n const memoryMax = _.maxBy(family.instanceTypes, 'memory').memory || -Number.MAX_VALUE;\n const storageMin = calculateStorage(_.minBy(family.instanceTypes, calculateStorage)) || Number.MAX_VALUE;\n const storageMax = calculateStorage(_.maxBy(family.instanceTypes, calculateStorage)) || -Number.MAX_VALUE;\n\n stats.cpu.min = Math.min(stats.cpu.min, cpuMin);\n stats.cpu.max = Math.max(stats.cpu.max, cpuMax);\n stats.memory.min = Math.min(stats.memory.min, memoryMin);\n stats.memory.max = Math.max(stats.memory.max, memoryMax);\n stats.storage.min = Math.min(stats.storage.min, storageMin);\n stats.storage.max = Math.max(stats.storage.max, storageMax);\n });\n }\n\n return stats;\n }\n\n function getCategories() {\n categories.map(function (category) {\n for (const family of category.families) {\n for (const inst of family.instanceTypes) {\n if (inst.costFactor == undefined) inst.costFactor = 0;\n }\n }\n category.stats = buildStats(category);\n });\n return $q.when(categories);\n }\n\n const getAllTypesByRegion = function getAllTypesByRegion() {\n return getCategories();\n };\n\n function getAvailableTypesForRegions(locationToInstanceTypesMap, selectedLocations) {\n // This function is only ever called with one location.\n const [location] = selectedLocations;\n return locationToInstanceTypesMap[location];\n }\n\n return {\n getCategories: getCategories,\n getAvailableTypesForRegions: getAvailableTypesForRegions,\n getAllTypesByRegion: getAllTypesByRegion,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n} from '@spinnaker/core';\n\nexport const AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.azure.instance.detail.controller';\nexport const name = AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'azureInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n '$q',\n function ($scope, $state, $uibModal, instance, app, $q) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('azure', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Azure' || metric.state !== 'Unknown';\n });\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then(\n function (details) {\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n const discoveryMetric = _.find($scope.healthMetrics, function (metric) {\n return metric.type === 'Discovery';\n });\n if (discoveryMetric && discoveryMetric.vipAddress) {\n const vipList = discoveryMetric.vipAddress;\n $scope.instance.vipAddress = vipList.includes(',') ? vipList.split(',') : [vipList];\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n },\n function () {\n // When an instance is first starting up, we may not have the details cached in oort yet, but we still\n // want to let the user see what details we have\n $scope.state.loading = false;\n $state.go('^');\n },\n );\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n this.canDeregisterFromLoadBalancer = function () {\n return $scope.instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n };\n\n this.canRegisterWithLoadBalancer = function () {\n const instance = $scope.instance;\n if (!instance.loadBalancers || !instance.loadBalancers.length) {\n return false;\n }\n const outOfService = instance.health.some(function (health) {\n return health.type === 'LoadBalancer' && health.state === 'OutOfService';\n });\n const hasLoadBalancerHealth = instance.health.some(function (health) {\n return health.type === 'LoadBalancer';\n });\n return outOfService || !hasLoadBalancerHealth;\n };\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const discoveryHealth = instance.health.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rebootInstance = function rebootInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Rebooting ' + instance.instanceId,\n };\n\n const submitMethod = function () {\n return InstanceWriter.rebootInstance(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really reboot ' + instance.instanceId + '?',\n buttonText: 'Reboot ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.registerInstanceWithLoadBalancer = function registerInstanceWithLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Registering ' + instance.instanceId + ' with ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.registerInstanceWithLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really register ' + instance.instanceId + ' with ' + loadBalancerNames + '?',\n buttonText: 'Register ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.deregisterInstanceFromLoadBalancer = function deregisterInstanceFromLoadBalancer() {\n const instance = $scope.instance;\n const loadBalancerNames = instance.loadBalancers.join(' and ');\n\n const taskMonitor = {\n application: app,\n title: 'Deregistering ' + instance.instanceId + ' from ' + loadBalancerNames,\n };\n\n const submitMethod = function () {\n return InstanceWriter.deregisterInstanceFromLoadBalancer(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really deregister ' + instance.instanceId + ' from ' + loadBalancerNames + '?',\n buttonText: 'Deregister ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n return instance.health.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import React from 'react';\nimport { Button, Modal } from 'react-bootstrap';\n\nimport type { ILoadBalancerModalProps } from '@spinnaker/core';\nimport { CloudProviderRegistry, ModalClose, ModalInjector, noop, ReactModal } from '@spinnaker/core';\n\nimport type { IAzureLoadBalancer } from '../../utility';\nimport { AzureLoadBalancerTypes } from '../../utility';\n\nexport interface IAzureLoadBalancerChoiceModalState {\n choices: IAzureLoadBalancer[];\n selectedChoice: IAzureLoadBalancer;\n}\n\nexport class AzureLoadBalancerChoiceModal extends React.Component<\n ILoadBalancerModalProps,\n IAzureLoadBalancerChoiceModalState\n> {\n public static defaultProps: Partial<ILoadBalancerModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: ILoadBalancerModalProps): Promise<void> {\n return ReactModal.show(AzureLoadBalancerChoiceModal, {\n ...props,\n className: 'create-pipeline-modal-overflow-visible',\n });\n }\n\n constructor(props: ILoadBalancerModalProps) {\n super(props);\n this.state = {\n choices: AzureLoadBalancerTypes,\n selectedChoice: AzureLoadBalancerTypes[0],\n };\n }\n\n public choiceSelected(choice: IAzureLoadBalancer): void {\n this.setState({ selectedChoice: choice });\n }\n\n private choose = (): void => {\n this.close();\n const provider: any = CloudProviderRegistry.getValue('azure', 'loadBalancer');\n ModalInjector.modalService\n .open({\n templateUrl: provider.createLoadBalancerTemplateUrl,\n windowClass: 'modal-z-index',\n controller: `${provider.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.props.app,\n loadBalancer: (): any => null,\n isNew: () => true,\n forPipelineConfig: () => false,\n loadBalancerType: () => this.state.selectedChoice,\n },\n })\n .result.catch(() => {});\n };\n\n public close = (reason?: any): void => {\n this.props.dismissModal(reason);\n };\n\n public render() {\n const { choices, selectedChoice } = this.state;\n\n return (\n <>\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Select Type of Load Balancer</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"modal-body\">\n <div className=\"card-choices\">\n {choices.map((choice) => (\n <div\n key={choice.type}\n className={`card ${selectedChoice === choice ? 'active' : ''}`}\n onClick={() => this.choiceSelected(choice)}\n >\n <h3 className=\"load-balancer-label\">{choice.type}</h3>\n <div>{choice.description}</div>\n </div>\n ))}\n </div>\n <div className=\"load-balancer-description\" />\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button onClick={this.choose}>\n Configure Load Balancer <span className=\"glyphicon glyphicon-chevron-right\" />\n </Button>\n </Modal.Footer>\n </>\n );\n }\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IAzureProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const AzureProviderSettings: IAzureProviderSettings = (SETTINGS.providers.azure as IAzureProviderSettings) || {\n defaults: {},\n};\nif (AzureProviderSettings) {\n AzureProviderSettings.resetToOriginal = SETTINGS.resetProvider('azure');\n}\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AzureProviderSettings } from '../azure.settings';\n\nexport const AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER = 'spinnaker.azure.loadBalancer.transformer';\nexport const name = AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER, []).factory('azureLoadBalancerTransformer', [\n '$q',\n function ($q) {\n function normalizeLoadBalancer(loadBalancer) {\n loadBalancer.serverGroups.forEach(function (serverGroup) {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = serverGroup.detachedInstances.map(function (instanceId) {\n return { id: instanceId };\n });\n serverGroup.instances = serverGroup.instances.concat(serverGroup.detachedInstances);\n } else {\n serverGroup.detachedInstances = [];\n }\n });\n const activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups).map('instances').flatten().value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups).map('detachedInstances').flatten().value();\n return $q.resolve(loadBalancer);\n }\n\n function convertLoadBalancerForEditing(loadBalancer) {\n const toEdit = {\n region: loadBalancer.region,\n credentials: loadBalancer.account,\n name: loadBalancer.name,\n stack: loadBalancer.stack,\n detail: loadBalancer.detail,\n vnet: loadBalancer.vnet,\n subnet: loadBalancer.subnet,\n probes: [],\n loadBalancingRules: [],\n };\n\n if (loadBalancer.elb) {\n const elb = loadBalancer.elb;\n\n toEdit.securityGroups = elb.securityGroups;\n toEdit.vnet = elb.vnet;\n\n if (elb.loadBalancingRules) {\n toEdit.loadBalancingRules = elb.loadBalancingRules;\n }\n\n toEdit.probes = elb.probes;\n if (elb.dnsName && elb.dnsName !== 'dns-not-found') {\n toEdit.dnsName = elb.dnsName.split('.')[0];\n }\n }\n return toEdit;\n }\n\n function constructNewLoadBalancerTemplate(application) {\n const defaultCredentials = application.defaultCredentials.azure || AzureProviderSettings.defaults.account;\n const defaultRegion = application.defaultRegions.azure || AzureProviderSettings.defaults.region;\n return {\n stack: '',\n detail: 'frontend',\n credentials: defaultCredentials,\n region: defaultRegion,\n cloudProvider: 'azure',\n vnet: null,\n subnet: null,\n probes: [\n {\n probeName: '',\n probeProtocol: 'HTTP',\n probePort: '80',\n probePath: '/',\n probeInterval: 30,\n unhealthyThreshold: 8,\n timeout: 120,\n },\n ],\n securityGroups: [],\n loadBalancingRules: [\n {\n ruleName: '',\n protocol: 'HTTP',\n externalPort: 80,\n backendPort: 80,\n probeName: '',\n persistence: 'None',\n idleTimeout: 4,\n },\n ],\n sku: 'Standard_v2',\n };\n }\n\n return {\n normalizeLoadBalancer: normalizeLoadBalancer,\n convertLoadBalancerForEditing: convertLoadBalancerForEditing,\n constructNewLoadBalancerTemplate: constructNewLoadBalancerTemplate,\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, LoadBalancerWriter, NameUtils, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from '../loadBalancer.transformer';\n\nexport const AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER =\n 'spinnaker.azure.loadBalancer.create.controller';\nexport const name = AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER; // for backwards compatibility\nmodule(AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n]).controller('azureCreateLoadBalancerCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n 'azureLoadBalancerTransformer',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'loadBalancerType',\n function (\n $scope,\n $uibModalInstance,\n $state,\n azureLoadBalancerTransformer,\n application,\n loadBalancer,\n isNew,\n loadBalancerType,\n ) {\n const ctrl = this;\n\n $scope.regions = [];\n\n $scope.pages = {\n location: require('./createLoadBalancerProperties.html'),\n listeners: require('./listeners.html'),\n healthCheck: require('./healthCheck.html'),\n advancedSettings: require('./advancedSettings.html'),\n };\n\n $scope.isNew = isNew;\n $scope.loadBalancerType = loadBalancerType.type;\n $scope.isALB = loadBalancerType.type === 'Azure Load Balancer';\n\n $scope.state = {\n accountsLoaded: false,\n submitting: false,\n };\n\n $scope.validSkus = ['Standard_v2', 'Standard_Small'];\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.loadBalancer.name,\n accountId: $scope.loadBalancer.credentials,\n region: $scope.loadBalancer.region,\n provider: 'azure',\n };\n\n if (!$state.includes('**.loadBalancerDetails')) {\n $state.go('.loadBalancerDetails', newStateParams);\n } else {\n $state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.loadBalancers.refresh();\n application.loadBalancers.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: (isNew ? 'Creating ' : 'Updating ') + 'your load balancer',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function initializeCreateMode() {\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accountsLoaded = true;\n ctrl.accountUpdated();\n });\n }\n\n function initializeController() {\n if (loadBalancer) {\n $scope.loadBalancer = azureLoadBalancerTransformer.convertLoadBalancerForEditing(loadBalancer);\n if (isNew) {\n const nameParts = NameUtils.parseLoadBalancerName($scope.loadBalancer.name);\n $scope.loadBalancer.stack = nameParts.stack;\n $scope.loadBalancer.detail = nameParts.freeFormDetails;\n delete $scope.loadBalancer.name;\n }\n } else {\n $scope.loadBalancer = azureLoadBalancerTransformer.constructNewLoadBalancerTemplate(application);\n }\n if (isNew) {\n updateLoadBalancerNames();\n initializeCreateMode();\n }\n }\n\n function updateLoadBalancerNames() {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n\n const accountLoadBalancersByRegion = {};\n application\n .getDataSource('loadBalancers')\n .refresh(true)\n .then(() => {\n application.getDataSource('loadBalancers').data.forEach((loadBalancer) => {\n if (loadBalancer.account === account) {\n accountLoadBalancersByRegion[loadBalancer.region] =\n accountLoadBalancersByRegion[loadBalancer.region] || [];\n accountLoadBalancersByRegion[loadBalancer.region].push(loadBalancer.name);\n }\n });\n\n $scope.existingLoadBalancerNames = accountLoadBalancersByRegion[region] || [];\n });\n }\n\n initializeController();\n\n this.requiresHealthCheckPath = function () {\n return (\n $scope.loadBalancer.probes[0].probeProtocol && $scope.loadBalancer.probes[0].probeProtocol.indexOf('HTTP') === 0\n );\n };\n\n this.updateName = function () {\n $scope.loadBalancer.name = this.getName();\n };\n\n this.getName = function () {\n const elb = $scope.loadBalancer;\n const elbName = [application.name, elb.stack || '', elb.detail || ''].join('-');\n return _.trimEnd(elbName, '-');\n };\n\n this.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.loadBalancer.credentials).then(function (regions) {\n $scope.regions = regions;\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n updateLoadBalancerNames();\n ctrl.updateName();\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.loadBalancer.credentials;\n const region = $scope.loadBalancer.region;\n $scope.loadBalancer.selectedVnet = null;\n $scope.loadBalancer.vnet = null;\n $scope.loadBalancer.vnetResourceGroup = null;\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.loadBalancer.vnet = item.name;\n $scope.loadBalancer.vnetResourceGroup = item.resourceGroup;\n $scope.loadBalancer.selectedSubnet = null;\n $scope.loadBalancer.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n if (device && device.type !== 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n ctrl.selectedSubnets.push(subnet);\n }\n });\n }\n };\n\n this.removeListener = function (index) {\n $scope.loadBalancer.loadBalancingRules.splice(index, 1);\n };\n\n this.addListener = function () {\n $scope.loadBalancer.loadBalancingRules.push({ protocol: 'HTTP' });\n };\n\n this.submit = function () {\n const descriptor = isNew ? 'Create' : 'Update';\n\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n clusterName: $scope.loadBalancer.clusterName,\n resourceGroupName: $scope.loadBalancer.clusterName,\n loadBalancerName: $scope.loadBalancer.name,\n };\n\n if ($scope.loadBalancer.selectedVnet) {\n $scope.loadBalancer.vnet = $scope.loadBalancer.selectedVnet.name;\n $scope.loadBalancer.vnetResourceGroup = $scope.loadBalancer.selectedVnet.resourceGroup;\n }\n\n if ($scope.loadBalancer.selectedSubnet) {\n $scope.loadBalancer.subnet = $scope.loadBalancer.selectedSubnet.name;\n }\n\n const name = $scope.loadBalancer.clusterName || $scope.loadBalancer.name;\n const probeName = name + '-probe';\n const ruleNameBase = name + '-rule';\n $scope.loadBalancer.type = 'upsertLoadBalancer';\n $scope.loadBalancer.loadBalancerType = $scope.loadBalancerType;\n if (!$scope.loadBalancer.vnet && !$scope.loadBalancer.subnetType) {\n $scope.loadBalancer.securityGroups = null;\n }\n\n $scope.loadBalancer.probes[0].probeName = probeName;\n\n $scope.loadBalancer.loadBalancingRules.forEach((rule, index) => {\n rule.ruleName = ruleNameBase + index;\n rule.probeName = probeName;\n });\n\n if ($scope.loadBalancer.probes[0].probeProtocol === 'TCP') {\n $scope.loadBalancer.probes[0].probePath = undefined;\n }\n\n return LoadBalancerWriter.upsertLoadBalancer($scope.loadBalancer, application, descriptor, params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n LOAD_BALANCER_READ_SERVICE,\n LoadBalancerWriter,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER =\n 'spinnaker.azure.loadBalancer.details.controller';\nexport const name = AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER, [\n ANGULAR_UI_BOOTSTRAP,\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n LOAD_BALANCER_READ_SERVICE,\n ])\n .controller('azureLoadBalancerDetailsCtrl', [\n '$scope',\n '$state',\n '$exceptionHandler',\n '$uibModal',\n 'loadBalancer',\n 'app',\n 'securityGroupReader',\n 'loadBalancerReader',\n '$q',\n function (\n $scope,\n $state,\n $exceptionHandler,\n $uibModal,\n loadBalancer,\n app,\n securityGroupReader,\n loadBalancerReader,\n $q,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n function extractLoadBalancer() {\n $scope.loadBalancer = app.loadBalancers.data.filter(function (test) {\n return (\n test.name === loadBalancer.name &&\n test.region === loadBalancer.region &&\n test.account === loadBalancer.accountId\n );\n })[0];\n\n if ($scope.loadBalancer) {\n const detailsLoader = loadBalancerReader.getLoadBalancerDetails(\n $scope.loadBalancer.provider,\n loadBalancer.accountId,\n loadBalancer.region,\n loadBalancer.name,\n );\n\n return detailsLoader.then(function (details) {\n $scope.state.loading = false;\n const securityGroups = [];\n\n const filtered = details.filter(function (test) {\n return test.name === loadBalancer.name;\n });\n\n if (filtered.length) {\n $scope.loadBalancer.elb = filtered[0];\n\n $scope.loadBalancer.account = loadBalancer.accountId;\n\n if ($scope.loadBalancer.elb.securityGroups) {\n $scope.loadBalancer.elb.securityGroups.forEach(function (securityGroupId) {\n const match = securityGroupReader.getApplicationSecurityGroup(\n app,\n loadBalancer.accountId,\n loadBalancer.region,\n securityGroupId,\n );\n if (match) {\n securityGroups.push(match);\n }\n });\n $scope.securityGroups = _.sortBy(securityGroups, 'name');\n }\n\n if ($scope.loadBalancer.loadBalancerType && $scope.loadBalancer.loadBalancerType.includes('_')) {\n const type = $scope.loadBalancer.loadBalancerType;\n $scope.loadBalancer.loadBalancerType = type\n .split('_')\n .map((s) => {\n const ss = s.toLowerCase();\n return ss.substring(0, 1).toUpperCase() + ss.substring(1);\n })\n .join(' ');\n }\n }\n });\n }\n if (!$scope.loadBalancer) {\n $state.go('^');\n }\n\n return $q.when(null);\n }\n\n app\n .ready()\n .then(extractLoadBalancer)\n .then(() => {\n // If the user navigates away from the view before the initial extractLoadBalancer call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.onRefresh($scope, extractLoadBalancer);\n }\n });\n\n this.editLoadBalancer = function editLoadBalancer() {\n $uibModal.open({\n templateUrl: require('../configure/editLoadBalancer.html'),\n controller: 'azureCreateLoadBalancerCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: function () {\n return app;\n },\n loadBalancer: function () {\n return angular.copy($scope.loadBalancer);\n },\n isNew: function () {\n return false;\n },\n loadBalancerType: function () {\n return { type: $scope.loadBalancer.loadBalancerType };\n },\n },\n });\n };\n\n this.deleteLoadBalancer = function deleteLoadBalancer() {\n if ($scope.loadBalancer.instances && $scope.loadBalancer.instances.length) {\n return;\n }\n\n const taskMonitor = {\n application: app,\n title: 'Deleting ' + loadBalancer.name,\n };\n\n const command = {\n cloudProvider: 'azure',\n loadBalancerName: $scope.loadBalancer.name,\n loadBalancerType: $scope.loadBalancer.loadBalancerType,\n credentials: $scope.loadBalancer.account,\n region: loadBalancer.region,\n appName: app.name,\n };\n\n const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, app);\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + loadBalancer.name + '?',\n buttonText: 'Delete ' + loadBalancer.name,\n account: loadBalancer.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { SETTINGS } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.azure.pipeline.stage.bake.executionDetails.controller';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'azureBakeExecutionDetailsCtrl',\n [\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($scope, $stateParams, executionDetailsSectionService, $interpolate) {\n $scope.configSections = ['bakeConfig', 'taskStatus'];\n\n const initialized = () => {\n $scope.detailsSection = $stateParams.details;\n $scope.provider = $scope.stage.context.cloudProviderType || 'azure';\n $scope.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' &&\n SETTINGS.feature.roscoSelector($scope.stage.context));\n $scope.bakeryDetailUrl = $interpolate(\n $scope.roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl,\n );\n };\n\n const initialize = () => executionDetailsSectionService.synchronizeSection($scope.configSections, initialized);\n\n initialize();\n\n $scope.$on('$stateChangeSuccess', initialize);\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.azure.serverGroup.transformer';\nexport const name = AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('azureServerGroupTransformer', function () {\n function normalizeServerGroup(serverGroup) {\n return serverGroup;\n }\n\n function parseCustomScriptsSettings(command, configuration) {\n /*\n At the first time this wizard pops up, the type of command.customScriptsSettings.fileUris is String. As for the following\n occurrences of its pop up with this field unchanged, its type becomes an array. So here differentiate the two scenarios\n to assign the correct value to model.\n */\n if (Array.isArray(command.customScriptsSettings.fileUris)) {\n configuration.customScriptsSettings.fileUris = command.customScriptsSettings.fileUris;\n } else {\n const fileUrisTemp = command.customScriptsSettings.fileUris;\n if (fileUrisTemp.includes(',')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(',');\n } else if (fileUrisTemp.includes(';')) {\n configuration.customScriptsSettings.fileUris = fileUrisTemp.split(';');\n } else {\n configuration.customScriptsSettings.fileUris = [fileUrisTemp];\n }\n\n configuration.customScriptsSettings.fileUris.forEach(function (v, index) {\n configuration.customScriptsSettings.fileUris[index] = v.trim();\n });\n }\n }\n\n function convertServerGroupCommandToDeployConfiguration(command) {\n let tempImage;\n\n if (command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline') {\n tempImage = {\n imageName: '',\n isCustom: 'true',\n publisher: '',\n offer: '',\n sku: '',\n version: '',\n region: command.region,\n uri: '',\n ostype: '',\n };\n } else {\n tempImage = command.selectedImage;\n }\n\n const configuration = {\n name: command.application,\n cloudProvider: command.selectedProvider,\n application: command.application,\n stack: command.stack,\n strategy: command.strategy,\n rollback: {\n onFailure: command.rollback ? command.rollback.onFailure : null,\n },\n scaleDown: command.scaleDown,\n maxRemainingAsgs: command.maxRemainingAsgs,\n delayBeforeDisableSec: command.delayBeforeDisableSec,\n delayBeforeScaleDownSec: command.delayBeforeScaleDownSec,\n allowDeleteActive: command.strategy === 'redblack' ? true : null,\n allowScaleDownActive: command.strategy === 'redblack' ? true : null,\n detail: command.freeFormDetails,\n freeFormDetails: command.freeFormDetails,\n healthSettings: command.healthSettings,\n image: command.image,\n account: command.credentials,\n selectedProvider: 'azure',\n vnet: command.vnet,\n vnetResourceGroup: command.selectedVnet.resourceGroup,\n subnet: command.subnet,\n useSourceCapacity: false,\n capacity: {\n min: command.sku.capacity,\n max: command.sku.capacity,\n },\n credentials: command.credentials,\n region: command.region,\n securityGroupName: command.securityGroupName,\n loadBalancerName: command.loadBalancerName,\n loadBalancerType: command.loadBalancerType,\n user: '[anonymous]',\n upgradePolicy: 'Manual',\n type: 'createServerGroup',\n sku: {\n name: 'Standard_DS1_v2',\n tier: 'Standard',\n capacity: command.sku.capacity,\n },\n instanceTags: command.instanceTags,\n dataDisks: command.dataDisks,\n userAssignedIdentities: command.userAssignedIdentities,\n viewState: command.viewState,\n osConfig: {\n customData: command.osConfig ? command.osConfig.customData : null,\n },\n customScriptsSettings: {\n fileUris: null,\n commandToExecute: '',\n },\n zonesEnabled: command.zonesEnabled,\n zones: command.zonesEnabled ? command.zones : [],\n enableInboundNAT: command.enableInboundNAT,\n };\n\n if (command.image == null || command.image.isCustom == false) {\n configuration.image = tempImage;\n }\n\n if (typeof command.stack !== 'undefined') {\n configuration.name = configuration.name + '-' + command.stack;\n }\n if (typeof command.freeFormDetails !== 'undefined') {\n configuration.name = configuration.name + '-' + command.freeFormDetails;\n }\n\n if (typeof command.customScriptsSettings !== 'undefined') {\n configuration.customScriptsSettings.commandToExecute = command.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(command.customScriptsSettings.fileUris)) {\n parseCustomScriptsSettings(command, configuration);\n }\n }\n\n if (command.instanceType) {\n const vmsku = command.instanceType;\n configuration.instanceType = command.instanceType;\n configuration.sku.name = vmsku;\n configuration.sku.tier = vmsku.substring(0, vmsku.indexOf('_'));\n }\n\n // Default to an empty list of health provider names for now.\n configuration.interestingHealthProviderNames = [];\n\n return configuration;\n }\n\n return {\n convertServerGroupCommandToDeployConfiguration: convertServerGroupCommandToDeployConfiguration,\n normalizeServerGroup: normalizeServerGroup,\n parseCustomScriptsSettings: parseCustomScriptsSettings,\n };\n});\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.azure.serverGroupCommandBuilder.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n ])\n .factory('azureServerGroupCommandBuilder', [\n '$q',\n 'azureImageReader',\n 'azureServerGroupTransformer',\n function ($q, azureImageReader, azureServerGroupTransformer) {\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultCredentials = defaults.account || application.defaultCredentials.azure;\n const defaultRegion = defaults.region || application.defaultRegions.azure;\n\n return azureImageReader.findImages({ provider: 'azure' }).then(function (images) {\n return {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n images,\n loadBalancers: [],\n selectedVnetSubnets: [],\n strategy: '',\n sku: {\n capacity: 1,\n },\n zonesEnabled: false,\n zones: [],\n instanceTags: {},\n dataDisks: [],\n selectedProvider: 'azure',\n viewState: {\n instanceProfile: 'custom',\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n loadBalancersConfigured: false,\n networkSettingsConfigured: false,\n securityGroupsConfigured: false,\n },\n enableInboundNAT: false,\n };\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline() {\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n application: application.name,\n strategy: '',\n stack: serverGroupName.stack,\n freeFormDetails: serverGroupName.freeFormDetails,\n credentials: serverGroup.account,\n loadBalancers: serverGroup.loadBalancers,\n selectedSubnets: serverGroup.selectedVnetSubnets,\n selectedVnet: serverGroup.selectedVnet,\n securityGroups: serverGroup.securityGroups,\n loadBalancerName: serverGroup.loadBalancerName,\n loadBalancerType: serverGroup.loadBalancerType,\n securityGroupName: serverGroup.securityGroupName,\n region: serverGroup.region,\n vnet: serverGroup.vnet,\n vnetResourceGroup: serverGroup.vnetResourceGroup,\n subnet: serverGroup.subnet,\n zones: serverGroup.zones,\n zonesEnabled: serverGroup.zones && serverGroup.zones.length > 0,\n instanceTags: {},\n dataDisks: serverGroup.dataDisks,\n sku: serverGroup.sku,\n capacity: {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n },\n tags: [],\n instanceType: serverGroup.sku.name,\n selectedProvider: 'azure',\n source: {\n account: serverGroup.account,\n region: serverGroup.region,\n serverGroupName: serverGroup.name,\n asgName: serverGroup.name,\n },\n viewState: {\n allImageSelection: null,\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: false,\n listImplicitSecurityGroups: false,\n mode: mode,\n disableStrategySelection: true,\n },\n enableInboundNAT: serverGroup.enableInboundNAT,\n };\n\n if (typeof serverGroup.customScriptsSettings !== 'undefined') {\n command.customScriptsSettings = {};\n command.customScriptsSettings.commandToExecute = serverGroup.customScriptsSettings.commandToExecute;\n if (!_.isEmpty(serverGroup.customScriptsSettings.fileUris)) {\n azureServerGroupTransformer.parseCustomScriptsSettings(serverGroup, command);\n }\n }\n\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = pipelineCluster.region;\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const viewState = {\n disableImageSelection: true,\n useSimpleCapacity: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n instanceProfile: originalCluster.viewState.instanceProfile,\n instanceTypeDetails: originalCluster.viewState.instanceTypeDetails,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n viewState: viewState,\n };\n if (originalCluster.viewState.instanceTypeDetails) {\n viewOverrides.instanceType = originalCluster.viewState.instanceTypeDetails.name;\n }\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n const extendedCommand = angular.extend({}, command, pipelineCluster, viewOverrides);\n\n return extendedCommand;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n AccountService,\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n PipelineTemplates,\n Registry,\n SETTINGS,\n} from '@spinnaker/core';\n\nimport { AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../../image/image.reader';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './../../../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport const AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE = 'spinnaker.azure.pipeline.stage.bakeStage';\nexport const name = AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE, [\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n AZURE_IMAGE_IMAGE_READER,\n AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER,\n])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'azure',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'package' },\n { type: 'requiredField', fieldName: 'regions' },\n {\n type: 'upstreamVersionProvided',\n checkParentTriggers: true,\n getMessage: (labels) =>\n 'Bake stages should always have a stage or trigger preceding them that provides version information: ' +\n '<ul>' +\n labels.map((label) => `<li>${label}</li>`).join('') +\n '</ul>' +\n 'Otherwise, Spinnaker will bake and deploy the most-recently built package.',\n },\n ],\n restartable: true,\n });\n })\n .controller('azureBakeStageCtrl', [\n '$scope',\n '$q',\n 'azureImageReader',\n '$uibModal',\n function ($scope, $q, azureImageReader, $uibModal) {\n $scope.stage.extendedAttributes = $scope.stage.extendedAttributes || {};\n $scope.stage.regions = $scope.stage.regions || [];\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n $scope.viewState = {\n loading: true,\n };\n\n function initialize() {\n $q.all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n BakeryReader.getRegions('azure'),\n BakeryReader.getBaseOsOptions('azure'),\n BakeryReader.getBaseLabelOptions(),\n ]).then(function ([credentialsKeyedByAccount, regions, baseOsOptions, baseLabelOptions]) {\n $scope.accounts = Object.keys(credentialsKeyedByAccount);\n $scope.regions = regions;\n if ($scope.regions.length === 1) {\n $scope.stage.region = $scope.regions[0];\n } else if (!$scope.regions.includes($scope.stage.region)) {\n delete $scope.stage.region;\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n if (!$scope.stage.regions.length && $scope.application.defaultRegions.azure) {\n $scope.stage.regions.push($scope.application.defaultRegions.azure);\n }\n $scope.baseOsOptions = baseOsOptions.baseImages;\n\n $scope.baseLabelOptions = baseLabelOptions;\n $scope.osTypeOptions = ['linux', 'windows'];\n $scope.packageTypeOptions = ['DEB', 'RPM'];\n\n $scope.viewState.roscoMode =\n SETTINGS.feature.roscoMode ||\n (typeof SETTINGS.feature.roscoSelector === 'function' && SETTINGS.feature.roscoSelector($scope.stage));\n $scope.showAdvancedOptions = showAdvanced();\n $scope.viewState.loading = false;\n\n if ($scope.stage.managedImage != null) {\n $scope.managedImagesWasChosen = true;\n setManagedImages();\n }\n $scope.defaultImagesWasChosen = $scope.stage.baseOs != null;\n $scope.customImagesWasChosen = $scope.stage.publisher != null;\n });\n }\n\n function stageUpdated() {\n deleteEmptyProperties();\n // Since the selector computes using stage as an input, it needs to be able to recompute roscoMode on updates\n if (typeof SETTINGS.feature.roscoSelector === 'function') {\n $scope.viewState.roscoMode = SETTINGS.feature.roscoSelector($scope.stage);\n }\n }\n\n function showAdvanced() {\n const stg = $scope.stage;\n return !!(\n stg.templateFileName ||\n (stg.extendedAttributes && _.size(stg.extendedAttributes) > 0) ||\n stg.varFileName\n );\n }\n\n function deleteEmptyProperties() {\n _.forOwn($scope.stage, function (val, key) {\n if (val === '') {\n delete $scope.stage[key];\n }\n });\n }\n\n function setManagedImages() {\n azureImageReader\n .findImages({ provider: 'azure', managedImages: true, account: $scope.stage.account })\n .then(function (images) {\n let managedImageOptions = [];\n for (let i in images) {\n let image = images[i];\n let newImage = {\n id: image.imageName,\n osType: image.ostype,\n name: image.imageName,\n };\n managedImageOptions.push(newImage);\n }\n $scope.managedImageOptions = managedImageOptions;\n })\n .catch(() => {});\n }\n\n function setRegions() {\n AccountService.getRegionsForAccount($scope.stage.account)\n .then(function (regions) {\n $scope.regions = regions.map((r) => r.name);\n })\n .catch(() => {});\n }\n\n this.addExtendedAttribute = function () {\n if (!$scope.stage.extendedAttributes) {\n $scope.stage.extendedAttributes = {};\n }\n $uibModal\n .open({\n templateUrl: PipelineTemplates.addExtendedAttributes,\n controller: 'bakeStageAddExtendedAttributeController',\n controllerAs: 'addExtendedAttribute',\n resolve: {\n extendedAttribute: function () {\n return {\n key: '',\n value: '',\n };\n },\n },\n })\n .result.then(function (extendedAttribute) {\n $scope.stage.extendedAttributes[extendedAttribute.key] = extendedAttribute.value;\n })\n .catch(() => {});\n };\n\n this.removeExtendedAttribute = function (key) {\n delete $scope.stage.extendedAttributes[key];\n };\n\n this.showTemplateFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.templateFileName;\n };\n\n this.showExtendedAttributes = function () {\n return (\n $scope.viewState.roscoMode || ($scope.stage.extendedAttributes && _.size($scope.stage.extendedAttributes) > 0)\n );\n };\n\n this.showVarFileName = function () {\n return $scope.viewState.roscoMode || $scope.stage.varFileName;\n };\n\n this.showDefaultImages = function () {\n $scope.managedImagesWasChosen = false;\n $scope.defaultImagesWasChosen = true;\n $scope.customImagesWasChosen = false;\n\n $scope.stage.managedImage = null;\n $scope.stage.publisher = null;\n $scope.stage.offer = null;\n $scope.stage.sku = null;\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n };\n\n this.showManagedImages = function () {\n setManagedImages();\n\n $scope.managedImagesWasChosen = true;\n $scope.defaultImagesWasChosen = false;\n $scope.customImagesWasChosen = false;\n\n $scope.stage.osType = null;\n $scope.stage.baseOs = null;\n $scope.stage.publisher = null;\n $scope.stage.offer = null;\n $scope.stage.sku = null;\n $scope.stage.packageType = null;\n };\n\n this.showCustomImages = function () {\n $scope.managedImagesWasChosen = false;\n $scope.defaultImagesWasChosen = false;\n $scope.customImagesWasChosen = true;\n\n $scope.stage.baseOs = null;\n $scope.stage.managedImage = null;\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n };\n\n this.onChangeAccount = () => {\n $scope.stage.osType = null;\n $scope.stage.packageType = null;\n $scope.stage.managedImage = null;\n\n if ($scope.stage.account) {\n setRegions();\n }\n\n if ($scope.managedImagesWasChosen) {\n setManagedImages();\n }\n };\n\n $scope.onChangeManagedImage = () => {\n $scope.stage.packageType = null;\n const selectedManagedImage = _.find($scope.managedImageOptions, { id: $scope.stage.managedImage });\n $scope.stage.osType = selectedManagedImage.osType.toLowerCase();\n };\n\n this.onChangeOsType = function (e) {\n $scope.stage.packageType = null;\n };\n\n $scope.$watch('stage', stageUpdated, true);\n\n initialize();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE = 'spinnaker.azure.pipeline.stage.destroyAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n cloudProvider: 'azure',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getAccountDetails(stage.credentials).then(function (details) {\n stage.regions = [details.org];\n // stage.regions = ['eastus', 'westus'];\n });\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n\n if (stage.credentials) {\n ctrl.accountUpdated();\n }\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.disableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./disableAsgStage.html'),\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew && $scope.application.attributes.platformHealthOnly) {\n stage.interestingHealthProviderNames = []; // bypass the check for now; will change this later to ['azureService']\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE = 'spinnaker.azure.pipeline.stage.enableAsgStage';\nexport const name = AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE; // for backwards compatibility\nmodule(AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'azure',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('azureEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'azure';\n\n if (stage.isNew) {\n // bypass the health check for now; will change this later to ['azureService'] and we will also add back the check for $scope.application.attributes.platformHealthOnly\n stage.interestingHealthProviderNames = [];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.azure) {\n stage.credentials = $scope.application.defaultCredentials.azure;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.azure) {\n stage.regions.push($scope.application.defaultRegions.azure);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { FirewallLabels, InfrastructureCaches, TaskExecutor } from '@spinnaker/core';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE = 'spinnaker.azure.securityGroup.write.service';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE, [UIROUTER_ANGULARJS]).factory(\n 'azureSecurityGroupWriter',\n function () {\n function upsertSecurityGroup(securityGroup, application, descriptor, params = {}) {\n params.securityGroupName = securityGroup.name;\n\n // We want to extend params with all attributes from securityGroup, but only if they don't already exist.\n _.assignWith(params, securityGroup, function (value, other) {\n return _.isUndefined(value) ? other : value;\n });\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `${descriptor} ${FirewallLabels.get('Firewall')}: ${name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n function deleteSecurityGroup(securityGroup, application, params = {}) {\n params.type = 'deleteSecurityGroup';\n params.securityGroupName = securityGroup.name;\n params.regions = [securityGroup.region];\n params.credentials = securityGroup.accountId;\n //params.cloudProvider = securityGroup.providerType;\n params.appName = application.name;\n\n const operation = TaskExecutor.executeTask({\n job: [params],\n application: application,\n description: `Delete ${FirewallLabels.get('Firewalls')}: ${securityGroup.name}`,\n });\n\n InfrastructureCaches.clearCache('securityGroup');\n\n return operation;\n }\n\n return {\n deleteSecurityGroup: deleteSecurityGroup,\n upsertSecurityGroup: upsertSecurityGroup,\n };\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, NetworkReader, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL = 'spinnaker.azure.securityGroup.create.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureCreateSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$state',\n '$controller',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function ($scope, $uibModalInstance, $state, $controller, application, securityGroup, azureSecurityGroupWriter) {\n $scope.pages = {\n location: require('./createSecurityGroupProperties.html'),\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n $scope.regions = [];\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n const ctrl = this;\n $scope.isNew = true;\n $scope.state = {\n submitting: false,\n infiniteScroll: {\n numToAdd: 20,\n currentItems: 20,\n },\n };\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addMoreItems = function () {\n $scope.state.infiniteScroll.currentItems += $scope.state.infiniteScroll.numToAdd;\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.regions[0],\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Creating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n $scope.securityGroup = securityGroup;\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n ctrl.regionUpdated();\n });\n };\n\n this.regionUpdated = function () {\n ctrl.vnetUpdated();\n };\n\n this.vnetUpdated = function () {\n const account = $scope.securityGroup.credentials;\n const region = $scope.securityGroup.region;\n $scope.securityGroup.selectedVnet = null;\n $scope.securityGroup.vnet = null;\n $scope.securityGroup.vnetResourceGroup = null;\n\n ctrl.selectedVnets = [];\n\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((vnet) => {\n if (vnet.account === account && vnet.region === region) {\n ctrl.selectedVnets.push(vnet);\n }\n });\n }\n });\n\n ctrl.subnetUpdated();\n };\n\n this.subnetUpdated = function () {\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n };\n\n this.selectedVnetChanged = function (item) {\n $scope.securityGroup.vnet = item.name;\n $scope.securityGroup.vnetResourceGroup = item.resourceGroup;\n $scope.securityGroup.selectedSubnet = null;\n $scope.securityGroup.subnet = null;\n ctrl.selectedSubnets = [];\n if (item.subnets) {\n item.subnets.map(function (subnet) {\n ctrl.selectedSubnets.push(subnet);\n });\n }\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n vpcId: 'null',\n };\n\n if ($scope.securityGroup.selectedVnet) {\n $scope.securityGroup.vnet = $scope.securityGroup.selectedVnet.name;\n $scope.securityGroup.vnetResourceGroup = $scope.securityGroup.selectedVnet.resourceGroup;\n }\n\n if ($scope.securityGroup.selectedSubnet) {\n $scope.securityGroup.subnet = $scope.securityGroup.selectedSubnet.name;\n }\n\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Create', params);\n });\n };\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length == 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n ctrl.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n ctrl.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].destPortRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n ctrl.protocolUpdated = function (ruleset, index) {\n ruleset[index].protocol = ruleset[index].protocolUI;\n };\n\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.securityGroup.securityRules = [];\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport {\n CACHE_INITIALIZER_SERVICE,\n FirewallLabels,\n InfrastructureCaches,\n SECURITY_GROUP_READER,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL =\n 'spinnaker.azure.securityGroup.azure.edit.controller';\nexport const name = AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL, [\n UIROUTER_ANGULARJS,\n CACHE_INITIALIZER_SERVICE,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n]).controller('azureEditSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$exceptionHandler',\n '$state',\n 'securityGroupReader',\n 'cacheInitializer',\n 'application',\n 'securityGroup',\n 'azureSecurityGroupWriter',\n function (\n $scope,\n $uibModalInstance,\n $exceptionHandler,\n $state,\n securityGroupReader,\n cacheInitializer,\n application,\n securityGroup,\n azureSecurityGroupWriter,\n ) {\n $scope.pages = {\n ingress: require('./createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n if (!_.isEmpty(rule.protocol)) {\n rule.protocolUI = rule.protocol.toLowerCase();\n }\n\n rule.destPortRanges = rule.destinationPortRangeModel;\n rule.sourceIPCIDRRanges = rule.sourceAddressPrefixModel;\n\n return rule;\n });\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n this.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n this.refreshSecurityGroups = function () {\n $scope.state.refreshingSecurityGroups = true;\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n initializeSecurityGroups().then(function () {\n $scope.state.refreshingSecurityGroups = false;\n });\n });\n };\n\n function initializeSecurityGroups() {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n const account = securityGroup.accountName;\n const region = securityGroup.region;\n const availableGroups = _.filter(securityGroups[account].azure[region], {\n /*vpcId: vpcId*/\n });\n $scope.availableSecurityGroups = _.map(availableGroups, 'name');\n });\n }\n\n this.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocolUI: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourceAddressPrefixes: [],\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '*',\n destinationPortRanges: [],\n destPortRanges: '*',\n sourceIPCIDRRanges: '*',\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n this.portUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].destPortRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].destinationPortRanges = [];\n ruleRanges.forEach((v) => ruleset[index].destinationPortRanges.push(v));\n\n // If there are multiple port ranges then set null to the single port parameter otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRange = null;\n } else {\n ruleset[index].destinationPortRange = ruleset[index].destPortRanges;\n\n // If there is a single port range then set null to the port array otherwise ARM template will fail in validation.\n ruleset[index].destinationPortRanges = [];\n }\n }\n };\n\n this.sourceIPCIDRUpdated = function (ruleset, index) {\n if (!_.isEmpty(ruleset[index].sourceIPCIDRRanges)) {\n const ruleRanges = ruleset[index].sourceIPCIDRRanges.split(',');\n if (ruleRanges.length > 1) {\n ruleset[index].sourceAddressPrefixes = [];\n ruleRanges.forEach((v) => ruleset[index].sourceAddressPrefixes.push(v));\n\n // If there are multiple IP/CIDR ranges then set null to the single sourceAddressPrefix parameter otherwise ARM template will fail in validation\n ruleset[index].sourceAddressPrefix = null;\n } else {\n ruleset[index].sourceAddressPrefix = ruleset[index].sourceIPCIDRRanges;\n\n // If there is a single IP/CIDR then set null to the IP/CIDR array otherwise ARM template will fail in validation.\n ruleset[index].sourceAddressPrefixes = [];\n }\n }\n };\n\n this.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n\n this.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n this.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n $scope.taskMonitor.onTaskComplete = $uibModalInstance.dismiss;\n\n this.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: null,\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Update', params);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, FirewallLabels, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from '../configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER = 'spinnaker.azure.securityGroup.clone.controller';\nexport const name = AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER, [\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n]).controller('azureCloneSecurityGroupController', [\n '$scope',\n '$uibModalInstance',\n '$controller',\n '$state',\n 'azureSecurityGroupWriter',\n 'securityGroup',\n 'application',\n function ($scope, $uibModalInstance, $controller, $state, azureSecurityGroupWriter, securityGroup, application) {\n const ctrl = this;\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n $scope.pages = {\n location: require('../configure/createSecurityGroupProperties.html'),\n ingress: require('../configure/createSecurityGroupIngress.html'),\n };\n\n securityGroup.securityRules = _.map(securityGroup.securityRules, function (rule) {\n const temp = rule.destinationPortRange.split('-');\n rule.startPort = Number(temp[0]);\n rule.endPort = Number(temp[1]);\n return rule;\n });\n\n ctrl.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.securityGroup.credentials).then(function (regions) {\n $scope.regions = regions;\n $scope.securityGroup.regions = regions;\n ctrl.updateName();\n });\n };\n\n ctrl.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n ctrl.updateName = function () {\n const securityGroup = $scope.securityGroup;\n let name = application.name;\n if (securityGroup.detail) {\n name += '-' + securityGroup.detail;\n }\n securityGroup.name = name;\n $scope.namePreview = name;\n };\n\n $scope.securityGroup = securityGroup;\n\n $scope.state = {\n refreshingSecurityGroups: false,\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: `Updating your ${FirewallLabels.get('firewall')}`,\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n AccountService.listAccounts('azure').then(function (accounts) {\n $scope.accounts = accounts;\n ctrl.accountUpdated();\n });\n\n ctrl.addRule = function (ruleset) {\n ruleset.push({\n name: $scope.securityGroup.name + '-Rule' + ruleset.length,\n priority: ruleset.length === 0 ? 100 : 100 * (ruleset.length + 1),\n protocol: 'tcp',\n access: 'Allow',\n direction: 'InBound',\n sourceAddressPrefix: '*',\n sourcePortRange: '*',\n destinationAddressPrefix: '*',\n destinationPortRange: '7001-7001',\n startPort: 7001,\n endPort: 7001,\n });\n };\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n $uibModalInstance.close();\n const newStateParams = {\n name: $scope.securityGroup.name,\n accountId: $scope.securityGroup.credentials || $scope.securityGroup.accountName,\n region: $scope.securityGroup.region,\n provider: 'azure',\n };\n if (!$state.includes('**.firewallDetails')) {\n $state.go('.firewallDetails', newStateParams);\n } else {\n $state.go('^.firewallDetails', newStateParams);\n }\n }\n\n function onTaskComplete() {\n application.securityGroups.refresh();\n application.securityGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n ctrl.portUpdated = function (ruleset, index) {\n ruleset[index].destinationPortRange = ruleset[index].startPort + '-' + ruleset[index].endPort;\n };\n ctrl.removeRule = function (ruleset, index) {\n ruleset.splice(index, 1);\n };\n ctrl.moveUp = function (ruleset, index) {\n if (index === 0) return;\n swapRules(ruleset, index, index - 1);\n };\n ctrl.moveDown = function (ruleset, index) {\n if (index === ruleset.length - 1) return;\n swapRules(ruleset, index, index + 1);\n };\n function swapRules(ruleset, a, b) {\n const temp = ruleset[b];\n const priorityA = ruleset[a].priority;\n const priorityB = ruleset[b].priority;\n //swap elements\n ruleset[b] = ruleset[a];\n ruleset[a] = temp;\n //swap priorities\n ruleset[a].priority = priorityA;\n ruleset[b].priority = priorityB;\n }\n\n ctrl.upsert = function () {\n $scope.taskMonitor.submit(function () {\n const params = {\n cloudProvider: 'azure',\n appName: application.name,\n region: $scope.securityGroup.region,\n subnet: 'none',\n vpcId: 'null',\n };\n $scope.securityGroup.type = 'upsertSecurityGroup';\n\n return azureSecurityGroupWriter.upsertSecurityGroup($scope.securityGroup, application, 'Clone', params);\n });\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { ConfirmationModalService, FirewallLabels, SECURITY_GROUP_READER } from '@spinnaker/core';\n\nimport { AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER } from '../clone/cloneSecurityGroup.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE } from '../securityGroup.write.service';\n\nexport const AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.azure.securityGroup.azure.details.controller';\nexport const name = AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE,\n AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER,\n ])\n .controller('azureSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'azureSecurityGroupWriter',\n 'securityGroupReader',\n '$uibModal',\n function ($scope, $state, resolvedSecurityGroup, app, azureSecurityGroupWriter, securityGroupReader, $uibModal) {\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(\n function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n $scope.securityGroup = details;\n }\n },\n function () {\n fourOhFour();\n },\n );\n }\n\n function fourOhFour() {\n $state.go('^');\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n this.editInboundRules = function editInboundRules() {\n $uibModal.open({\n templateUrl: require('../configure/editSecurityGroup.html'),\n controller: 'azureEditSecurityGroupCtrl as ctrl',\n resolve: {\n securityGroup: function () {\n return angular.copy($scope.securityGroup);\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.cloneSecurityGroup = function cloneSecurityGroup() {\n $uibModal.open({\n templateUrl: require('../clone/cloneSecurityGroup.html'),\n controller: 'azureCloneSecurityGroupController as ctrl',\n resolve: {\n securityGroup: function () {\n const securityGroup = angular.copy($scope.securityGroup);\n if (securityGroup.region) {\n securityGroup.regions = [securityGroup.region];\n }\n return securityGroup;\n },\n application: function () {\n return application;\n },\n },\n });\n };\n\n this.deleteSecurityGroup = function deleteSecurityGroup() {\n const taskMonitor = {\n application: application,\n title: 'Deleting ' + securityGroup.name,\n };\n\n const submitMethod = function () {\n $scope.securityGroup.type = 'deleteSecurityGroup';\n return azureSecurityGroupWriter.deleteSecurityGroup(securityGroup, application, {\n cloudProvider: 'azure',\n vpcId: $scope.securityGroup.vpcId,\n });\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + securityGroup.name + '?',\n buttonText: 'Delete ' + securityGroup.name,\n account: securityGroup.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_READER = 'spinnaker.azure.securityGroup.reader';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_READER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_READER, []).factory('azureSecurityGroupReader', function () {\n function resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n //hack to get around securityGroupId not matching id in indexedSecurityGroups.\n const temp = securityGroupId.split('/');\n return indexedSecurityGroups[container.account][container.region][temp[temp.length - 1]];\n }\n\n return {\n resolveIndexedSecurityGroup: resolveIndexedSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.azure.securityGroup.transformer';\nexport const name = AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('azureSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceArchetype.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER, []).controller(\n 'azureInstanceArchetypeCtrl',\n [\n '$scope',\n 'instanceTypeService',\n 'modalWizardService',\n function ($scope, instanceTypeService, modalWizardService) {\n const wizard = modalWizardService.getWizard();\n\n $scope.$watch('command.viewState.instanceProfile', function () {\n if (!$scope.command.viewState.instanceProfile || $scope.command.viewState.instanceProfile === 'custom') {\n wizard.excludePage('instance-type');\n } else {\n wizard.includePage('instance-type');\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n\n $scope.$watch('command.viewState.instanceType', function (newVal) {\n if (newVal) {\n wizard.markClean('instance-profile');\n wizard.markComplete('instance-profile');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.instanceType.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER, []).controller('azureInstanceTypeCtrl', [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('instance-type');\n modalWizardService.getWizard().markClean('instance-type');\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.advancedSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupAdvancedSettingsCtrl',\n [\n '$scope',\n 'modalWizardService',\n function ($scope, modalWizardService) {\n modalWizardService.getWizard().markComplete('advanced');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n modalWizardService.getWizard().markClean('advanced');\n } else {\n modalWizardService.getWizard().markDirty('advanced');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.advancedSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupAdvancedSettingsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./advancedSettingsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'adv',\n controller: 'azureServerGroupAdvancedSettingsSelectorCtrl',\n };\n })\n .controller('azureServerGroupAdvancedSettingsSelectorCtrl', function () {\n this.addDataDisk = () => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n this.command.dataDisks = newDataDisks.concat([\n {\n lun: 0,\n managedDisk: {\n storageAccountType: 'Standard_LRS',\n },\n diskSizeGB: 1,\n caching: 'None',\n createOption: 'Empty',\n },\n ]);\n };\n\n this.removeDataDisk = (index) => {\n const newDataDisks = angular.copy(this.command.dataDisks);\n newDataDisks.splice(index, 1);\n this.command.dataDisks = newDataDisks;\n };\n });\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER =\n 'spinnaker.azure.serverGroup.configure.basicSettings.image.filter';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER, []).filter('regional', function () {\n return function (input, selectedRegion) {\n return _.filter(input, function (image) {\n return image.region === selectedRegion || image.region === null;\n });\n };\n});\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { IMAGE_READER, ModalWizard } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER } from './image.regional.filter';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.basicSettings';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER,\n IMAGE_READER,\n ])\n .controller('azureServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n 'imageReader',\n function ($scope, $controller, $uibModalStack, $state, imageReader) {\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basic-settings');\n ModalWizard.markComplete('basic-settings');\n } else {\n ModalWizard.markIncomplete('basic-settings');\n }\n });\n\n this.imageChanged = (image) => {\n $scope.command.imageName = image.imageName;\n $scope.command.selectedImage = image;\n ModalWizard.markClean('basic-settings');\n };\n\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n imageReader: imageReader,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n this.stackPattern = {\n test: function (stack) {\n const pattern = $scope.command.viewState.templatingEnabled ? /^([a-zA-Z0-9]*(\\${.+})*)*$/ : /^[a-zA-Z0-9]*$/;\n\n return pattern.test(stack);\n },\n };\n\n this.detailPattern = {\n test: function (detail) {\n const pattern = $scope.command.viewState.templatingEnabled\n ? /^([a-zA-Z0-9-]*(\\${.+})*)*$/\n : /^[a-zA-Z0-9-]*$/;\n\n return pattern.test(detail);\n },\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE, [])\n .directive('azureServerGroupCapacitySelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./capacitySelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'cap',\n controller: 'azureServerGroupCapacitySelectorCtrl',\n };\n })\n .controller('azureServerGroupCapacitySelectorCtrl', function () {});\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.healthSetting.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupHealthSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n if (typeof $scope.command.healthSettings === 'undefined') {\n $scope.command.healthSettings = {};\n }\n\n this.healthCheckProtocols = [\n { displayName: 'N/A', name: null },\n { displayName: 'HTTP', name: 'http' },\n { displayName: 'TCP', name: 'tcp' },\n ];\n\n this.requiresHealthCheckPath = function () {\n return $scope.command.healthSettings.protocol === 'http';\n };\n\n this.changeHealthCheckProtocol = function (newProtocol) {\n if (newProtocol == null) {\n $scope.command.healthSettings.protocol = null;\n $scope.command.healthSettings.port = null;\n $scope.command.healthSettings.requestPath = null;\n } else if (!this.requiresHealthCheckPath()) {\n $scope.command.healthSettings.requestPath = null;\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.healthSettings.selector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupHealthSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./healthSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.imageSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupImageSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n this.clearImage = function () {\n if ($scope.command.image.isCustom == false) {\n $scope.command.image = { isCustom: false };\n } else {\n $scope.command.image.region = $scope.command.region;\n }\n };\n\n ModalWizard.markComplete('image-settings');\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('image-settings');\n } else {\n ModalWizard.markDirty('image-settings');\n }\n });\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.imageSettingsSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE, []).directive(\n 'azureServerGroupImageSettingsSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n templateUrl: require('./imageSettingsSelector.directive.html'),\n scope: {\n command: '=',\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { InfrastructureCaches, LOAD_BALANCER_READ_SERVICE, ModalWizard, NetworkReader } from '@spinnaker/core';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER, [\n LOAD_BALANCER_READ_SERVICE,\n]).controller('azureServerGroupLoadBalancersCtrl', [\n '$scope',\n 'loadBalancerReader',\n function ($scope, loadBalancerReader) {\n ModalWizard.markClean('load-balancers');\n\n function loadVnetSubnets(item, type) {\n loadBalancerReader\n .getLoadBalancerDetails('azure', $scope.command.credentials, $scope.command.region, item)\n .then(function (LBs) {\n if (!LBs || LBs.length === 0) {\n // load the subnet and vnets without a load balancer\n const attachedVnet = $scope.command.selectedVnet;\n const attachedSubnet = $scope.command.selectedSubnet;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n if (subnet.name === attachedSubnet) {\n $scope.command.selectedSubnet = attachedSubnet;\n }\n }\n });\n }\n });\n }\n });\n } else if (LBs && LBs.length === 1) {\n const selectedLoadBalancer = LBs[0];\n const attachedVnet = $scope.command.selectedVnet;\n $scope.command.selectedVnet = null;\n $scope.command.selectedVnetSubnets = [];\n $scope.command.allVnets = [];\n NetworkReader.listNetworks().then(function (vnets) {\n if (vnets.azure) {\n vnets.azure.forEach((selectedVnet) => {\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region\n ) {\n $scope.command.allVnets.push(selectedVnet);\n }\n if (\n selectedVnet.account === $scope.command.credentials &&\n selectedVnet.region === $scope.command.region &&\n ((type === 'Azure Application Gateway' && selectedVnet.name == selectedLoadBalancer.vnet) ||\n (type === 'Azure Load Balancer' && selectedVnet.name === attachedVnet.name))\n ) {\n $scope.command.selectedVnet = selectedVnet;\n selectedVnet.subnets.map(function (subnet) {\n let addSubnet = true;\n if (subnet.devices) {\n subnet.devices.map(function (device) {\n // only add subnets that are not assigned to an ApplicationGateway\n if (device && device.type === 'applicationGateways') {\n addSubnet = false;\n }\n });\n }\n if (addSubnet) {\n $scope.command.selectedVnetSubnets.push(subnet.name);\n }\n });\n }\n });\n }\n });\n }\n });\n }\n\n if ($scope.command.credentials && $scope.command.region) {\n $scope.command.viewState.networkSettingsConfigured = true;\n $scope.command.selectedVnetSubnets = [];\n if ($scope.command.loadBalancerName !== null && typeof $scope.command.loadBalancerName !== 'undefined') {\n $scope.useLoadBalancer = true;\n }\n loadVnetSubnets($scope.command.loadBalancerName, $scope.command.loadBalancerType);\n }\n\n this.loadBalancerChanged = function (item) {\n $scope.command.viewState.networkSettingsConfigured = true;\n ModalWizard.markComplete('load-balancers');\n\n const loadBalancers = $scope.command.backingData.loadBalancers;\n let loadBalancerType = null;\n\n if (loadBalancers) {\n const loadBalancerToFind = loadBalancers.find((lb) => lb.name === item);\n if (loadBalancerToFind) {\n loadBalancerType = Utility.getLoadBalancerType(loadBalancerToFind.loadBalancerType).type;\n }\n }\n\n if (item === null) {\n $scope.command.loadBalancerName = null;\n }\n\n $scope.command.selectedVnetSubnets = [];\n $scope.command.loadBalancerType = loadBalancerType;\n InfrastructureCaches.clearCache('networks');\n loadVnetSubnets(item, loadBalancerType);\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.loadBalancer.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupLoadBalancersSelector',\n [\n 'azureServerGroupConfigurationService',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupLoadBalancersSelector.directive.html'),\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.networkSettings.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER, []).controller(\n 'azureServerGroupNetworkSettingsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('network-settings');\n\n $scope.command.selectedVnet = {\n name: $scope.command.vnet,\n };\n\n $scope.command.selectedSubnet = $scope.command.subnet;\n\n this.vnetChanged = function (item) {\n $scope.command.vnet = item;\n $scope.command.subnet = $scope.command.selectedSubnet = null;\n $scope.command.selectedVnetSubnets = item.subnets.map((s) => s.name);\n };\n\n this.networkSettingsChanged = function (item) {\n $scope.command.vnet = $scope.command.selectedVnet.name;\n $scope.command.subnet = item;\n ModalWizard.markComplete('network-settings');\n };\n\n this.getVnetName = function () {\n if ($scope.command.selectedVnet) {\n return $scope.command.selectedVnet.name;\n } else {\n return 'Virtual network was not selected';\n }\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.networkSettings.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupNetworkSettingsSelector',\n function () {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./ServerGroupNetworkSettingsSelector.directive.html'),\n };\n },\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER =\n 'spinnaker.azure.serverGroup.configure.securityGroups.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER, []).controller(\n 'azureServerGroupSecurityGroupsCtrl',\n [\n '$scope',\n function ($scope) {\n ModalWizard.markClean('security-groups');\n ModalWizard.markComplete('security-groups');\n\n $scope.command.selectedSecurityGroup = {\n id: $scope.command.securityGroupName,\n };\n\n this.securityGroupChanged = function (securityGroup) {\n $scope.command.securityGroupName = securityGroup.id;\n ModalWizard.markComplete('security-groups');\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { FirewallLabels, InfrastructureCaches } from '@spinnaker/core';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.securityGroupSelector.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE, []).directive(\n 'azureServerGroupSecurityGroupsSelector',\n [\n 'azureServerGroupConfigurationService',\n function (azureServerGroupConfigurationService) {\n return {\n restrict: 'E',\n scope: {\n command: '=',\n },\n templateUrl: require('./serverGroupSecurityGroupsSelector.directive.html'),\n link: function (scope) {\n scope.firewallLabel = FirewallLabels.get('firewall');\n\n scope.getSecurityGroupRefreshTime = function () {\n return InfrastructureCaches.get('securityGroups').getStats().ageMax;\n };\n\n scope.refreshSecurityGroups = function () {\n scope.refreshing = true;\n azureServerGroupConfigurationService.refreshSecurityGroups(scope.command).then(function () {\n scope.refreshing = false;\n });\n };\n },\n };\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport Utility from '../../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.tags.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE, [])\n .directive('azureTagsSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./tagsSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'tagsSelectorCtrl',\n controller: 'TagsSelectorCtrl',\n };\n })\n .controller('TagsSelectorCtrl', [\n '$scope',\n function () {\n this.getTagResult = function () {\n return Utility.checkTags(this.command.instanceTags);\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE =\n 'spinnaker.azure.serverGroup.configure.wizard.capacity.zone.directive';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE, []).directive('azureZoneSelector', function () {\n return {\n restrict: 'E',\n templateUrl: require('./zoneSelector.directive.html'),\n scope: {},\n bindToController: {\n command: '=',\n },\n controllerAs: 'vm',\n controller: [\n '$scope',\n function ($scope) {\n this.updateEnableInboundNAT = () => {\n if ($scope.vm.command.zonesEnabled) {\n $scope.vm.command.enableInboundNAT = false;\n }\n };\n },\n ],\n };\n});\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER } from './wizard/ServerGroupInstanceArchetype.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER } from './wizard/ServerGroupInstanceType.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER } from './wizard/advancedSettings/ServerGroupAdvancedSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE } from './wizard/advancedSettings/advancedSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER } from './wizard/basicSettings/ServerGroupBasicSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE } from './wizard/capacity/capacitySelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER } from './wizard/healthSettings/ServerGroupHealthSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE } from './wizard/healthSettings/healthSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER } from './wizard/image/ServerGroupImageSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE } from './wizard/image/imageSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER } from './wizard/loadBalancers/ServerGroupLoadBalancers.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE } from './wizard/loadBalancers/serverGroupLoadBalancersSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER } from './wizard/networkSettings/ServerGroupNetworkSettings.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE } from './wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER } from './wizard/securityGroup/ServerGroupSecurityGroups.controller';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE } from './wizard/securityGroup/serverGroupSecurityGroupsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE } from './wizard/tags/tagsSelector.directive';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE } from './wizard/zones/zoneSelector.directive';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE = 'spinnaker.azure.serverGroup.configure';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE, [\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE,\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\nimport { AZURE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from '../../instance/azureInstanceType.service';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE =\n 'spinnaker.azure.serverGroup.configure.service';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE, [\n AZURE_IMAGE_IMAGE_READER,\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n ])\n .factory('azureServerGroupConfigurationService', [\n '$q',\n 'azureImageReader',\n 'securityGroupReader',\n 'cacheInitializer',\n 'loadBalancerReader',\n 'azureInstanceTypeService',\n function (\n $q,\n azureImageReader,\n securityGroupReader,\n cacheInitializer,\n loadBalancerReader,\n azureInstanceTypeService,\n ) {\n const dataDiskTypes = ['Standard_LRS', 'StandardSSD_LRS', 'Premium_LRS'];\n const dataDiskCachingTypes = ['None', 'ReadOnly', 'ReadWrite'];\n\n const healthCheckTypes = ['EC2', 'ELB'];\n const terminationPolicies = [\n 'OldestInstance',\n 'NewestInstance',\n 'OldestLaunchConfiguration',\n 'ClosestToNextInstanceHour',\n 'Default',\n ];\n\n function configureUpdateCommand(command) {\n command.backingData = {\n healthCheckTypes: angular.copy(healthCheckTypes),\n terminationPolicies: angular.copy(terminationPolicies),\n };\n }\n\n function configureCommand(application, command) {\n return $q\n .all([\n AccountService.getCredentialsKeyedByAccount('azure'),\n securityGroupReader.loadSecurityGroups(),\n loadBalancerReader.loadLoadBalancers(application.name),\n ])\n .then(function ([credentialsKeyedByAccount, securityGroups, loadBalancers]) {\n command.backingData = {\n credentialsKeyedByAccount,\n securityGroups,\n loadBalancers,\n dataDiskTypes: angular.copy(dataDiskTypes),\n dataDiskCachingTypes: angular.copy(dataDiskCachingTypes),\n accounts: _.keys(credentialsKeyedByAccount),\n filtered: {},\n };\n attachEventHandlers(command);\n });\n }\n\n function configureInstanceTypes(command) {\n const result = {\n dirty: {},\n };\n if (command.region) {\n const results = [result.dirty];\n\n // results.push(configureCustomInstanceTypes(command).dirty);\n results.push(configureStandardInstanceTypes(command).dirty);\n\n angular.extend(...results);\n } else {\n command.backingData.filtered.instanceTypes = [];\n }\n return result;\n }\n\n function configureStandardInstanceTypes(command) {\n const c = command;\n const result = {\n dirty: {},\n };\n\n const locations = [c.region];\n const { credentialsKeyedByAccount } = c.backingData;\n const { locationToInstanceTypesMap } = credentialsKeyedByAccount[c.credentials];\n\n if (locations.every((l) => !l)) {\n return result;\n }\n\n const filtered = azureInstanceTypeService\n .getAvailableTypesForRegions(locationToInstanceTypesMap, locations)\n .map((type) => type.name);\n\n const instanceType = c.instanceType;\n if (_.every([instanceType, !_.startsWith(instanceType, 'custom'), !_.includes(filtered, instanceType)])) {\n result.dirty.instanceType = c.instanceType;\n c.instanceType = null;\n }\n c.backingData.filtered.instanceTypes = filtered;\n return result;\n }\n\n function configureImages(command) {\n const result = {\n dirty: {},\n };\n let regionalImages = null;\n if (command.viewState.disableImageSelection) {\n return result;\n }\n if (command.region) {\n regionalImages = command.backingData.packageImages\n .filter(function (image) {\n return image.amis && image.amis[command.region];\n })\n .map(function (image) {\n return {\n imageName: image.imageName,\n ami: image.amis ? image.amis[command.region][0] : null,\n };\n });\n if (\n command.amiName &&\n !regionalImages.some(function (image) {\n return image.imageName === command.amiName;\n })\n ) {\n result.dirty.amiName = true;\n command.amiName = null;\n }\n } else {\n command.amiName = null;\n }\n command.backingData.filtered.images = regionalImages;\n return result;\n }\n\n function configureZones(command) {\n const result = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (!command.region) {\n return result;\n }\n let { regionsSupportZones, availabilityZones } = command.backingData.credentialsKeyedByAccount[\n command.credentials\n ];\n regionsSupportZones = regionsSupportZones || [];\n availabilityZones = availabilityZones || [];\n filteredData.zones = regionsSupportZones.includes(command.region) ? availabilityZones : [];\n\n return result;\n }\n\n function getRegionalSecurityGroups(command) {\n const newSecurityGroups = command.backingData.securityGroups[command.credentials] || {\n azure: {},\n };\n return _.chain(newSecurityGroups[command.region]).sortBy('name').value();\n }\n\n function configureSecurityGroupOptions(command) {\n const result = {\n dirty: {},\n };\n let currentOptions;\n if (command.backingData.filtered.securityGroups) {\n currentOptions = command.backingData.filtered.securityGroups;\n }\n const newRegionalSecurityGroups = getRegionalSecurityGroups(command);\n if (command.selectedSecurityGroup) {\n // one has not been previously selected. We are either configuring for the\n //first time or they changed regions or account\n command.selectedSecurityGroup = null;\n result.dirty.securityGroups = true;\n }\n if (currentOptions != newRegionalSecurityGroups) {\n command.backingData.filtered.securityGroups = newRegionalSecurityGroups;\n result.dirty.securityGroups = true;\n }\n\n if (command.backingData.filtered.securityGroups === []) {\n command.viewState.securityGroupsConfigured = false;\n } else {\n command.viewState.securityGroupsConfigured = true;\n }\n\n return result;\n }\n\n function refreshSecurityGroups(command, skipCommandReconfiguration) {\n return cacheInitializer.refreshCache('securityGroups').then(function () {\n return securityGroupReader.getAllSecurityGroups().then(function (securityGroups) {\n command.backingData.securityGroups = securityGroups;\n if (!skipCommandReconfiguration) {\n configureSecurityGroupOptions(command);\n }\n });\n });\n }\n\n function getLoadBalancerNames(loadBalancers) {\n return _.chain(loadBalancers).map('name').uniq().value().sort();\n }\n\n function configureLoadBalancerOptions(command) {\n const result = {\n dirty: {},\n };\n const current = command.loadBalancers;\n const newLoadBalancers = getLoadBalancerNames(command.backingData.loadBalancers);\n\n if (current && command.loadBalancers) {\n const matched = _.intersection(newLoadBalancers, command.loadBalancers);\n const removed = _.xor(matched, current);\n command.loadBalancers = matched;\n if (removed.length) {\n result.dirty.loadBalancers = removed;\n }\n }\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n return result;\n }\n\n function refreshLoadBalancers(command, skipCommandReconfiguration) {\n return loadBalancerReader.listLoadBalancers('azure').then(function (loadBalancers) {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n configureLoadBalancerOptions(command);\n }\n });\n }\n\n function configureLoadBalancers(command) {\n const result = {\n dirty: {},\n };\n const temp = command.backingData.loadBalancers;\n const filterlist = _.filter(temp, function (lb) {\n return lb.account === command.credentials && lb.region === command.region;\n });\n\n command.loadBalancers = getLoadBalancerNames(filterlist);\n command.viewState.loadBalancersConfigured = true;\n\n return result;\n }\n\n function attachEventHandlers(cmd) {\n cmd.regionChanged = function regionChanged(command, isInit = false) {\n const result = {\n dirty: {},\n };\n if (command.region && command.credentials) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n angular.extend(result.dirty, configureSecurityGroupOptions(command).dirty);\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n angular.extend(result.dirty, configureZones(command).dirty);\n }\n // reset previous set values\n if (!isInit) {\n command.loadBalancerName = null;\n command.loadBalancerType = null;\n command.vnet = null;\n command.vnetResourceGroup = null;\n command.subnet = null;\n command.selectedSubnet = null;\n command.selectedVnet = null;\n command.selectedVnetSubnets = [];\n command.viewState.networkSettingsConfigured = false;\n command.selectedSecurityGroup = null;\n command.securityGroupName = null;\n command.zonesEnabled = false;\n command.zones = [];\n }\n\n return result;\n };\n\n cmd.credentialsChanged = function credentialsChanged(command, isInit) {\n const result = {\n dirty: {},\n };\n const backingData = command.backingData;\n if (command.credentials) {\n const regionsForAccount = backingData.credentialsKeyedByAccount[command.credentials] || {\n regions: [],\n defaultKeyPair: null,\n };\n backingData.filtered.regions = regionsForAccount.regions;\n if (\n !_.chain(backingData.filtered.regions)\n .some({\n name: command.region,\n })\n .value()\n ) {\n command.region = null;\n result.dirty.region = true;\n } else {\n angular.extend(result.dirty, command.regionChanged(command, isInit).dirty);\n }\n if (command.region) {\n angular.extend(result.dirty, configureLoadBalancers(command).dirty);\n }\n angular.extend(result.dirty, configureInstanceTypes(command).dirty);\n } else {\n command.region = null;\n }\n return result;\n };\n }\n\n function refreshInstanceTypes(command) {\n return cacheInitializer.refreshCache('instanceTypes').then(function () {\n return azureInstanceTypeService.getAllTypesByRegion().then(function (instanceTypes) {\n command.backingData.instanceTypes = instanceTypes;\n configureInstanceTypes(command);\n });\n });\n }\n\n return {\n configureUpdateCommand: configureUpdateCommand,\n configureCommand: configureCommand,\n configureImages: configureImages,\n configureSecurityGroupOptions: configureSecurityGroupOptions,\n configureLoadBalancerOptions: configureLoadBalancerOptions,\n refreshLoadBalancers: refreshLoadBalancers,\n refreshSecurityGroups: refreshSecurityGroups,\n getRegionalSecurityGroups: getRegionalSecurityGroups,\n refreshInstanceTypes: refreshInstanceTypes,\n configureZones: configureZones,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { FirewallLabels, ModalWizard, SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from '../../serverGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\nimport Utility from '../../../utility';\n\nexport const AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER =\n 'spinnaker.azure.cloneServerGroup.controller';\nexport const name = AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n SERVER_GROUP_WRITER,\n]).controller('azureCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'azureServerGroupConfigurationService',\n 'serverGroupCommand',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n azureServerGroupConfigurationService,\n serverGroupCommand,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: require('./templateSelection.html'),\n basicSettings: require('./basicSettings/basicSettings.html'),\n imageSettings: require('./image/imageSettings.html'),\n healthSettings: require('./healthSettings/healthSettings.html'),\n loadBalancers: require('./loadBalancers/loadBalancers.html'),\n networkSettings: require('./networkSettings/networkSettings.html'),\n securityGroups: require('./securityGroup/securityGroups.html'),\n instanceType: require('./instanceType/instanceType.html'),\n zones: require('./capacity/zones.html'),\n tags: require('./tags/tags.html'),\n advancedSettings: require('./advancedSettings/advancedSettings.html'),\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n $scope.command = serverGroupCommand;\n\n // Give regions an init value to prevent it being undefined. If so, the React component RegionSelectField would get \"undefined\" for property regions\n // and then be unmounted so that the region selector would be hidden.\n $scope.command.backingData = $scope.command.backingData || {};\n $scope.command.backingData.filtered = $scope.command.backingData.filtered || {};\n $scope.command.backingData.filtered.regions = $scope.command.backingData.filtered.regions || [];\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: [\n 'account, region, subnet, cluster name (stack, details)',\n 'load balancers',\n FirewallLabels.get('firewalls'),\n 'instance type',\n 'all fields on the Advanced Settings page',\n ],\n notCopied: [],\n additionalCopyText:\n 'If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group.',\n };\n\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'azure',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n azureServerGroupConfigurationService.configureCommand(application, serverGroupCommand).then(function () {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'create') {\n serverGroupCommand.viewState.useAllImageSelection = true;\n }\n $scope.state.loaded = true;\n initializeWizardState();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWizardState() {\n const mode = serverGroupCommand.viewState.mode;\n if (mode === 'clone' || mode === 'editPipeline') {\n ModalWizard.markComplete('basic-settings');\n ModalWizard.markComplete('load-balancers');\n ModalWizard.markComplete('network-settings');\n ModalWizard.markComplete('security-groups');\n ModalWizard.markComplete('instance-type');\n ModalWizard.markComplete('zones');\n }\n }\n\n function initializeWatches() {\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged($scope.command, true));\n processCommandUpdateResult($scope.command.regionChanged($scope.command, true));\n }\n\n function createResultProcessor(method) {\n return function (newValue, oldValue) {\n if (newValue !== oldValue) {\n processCommandUpdateResult(method($scope.command));\n }\n };\n }\n\n function processCommandUpdateResult(result) {\n if (result.dirty.loadBalancers) {\n ModalWizard.markDirty('load-balancers');\n ModalWizard.markDirty('network-settings');\n }\n if (result.dirty.securityGroups) {\n ModalWizard.markDirty('security-groups');\n }\n if (result.dirty.instanceType) {\n ModalWizard.markDirty('instance-type');\n }\n if (result.dirty.zoneEnabled || result.dirty.zones) {\n ModalWizard.markDirty('zones');\n }\n }\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.toggleSuspendedProcess = function (process) {\n $scope.command.suspendedProcesses = $scope.command.suspendedProcesses || [];\n const processIndex = $scope.command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n $scope.command.suspendedProcesses.push(process);\n } else {\n $scope.command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n this.processIsSuspended = function (process) {\n return $scope.command.suspendedProcesses.includes(process);\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n this.isValid = function () {\n return (\n $scope.command &&\n $scope.command.application &&\n $scope.command.credentials &&\n $scope.command.instanceType &&\n $scope.command.region &&\n (!$scope.command.zonesEnabled || $scope.command.zones.length !== 0) &&\n Utility.checkTags($scope.command.instanceTags).isValid\n );\n };\n },\n]);\n","import React from 'react';\n\nimport { UserVerification } from '@spinnaker/core';\n\nexport interface IAzureModalFooterProps {\n onSubmit: () => void;\n onCancel: () => void;\n isValid: boolean;\n account: string;\n}\n\nexport interface IAzureModalFooterState {\n verified: boolean;\n}\n\nexport class AzureModalFooter extends React.Component<IAzureModalFooterProps, IAzureModalFooterState> {\n constructor(props: any) {\n super(props);\n }\n\n public state = { verified: false };\n\n private handleVerification = (verified: boolean) => {\n this.setState({ verified });\n };\n\n public render() {\n const { onSubmit, onCancel, isValid, account } = this.props;\n const { verified } = this.state;\n\n return (\n <div className=\"modal-footer\">\n {<UserVerification expectedValue={account} onValidChange={this.handleVerification} />}\n <button className=\"btn btn-default\" onClick={onCancel}>\n Cancel\n </button>\n <button type=\"submit\" className=\"btn btn-primary\" onClick={onSubmit} disabled={!isValid || !verified}>\n Submit\n </button>\n </div>\n );\n }\n}\n","import React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport Select from 'react-select';\n\nimport type { IModalComponentProps } from '@spinnaker/core';\nimport {\n ModalClose,\n noop,\n ReactInjector,\n ReactModal,\n TaskMonitor,\n TaskMonitorWrapper,\n TaskReason,\n} from '@spinnaker/core';\n\nimport { AzureModalFooter } from '../../../common/AzureModalFooter';\n\nexport interface IAzureRollbackServerGroupModalProps extends IModalComponentProps {\n application: any;\n serverGroup: any;\n disabledServerGroups: any;\n}\n\nexport interface IAzureRollbackServerGroupModalState {\n taskMonitor: TaskMonitor;\n submitting: boolean;\n command: any;\n}\n\nexport class AzureRollbackServerGroupModal extends React.Component<\n IAzureRollbackServerGroupModalProps,\n IAzureRollbackServerGroupModalState\n> {\n public static defaultProps: Partial<IAzureRollbackServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IAzureRollbackServerGroupModalProps) {\n const modalProps = {};\n return ReactModal.show(AzureRollbackServerGroupModal, props, modalProps);\n }\n\n constructor(props: IAzureRollbackServerGroupModalProps) {\n super(props);\n\n const { application, serverGroup } = props;\n\n this.state = {\n taskMonitor: new TaskMonitor({\n application: application,\n title: 'Rolling back your server group',\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n }),\n submitting: true,\n command: {\n interestingHealthProviderNames: [],\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n enableAndDisableOnly: true,\n },\n },\n };\n }\n\n private close = (args?: any) => {\n this.props.dismissModal.apply(null, args);\n };\n\n private submit = () => {\n const { command, taskMonitor } = this.state;\n const { serverGroup, application } = this.props;\n\n taskMonitor.submit(() => {\n return ReactInjector.serverGroupWriter.rollbackServerGroup(serverGroup, application, command);\n });\n };\n\n private filterServerGroups = (disabledServerGroups: any) => {\n const filteredDisabledServerGroups = disabledServerGroups\n .filter((disabledServerGroup: any) => disabledServerGroup.instanceCounts.total !== 0)\n .sort((a: any, b: any) => b.name.localeCompare(a.name));\n\n return filteredDisabledServerGroups;\n };\n\n private isValid = () => {\n const restoreServerGroupName = this.state.command.rollbackContext.restoreServerGroupName;\n return restoreServerGroupName !== undefined;\n };\n\n private handleServerGroupChange = (restoreServerGroupOption: any) => {\n const { disabledServerGroups } = this.props;\n const newCommand = { ...this.state.command };\n newCommand.rollbackContext.restoreServerGroupName = restoreServerGroupOption.value;\n const restoreServerGroup = this.filterServerGroups(disabledServerGroups).find(function (disabledServerGroup: any) {\n return disabledServerGroup.name === restoreServerGroupOption.value;\n });\n newCommand.targetSize = restoreServerGroup.capacity.max;\n this.setState({\n command: newCommand,\n });\n };\n\n private handleTaskReasonChange = (taskReason?: any) => {\n const newCommand = { ...this.state.command };\n newCommand.reason = taskReason;\n this.setState({\n command: newCommand,\n });\n };\n\n public render() {\n const { command, taskMonitor, submitting } = this.state;\n const { serverGroup, disabledServerGroups } = this.props;\n const isValidSG = this.isValid();\n const disabledServerGroupOptions = this.filterServerGroups(disabledServerGroups).map(\n (disabledServerGroup: any) => ({\n label: disabledServerGroup.name,\n value: disabledServerGroup.name,\n }),\n );\n\n return (\n <Modal onHide={this.close}>\n <TaskMonitorWrapper monitor={taskMonitor} />\n {submitting && (\n <form role=\"form\">\n <ModalClose dismiss={this.close} />\n <Modal.Header>\n <Modal.Title>Rollback {serverGroup.name}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"row\">\n <div className=\"col-sm-3 sm-label-right\">Restore to</div>\n <div className=\"col-sm-6\">\n <Select\n value={command.rollbackContext.restoreServerGroupName}\n onChange={this.handleServerGroupChange}\n options={disabledServerGroupOptions}\n />\n </div>\n </div>\n <TaskReason reason={command.taskReason} onChange={this.handleTaskReasonChange} />\n </Modal.Body>\n <AzureModalFooter\n onSubmit={this.submit}\n onCancel={this.close}\n isValid={isValidSG}\n account={serverGroup.account}\n />\n </form>\n )}\n </Modal>\n );\n }\n}\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport {\n ConfirmationModalService,\n FirewallLabels,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n} from '@spinnaker/core';\n\nimport '../configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { AzureRollbackServerGroupModal } from './rollback/RollbackServerGroupModal';\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER =\n 'spinnaker.azure.serverGroup.details.controller';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER; // for backwards compatibility\nangular\n .module(AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER, [\n UIROUTER_ANGULARJS,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n SERVER_GROUP_WRITER,\n ])\n .controller('azureServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n '$templateCache',\n 'app',\n 'serverGroup',\n 'azureServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n function (\n $scope,\n $state,\n $templateCache,\n app,\n serverGroup,\n azureServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ) {\n $scope.state = {\n loading: true,\n };\n\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n function extractServerGroupSummary() {\n let summary = _.find(app.serverGroups.data, function (toCheck) {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some(function (loadBalancer) {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some(function (possibleServerGroup) {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n if (!summary) {\n $state.go('^');\n }\n return summary;\n }\n\n function retrieveServerGroup() {\n const summary = extractServerGroupSummary();\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then(function (details) {\n cancelLoader();\n\n angular.extend(details, summary);\n details.account = serverGroup.accountId; // it's possible the summary was not found because the clusters are still loading\n\n $scope.serverGroup = details;\n\n if (!_.isEmpty($scope.serverGroup)) {\n $scope.image = details.image ? details.image : undefined;\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach(function (tag) {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.launchConfig && details.launchConfig.securityGroups) {\n $scope.securityGroups = _.chain(details.launchConfig.securityGroups)\n .map(function (id) {\n return (\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n id: id,\n }) ||\n _.find(app.securityGroups.data, {\n accountName: serverGroup.accountId,\n region: serverGroup.region,\n name: id,\n })\n );\n })\n .compact()\n .value();\n }\n } else {\n $state.go('^');\n }\n });\n }\n\n function cancelLoader() {\n $scope.state.loading = false;\n }\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = function destroyServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: function () {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return serverGroupWriter.destroyServerGroup(serverGroup, app);\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = function disableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = () => serverGroupWriter.disableServerGroup(serverGroup, app);\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = function enableServerGroup() {\n const serverGroup = $scope.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(\n serverGroup,\n app,\n angular.extend(params, {\n interestingHealthProviderNames: [], // bypass the check for now; will change this later to ['azureService']\n }),\n );\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.rollbackServerGroup = () => {\n const serverGroup = $scope.serverGroup;\n const cluster = _.find(app.clusters, { name: serverGroup.cluster, account: serverGroup.account });\n const disabledServerGroups = _.filter(cluster.serverGroups, { isDisabled: true, region: serverGroup.region });\n AzureRollbackServerGroupModal.show({ application: app, serverGroup, disabledServerGroups });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'azureCloneServerGroupCtrl as ctrl',\n size: 'lg',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n azureServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.truncateCommitHash = function () {\n if ($scope.serverGroup && $scope.serverGroup.buildInfo && $scope.serverGroup.buildInfo.commit) {\n return $scope.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n },\n ]);\n","import { module } from 'angular';\n\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER } from './serverGroupDetails.azure.controller';\n\n('use strict');\n\nexport const AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE = 'spinnaker.azure.serverGroup.details.azure';\nexport const name = AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE; // for backwards compatibility\nmodule(AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE, [\n AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER,\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { ApplicationNameValidator } from '@spinnaker/core';\n\nexport const AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR = 'spinnaker.azure.validation.applicationName';\nexport const name = AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR; // for backwards compatibility\nmodule(AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR, [])\n .factory('azureApplicationNameValidator', function () {\n function validateSpecialCharacters(name, errors) {\n const pattern = /^([a-zA-Z][a-zA-Z0-9]*)?$/;\n if (!pattern.test(name)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters or digits. No ' +\n 'special characters are allowed.',\n );\n }\n }\n\n function validate(name) {\n const warnings = [];\n const errors = [];\n\n if (name && name.length) {\n validateSpecialCharacters(name, errors);\n }\n\n return {\n warnings: warnings,\n errors: errors,\n };\n }\n\n return {\n validate: validate,\n };\n })\n .run([\n 'azureApplicationNameValidator',\n function (azureApplicationNameValidator) {\n ApplicationNameValidator.registerValidator('azure', azureApplicationNameValidator);\n },\n ]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './help/azure.help';\nimport { AZURE_IMAGE_IMAGE_READER } from './image/image.reader';\nimport { AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE } from './instance/azureInstanceType.service';\nimport { AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { AzureLoadBalancerChoiceModal } from './loadBalancer/configure/AzureLoadBalancerChoiceModal';\nimport { AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER } from './loadBalancer/configure/createLoadBalancer.controller';\nimport { AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER } from './loadBalancer/details/loadBalancerDetail.controller';\nimport { AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER } from './loadBalancer/loadBalancer.transformer';\nimport logo from './logo/logo_azure.png';\nimport { AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE } from './pipeline/stages/bake/azureBakeStage';\nimport { AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/azureDestroyAsgStage';\nimport { AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE } from './pipeline/stages/disableAsg/azureDisableAsgStage';\nimport { AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE } from './pipeline/stages/enableAsg/azureEnableAsgStage';\nimport { AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL } from './securityGroup/configure/CreateSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL } from './securityGroup/configure/EditSecurityGroupCtrl';\nimport { AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './securityGroup/details/securityGroupDetail.controller';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_READER } from './securityGroup/securityGroup.reader';\nimport { AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup/securityGroup.transformer';\nimport { AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE } from './serverGroup/configure/serverGroup.configure.azure.module';\nimport { AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.azure.controller';\nimport { AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE } from './serverGroup/details/serverGroup.details.module';\nimport { AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\nimport { AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR } from './validation/applicationName.validator';\n\nimport './logo/azure.logo.less';\n\nexport const AZURE_MODULE = 'spinnaker.azure';\nmodule(AZURE_MODULE, [\n AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE,\n AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE,\n AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE,\n AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE,\n AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER,\n AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE,\n AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE,\n AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER,\n AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER,\n AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER,\n AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL,\n AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n AZURE_SECURITYGROUP_SECURITYGROUP_READER,\n AZURE_IMAGE_IMAGE_READER,\n AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR,\n]).config(function () {\n CloudProviderRegistry.registerProvider('azure', {\n name: 'Azure',\n logo: {\n path: logo,\n },\n image: {\n reader: 'azureImageReader',\n },\n serverGroup: {\n transformer: 'azureServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'azureServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'azureCloneServerGroupCtrl',\n commandBuilder: 'azureServerGroupCommandBuilder',\n configurationService: 'azureServerGroupConfigurationService',\n },\n instance: {\n instanceTypeService: 'azureInstanceTypeService',\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'azureInstanceDetailsCtrl',\n },\n loadBalancer: {\n transformer: 'azureLoadBalancerTransformer',\n detailsTemplateUrl: require('./loadBalancer/details/loadBalancerDetail.html'),\n detailsController: 'azureLoadBalancerDetailsCtrl',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/createLoadBalancer.html'),\n createLoadBalancerController: 'azureCreateLoadBalancerCtrl',\n CreateLoadBalancerModal: AzureLoadBalancerChoiceModal,\n },\n securityGroup: {\n transformer: 'azureSecurityGroupTransformer',\n reader: 'azureSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'azureSecurityGroupDetailsCtrl',\n createSecurityGroupTemplateUrl: require('./securityGroup/configure/createSecurityGroup.html'),\n createSecurityGroupController: 'azureCreateSecurityGroupCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('azure', ['redblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHv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\""],"names":["TagError","TagError2","AzureLoadBalancerTypes","type","description","_Utility","[object Object]","tagsObject","isValid","error","errorMessage","length","Object","keys","TAG_LIMITATION","k","v","entries","TAG_KEY_LENGTH_LIMITATION","TAG_VALUE_LENGTH_LIMITATION","TAG_INVALID_CHAR_REG_EXR","test","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","azure.securityGroup.ingress.description","azure.securityGroup.ingress.priority","azure.securityGroup.ingress.source","azure.securityGroup.ingress.sourcePortRange","azure.securityGroup.ingress.destination","azure.securityGroup.ingress.destinationPortRange","azure.securityGroup.ingress.direction","azure.securityGroup.ingress.actions","azure.securityGroup.ingress.destPortRanges","azure.securityGroup.ingress.sourceIPCIDRRanges","azure.serverGroup.imageName","azure.serverGroup.stack","azure.serverGroup.detail","azure.serverGroup.scriptLocation","azure.serverGroup.commandToExecute","azure.serverGroup.customData","azure.serverGroup.customTags","azure.serverGroup.enableInboundNAT","azure.serverGroup.lun","azure.serverGroup.diskSizeGB","azure.serverGroup.managedDisk.storageAccountType","azure.serverGroup.caching","azure.serverGroup.userAssignedIdentities","azure.loadBalancer.dnsName","azure.loadBalancer.probes.probeInterval","azure.loadBalancer.probes.timeout","azure.loadBalancer.probes.unhealthyThreshold","azure.loadBalancer.loadBalancingRules.idleTimeout","azure.loadBalancer.loadBalancingRules.sessionPersistence","forEach","key","HelpContentsRegistry","register","module","factory","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","$q","categories","label","families","instanceTypes","name","cpu","memory","storage","count","size","icon","calculateStorage","getCategories","map","category","family","inst","costFactor","stats","min","Number","MAX_VALUE","max","push","cpuMin","_","minBy","cpuMax","maxBy","memoryMin","memoryMax","storageMin","storageMax","Math","buildStats","when","getAvailableTypesForRegions","locationToInstanceTypesMap","selectedLocations","location","getAllTypesByRegion","UIROUTER_ANGULARJS","ANGULAR_UI_BOOTSTRAP","controller","$scope","$state","$uibModal","instance","app","retrieveInstance","extraData","instanceSummary","loadBalancers","account","vpcId","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","loadBalancer","isDisabled","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","details","state","loading","instance2","latest","isStandalone","health","displayableMetrics","filter","metric","detailsMatch","latestHealth","defaults","healthMetrics","extractHealthMetrics","discoveryMetric","vipAddress","vipList","includes","baseIpAddress","publicDnsName","privateIpAddress","go","instanceIdNotFound","detailsTemplateUrl","CloudProviderRegistry","getValue","standalone","this","canDeregisterFromLoadBalancer","canRegisterWithLoadBalancer","outOfService","hasLoadBalancerHealth","canRegisterWithDiscovery","discoveryHealth","terminateInstance","taskMonitor","application","title","onTaskComplete","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","InstanceWriter","terminateInstanceAndShrinkServerGroup","rebootInstance","registerInstanceWithLoadBalancer","loadBalancerNames","deregisterInstanceFromLoadBalancer","enableInstanceInDiscovery","disableInstanceInDiscovery","hasHealthState","healthProviderType","all","ready","$$destroyed","onRefresh","_AzureLoadBalancerChoiceModal","React","Component","props","super","choose","close","ModalInjector","modalService","open","templateUrl","createLoadBalancerTemplateUrl","windowClass","createLoadBalancerController","resolve","isNew","forPipelineConfig","loadBalancerType","selectedChoice","result","catch","reason","dismissModal","choices","ReactModal","show","className","choice","setState","createElement","Fragment","ModalClose","dismiss","Modal","Header","Title","Body","onClick","choiceSelected","Footer","Button","AzureLoadBalancerChoiceModal","defaultProps","closeModal","noop","AzureProviderSettings","SETTINGS","providers","azure","resetToOriginal","resetProvider","normalizeLoadBalancer","detachedInstances","concat","activeServerGroups","chain","flatten","value","convertLoadBalancerForEditing","toEdit","stack","detail","vnet","subnet","probes","loadBalancingRules","elb","securityGroups","dnsName","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","cloudProvider","probeName","probeProtocol","probePort","probePath","probeInterval","unhealthyThreshold","timeout","ruleName","protocol","externalPort","backendPort","persistence","idleTimeout","sku","$uibModalInstance","ctrl","onApplicationRefresh","newStateParams","accountLoadBalancersByRegion","getDataSource","existingLoadBalancerNames","regions","listeners","healthCheck","advancedSettings","isALB","accountsLoaded","TaskMonitor","modalInstance","refresh","azureLoadBalancerTransformer","updateLoadBalancerNames","AccountService","listAccounts","accounts","initializeController","requiresHealthCheckPath","updateName","getName","elbName","getRegionsForAccount","regionUpdated","vnetUpdated","selectedVnet","NetworkReader","listNetworks","vnets","selectedVnets","selectedSubnet","selectedVnetChanged","item","vnetResourceGroup","resourceGroup","subnets","addSubnet","devices","removeListener","index","addListener","submit","descriptor","appName","name2","ruleNameBase","rule","cancel","window","angular","run","templateCache","put","SECURITY_GROUP_READER","LOAD_BALANCER_READ_SERVICE","filtered","match","sortBy","ss","s","substring","toUpperCase","firewallsLabel","extractLoadBalancer","editLoadBalancer","copy","deleteLoadBalancer","command","loadBalancerName","accountId","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","roscoSelector","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","parseCustomScriptsSettings","configuration","Array","isArray","customScriptsSettings","fileUris","fileUrisTemp","trim","convertServerGroupCommandToDeployConfiguration","tempImage","viewState","mode","imageName","isCustom","publisher","offer","version","uri","ostype","selectedImage","selectedProvider","strategy","rollback","onFailure","scaleDown","maxRemainingAsgs","delayBeforeDisableSec","delayBeforeScaleDownSec","allowDeleteActive","allowScaleDownActive","freeFormDetails","healthSettings","image","useSourceCapacity","capacity","securityGroupName","user","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","isEmpty","instanceType","vmsku","indexOf","interestingHealthProviderNames","normalizeServerGroup","azureImageReader","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","images","selectedVnetSubnets","instanceProfile","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","loadBalancersConfigured","networkSettingsConfigured","securityGroupsConfigured","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromExisting","serverGroupName","NameUtils","parseServerGroupName","selectedSubnets","desired","tags","source","asgName","listImplicitSecurityGroups","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","disableImageSelection","submitButtonLabel","instanceTypeDetails","viewOverrides","extend","config","Registry","pipeline","registerStage","provides","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","supportsCustomTimeout","validators","fieldName","checkParentTriggers","getMessage","labels","restartable","i","newImage","osType","managedImageOptions","addExtendedAttribute","extendedAttributes","controllerAs","extendedAttribute","removeExtendedAttribute","showExtendedAttributes","showVarFileName","showDefaultImages","managedImagesWasChosen","defaultImagesWasChosen","packageType","showManagedImages","setManagedImages","customImagesWasChosen","managedImage","onChangeAccount","onChangeManagedImage","selectedManagedImage","onChangeOsType","e","$watch","forOwn","val","getCredentialsKeyedByAccount","BakeryReader","getRegions","getBaseOsOptions","credentialsKeyedByAccount","baseOsOptions","baseImages","baseLabelOptions","osTypeOptions","packageTypeOptions","showAdvancedOptions","stg","templateFileName","showAdvanced","baseOs","executionStepLabelUrl","accountExtractor","configAccountExtractor","message","fieldLabel","regionsLoaded","accountUpdated","getAccountDetails","targets","StageConstants","TARGET_LIST","alias","target","reset","deleteSecurityGroup","securityGroup","operation","TaskExecutor","executeTask","job","FirewallLabels","InfrastructureCaches","clearCache","upsertSecurityGroup","assignWith","other","isUndefined","pages","ingress","firewallLabel","accountName","swapRules","ruleset","a","b","priorityA","priority","priorityB","submitting","numToAdd","addMoreItems","onNextRefresh","subnetUpdated","securityGroup2","namePreview","upsert","azureSecurityGroupWriter","addRule","access","direction","sourceAddressPrefix","sourceAddressPrefixes","sourcePortRange","destinationAddressPrefix","destinationPortRange","destinationPortRanges","sourceIPCIDRRanges","portUpdated","ruleRanges","destPortRanges","sourceIPCIDRUpdated","protocolUpdated","moveUp","moveDown","securityRules","CACHE_INITIALIZER_SERVICE","temp","refreshingSecurityGroups","getSecurityGroupRefreshTime","refreshSecurityGroups","securityGroupReader","getAllSecurityGroups","availableGroups","availableSecurityGroups","protocolUI","removeRule","splice","startPort","endPort","resolvedSecurityGroup","extractSecurityGroup","fourOhFour","editInboundRules","resolveIndexedSecurityGroup","indexedSecurityGroups","container","securityGroupId","normalizeSecurityGroup","instanceTypeService","modalWizardService","wizard","getWizard","includePage","markClean","markComplete","excludePage","newVal","markDirty","restrict","scope","bindToController","addDataDisk","newDataDisks","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","input","selectedRegion","IMAGE_READER","$controller","$uibModalStack","imageReader","ModalWizard","markIncomplete","imageChanged","stackPattern","templatingEnabled","detailPattern","directive","healthCheckProtocols","displayName","changeHealthCheckProtocol","newProtocol","port","requestPath","clearImage","loadBalancerReader","loadVnetSubnets","getLoadBalancerDetails","LBs","selectedLoadBalancer","attachedVnet","allVnets","device","attachedSubnet","useLoadBalancer","loadBalancerChanged","backingData","loadBalancerToFind","getLoadBalancerType","vnetChanged","networkSettingsChanged","getVnetName","selectedSecurityGroup","securityGroupChanged","azureServerGroupConfigurationService","link","refreshing","getTagResult","updateEnableInboundNAT","vm","cacheInitializer","azureInstanceTypeService","dataDiskTypes","dataDiskCachingTypes","healthCheckTypes","terminationPolicies","configureInstanceTypes","dirty","c","locations","every","l","startsWith","configureStandardInstanceTypes","configureZones","filteredData","regionsSupportZones","availabilityZones","getRegionalSecurityGroups","newSecurityGroups","configureSecurityGroupOptions","currentOptions","newRegionalSecurityGroups","getLoadBalancerNames","uniq","sort","configureLoadBalancerOptions","current","newLoadBalancers","matched","intersection","removed","xor","configureLoadBalancers","filterlist","configureUpdateCommand","configureCommand","loadSecurityGroups","loadLoadBalancers","cmd","regionChanged","isInit","credentialsChanged","regionsForAccount","defaultKeyPair","configureImages","regionalImages","packageImages","amis","ami","refreshLoadBalancers","skipCommandReconfiguration","listLoadBalancers","refreshCache","refreshInstanceTypes","SERVER_GROUP_WRITER","cloneStage","newServerGroupName","transitionTo","serverGroupCommand","loaded","initializeWizardState","processCommandUpdateResult","createResultProcessor","method","newValue","oldValue","zoneEnabled","templateSelection","basicSettings","imageSettings","networkSettings","applicationName","templateSelectionText","copied","notCopied","additionalCopyText","suspendedProcesses","processIndex","process","processIsSuspended","templateSelected","AzureModalFooter","verified","handleVerification","onSubmit","onCancel","UserVerification","expectedValue","onValidChange","disabled","_AzureRollbackServerGroupModal","args","apply","ReactInjector","serverGroupWriter","rollbackServerGroup","filterServerGroups","disabledServerGroups","disabledServerGroup","instanceCounts","total","localeCompare","rollbackContext","restoreServerGroupName","handleServerGroupChange","restoreServerGroupOption","newCommand","restoreServerGroup","targetSize","handleTaskReasonChange","taskReason","modalInstanceEmulation","rollbackType","rollbackServerGroupName","enableAndDisableOnly","isValidSG","disabledServerGroupOptions","onHide","TaskMonitorWrapper","monitor","role","Select","onChange","options","TaskReason","AzureRollbackServerGroupModal","retrieveServerGroup","summary","extractServerGroupSummary","ServerGroupReader","getServerGroup","tag","keyVal","launchConfig","compact","destroyServerGroup","serverGroup2","stateParams","confirmationModalParams","ServerGroupWarningMessageService","disableServerGroup","enableServerGroup","cloneServerGroup","validate","errors","validateSpecialCharacters","warnings","azureApplicationNameValidator","ApplicationNameValidator","registerValidator","css","ref","insertAt","document","head","getElementsByTagName","style","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","AZURE_MODULE","registerProvider","logo","reader","transformer","detailsController","cloneServerGroupTemplateUrl","cloneServerGroupController","commandBuilder","configurationService","CreateLoadBalancerModal","createSecurityGroupTemplateUrl","createSecurityGroupController","DeploymentStrategyRegistry"],"mappings":"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"}