@spinnaker/azure 2026.0.3 → 2026.1.1
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/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","checkTags","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","getLoadBalancerType","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","forEach","key","HelpContentsRegistry","register","AZURE_IMAGE_IMAGE_READER","module","factory","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE","$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","AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","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","constructor","props","super","choose","close","ModalInjector","modalService","open","templateUrl","createLoadBalancerTemplateUrl","windowClass","createLoadBalancerController","resolve","isNew","forPipelineConfig","loadBalancerType","selectedChoice","result","catch","reason","dismissModal","choices","show","ReactModal","className","choiceSelected","choice","setState","render","createElement","Fragment","ModalClose","dismiss","Modal","Header","Title","Body","onClick","Footer","Button","AzureLoadBalancerChoiceModal","defaultProps","closeModal","noop","AzureProviderSettings","SETTINGS","providers","azure","resetToOriginal","resetProvider","AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER","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","AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER","$uibModalInstance","azureLoadBalancerTransformer","ctrl","onApplicationRefresh","newStateParams","accountId","updateLoadBalancerNames","accountLoadBalancersByRegion","getDataSource","refresh","loadBalancer2","existingLoadBalancerNames","regions","pages","listeners","healthCheck","advancedSettings","isALB","accountsLoaded","submitting","validSkus","TaskMonitor","modalInstance","onNextRefresh","nameParts","NameUtils","parseLoadBalancerName","freeFormDetails","AccountService","listAccounts","accounts","accountUpdated","initializeController","requiresHealthCheckPath","indexOf","updateName","getName","elbName","trimEnd","getRegionsForAccount","regionUpdated","vnetUpdated","selectedVnet","vnetResourceGroup","selectedVnets","NetworkReader","listNetworks","vnets","subnetUpdated","selectedSubnet","selectedSubnets","selectedVnetChanged","item","resourceGroup","subnets","addSubnet","devices","device","removeListener","index","splice","addListener","submit","descriptor","appName","clusterName","resourceGroupName","loadBalancerName","name2","ruleNameBase","subnetType","rule","LoadBalancerWriter","upsertLoadBalancer","cancel","AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER","angular","SECURITY_GROUP_READER","LOAD_BALANCER_READ_SERVICE","$exceptionHandler","securityGroupReader","loadBalancerReader","extractLoadBalancer","getLoadBalancerDetails","filtered","securityGroupId","match","getApplicationSecurityGroup","sortBy","s","ss","substring","toUpperCase","firewallsLabel","FirewallLabels","editLoadBalancer","copy","deleteLoadBalancer","command","AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","roscoSelector","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER","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","healthSettings","image","useSourceCapacity","capacity","securityGroupName","user","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","isEmpty","instanceType","vmsku","interestingHealthProviderNames","normalizeServerGroup","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","azureImageReader","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","images","selectedVnetSubnets","instanceProfile","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","loadBalancersConfigured","networkSettingsConfigured","securityGroupsConfigured","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromExisting","serverGroupName","parseServerGroupName","desired","tags","source","asgName","listImplicitSecurityGroups","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","disableImageSelection","submitButtonLabel","instanceTypeDetails","viewOverrides","extend","AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE","config","Registry","pipeline","registerStage","provides","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","validators","fieldName","checkParentTriggers","getMessage","labels","restartable","setManagedImages","managedImages","managedImageOptions","i","newImage","osType","extendedAttributes","AuthenticationService","getAuthenticatedUser","addExtendedAttribute","PipelineTemplates","addExtendedAttributes","controllerAs","extendedAttribute","removeExtendedAttribute","showTemplateFileName","templateFileName","showExtendedAttributes","showVarFileName","varFileName","showDefaultImages","managedImagesWasChosen","defaultImagesWasChosen","customImagesWasChosen","managedImage","packageType","showManagedImages","baseOs","showCustomImages","onChangeAccount","r","onChangeManagedImage","selectedManagedImage","onChangeOsType","e","$watch","forOwn","val","getCredentialsKeyedByAccount","BakeryReader","getRegions","getBaseOsOptions","getBaseLabelOptions","credentialsKeyedByAccount","baseOsOptions","baseLabelOptions","baseImages","osTypeOptions","packageTypeOptions","showAdvancedOptions","stg","showAdvanced","AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE","executionStepLabelUrl","accountExtractor","configAccountExtractor","message","fieldLabel","regionsLoaded","getAccountDetails","org","targets","StageConstants","TARGET_LIST","target","AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE","alias","attributes","platformHealthOnly","AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE","reset","resetSelectedCluster","AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE","deleteSecurityGroup","securityGroup","operation","TaskExecutor","executeTask","job","InfrastructureCaches","clearCache","upsertSecurityGroup","assignWith","other","isUndefined","AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL","$controller","azureSecurityGroupWriter","ingress","firewallLabel","accountName","swapRules","ruleset","a","b","temp","priorityA","priority","priorityB","infiniteScroll","numToAdd","currentItems","addMoreItems","securityGroup2","namePreview","upsert","addRule","protocolUI","access","direction","sourceAddressPrefix","sourceAddressPrefixes","sourcePortRange","destinationAddressPrefix","destinationPortRange","destinationPortRanges","destPortRanges","sourceIPCIDRRanges","portUpdated","ruleRanges","sourceIPCIDRUpdated","protocolUpdated","removeRule","moveUp","moveDown","securityRules","AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL","CACHE_INITIALIZER_SERVICE","cacheInitializer","destinationPortRangeModel","sourceAddressPrefixModel","refreshingSecurityGroups","getSecurityGroupRefreshTime","getStats","ageMax","refreshSecurityGroups","refreshCache","getAllSecurityGroups","availableGroups","availableSecurityGroups","AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER","startPort","endPort","AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER","resolvedSecurityGroup","extractSecurityGroup","getSecurityGroupDetails","fourOhFour","editInboundRules","cloneSecurityGroup","AZURE_SECURITYGROUP_SECURITYGROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","normalizeSecurityGroup","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER","instanceTypeService","modalWizardService","wizard","getWizard","includePage","markClean","markComplete","excludePage","newVal","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER","markDirty","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE","directive","restrict","scope","bindToController","addDataDisk","newDataDisks","lun","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER","input","selectedRegion","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER","IMAGE_READER","$uibModalStack","imageReader","ModalWizard","markIncomplete","imageChanged","stackPattern","templatingEnabled","detailPattern","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER","healthCheckProtocols","displayName","changeHealthCheckProtocol","newProtocol","port","requestPath","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER","clearImage","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER","loadVnetSubnets","LBs","selectedLoadBalancer","attachedVnet","allVnets","attachedSubnet","useLoadBalancer","loadBalancerChanged","backingData","loadBalancerToFind","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER","vnetChanged","networkSettingsChanged","getVnetName","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER","selectedSecurityGroup","securityGroupChanged","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE","azureServerGroupConfigurationService","link","refreshing","AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE","getTagResult","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE","updateEnableInboundNAT","vm","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE","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","refreshInstanceTypes","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER","SERVER_GROUP_WRITER","serverGroupWriter","serverGroupCommand","cloneStage","task","execution","stages","newServerGroupName","transitionTo","loaded","initializeWizardState","processCommandUpdateResult","createResultProcessor","method","newValue","oldValue","zoneEnabled","templateSelection","basicSettings","imageSettings","networkSettings","applicationName","templateSelectionText","copied","notCopied","additionalCopyText","cloneServerGroup","toggleSuspendedProcess","process","suspendedProcesses","processIndex","processIsSuspended","templateSelected","AzureModalFooter","verified","handleVerification","onSubmit","onCancel","UserVerification","expectedValue","onValidChange","disabled","_AzureRollbackServerGroupModal","args","apply","ReactInjector","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","AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER","$templateCache","azureServerGroupCommandBuilder","retrieveServerGroup","summary","toCheck","possibleServerGroup","extractServerGroupSummary","ServerGroupReader","getServerGroup","tag","keyVal","baseImage","launchConfig","compact","destroyServerGroup","serverGroup2","stateParams","confirmationModalParams","ServerGroupWarningMessageService","addDestroyWarningMessage","disableServerGroup","addDisableWarningMessage","enableServerGroup","cluster","clusters","truncateCommitHash","buildInfo","commit","AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE","AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR","validate","errors","validateSpecialCharacters","warnings","run","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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"}
|
|
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.length === 0) {\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":["AzureLoadBalancerTypes","type","description","_Utility","checkTags","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","getLoadBalancerType","typeString","toLowerCase","split","join","find","lb","Utility","helpContents","forEach","key","HelpContentsRegistry","register","AZURE_IMAGE_IMAGE_READER","module","factory","findImages","params","REST","query","get","then","results","getImage","amiName","region","credentials","path","provider","AZURE_INSTANCE_AZUREINSTANCETYPE_SERVICE","$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","AZURE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","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","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","constructor","props","super","choose","close","ModalInjector","modalService","open","templateUrl","createLoadBalancerTemplateUrl","windowClass","createLoadBalancerController","resolve","isNew","forPipelineConfig","loadBalancerType","selectedChoice","result","catch","reason","dismissModal","choices","show","ReactModal","className","choiceSelected","choice","setState","render","createElement","Fragment","ModalClose","dismiss","Modal","Header","Title","Body","onClick","Footer","Button","defaultProps","closeModal","noop","AzureLoadBalancerChoiceModal","AzureProviderSettings","SETTINGS","providers","azure","resetToOriginal","resetProvider","AZURE_LOADBALANCER_LOADBALANCER_TRANSFORMER","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","AZURE_LOADBALANCER_CONFIGURE_CREATELOADBALANCER_CONTROLLER","$uibModalInstance","azureLoadBalancerTransformer","ctrl","onApplicationRefresh","newStateParams","accountId","updateLoadBalancerNames","accountLoadBalancersByRegion","getDataSource","refresh","existingLoadBalancerNames","regions","pages","listeners","healthCheck","advancedSettings","isALB","accountsLoaded","submitting","validSkus","TaskMonitor","modalInstance","onNextRefresh","nameParts","NameUtils","parseLoadBalancerName","freeFormDetails","AccountService","listAccounts","accounts","accountUpdated","initializeController","requiresHealthCheckPath","indexOf","updateName","getName","elbName","trimEnd","getRegionsForAccount","regionUpdated","vnetUpdated","selectedVnet","vnetResourceGroup","selectedVnets","NetworkReader","listNetworks","vnets","subnetUpdated","selectedSubnet","selectedSubnets","selectedVnetChanged","item","resourceGroup","subnets","addSubnet","devices","device","removeListener","index","splice","addListener","submit","descriptor","appName","clusterName","resourceGroupName","loadBalancerName","ruleNameBase","subnetType","rule","LoadBalancerWriter","upsertLoadBalancer","cancel","AZURE_LOADBALANCER_DETAILS_LOADBALANCERDETAIL_CONTROLLER","angular","SECURITY_GROUP_READER","LOAD_BALANCER_READ_SERVICE","$exceptionHandler","securityGroupReader","loadBalancerReader","extractLoadBalancer","getLoadBalancerDetails","filtered","securityGroupId","match","getApplicationSecurityGroup","sortBy","s","ss","substring","toUpperCase","firewallsLabel","FirewallLabels","editLoadBalancer","copy","deleteLoadBalancer","command","AZURE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","roscoSelector","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","AZURE_SERVERGROUP_SERVERGROUP_TRANSFORMER","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","healthSettings","image","useSourceCapacity","capacity","securityGroupName","user","upgradePolicy","tier","instanceTags","dataDisks","userAssignedIdentities","osConfig","customData","commandToExecute","zonesEnabled","zones","enableInboundNAT","isEmpty","instanceType","vmsku","interestingHealthProviderNames","normalizeServerGroup","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","azureImageReader","azureServerGroupTransformer","buildNewServerGroupCommand","defaultRegion","images","selectedVnetSubnets","instanceProfile","allImageSelection","useAllImageSelection","useSimpleCapacity","usePreferredZones","disableStrategySelection","loadBalancersConfigured","networkSettingsConfigured","securityGroupsConfigured","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromExisting","serverGroupName","parseServerGroupName","desired","tags","source","asgName","listImplicitSecurityGroups","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","disableImageSelection","submitButtonLabel","instanceTypeDetails","viewOverrides","extend","AZURE_PIPELINE_STAGES_BAKE_AZUREBAKESTAGE","config","Registry","pipeline","registerStage","provides","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","validators","fieldName","checkParentTriggers","getMessage","labels","restartable","setManagedImages","managedImages","managedImageOptions","i","newImage","osType","extendedAttributes","AuthenticationService","getAuthenticatedUser","addExtendedAttribute","PipelineTemplates","addExtendedAttributes","controllerAs","extendedAttribute","removeExtendedAttribute","showTemplateFileName","templateFileName","showExtendedAttributes","showVarFileName","varFileName","showDefaultImages","managedImagesWasChosen","defaultImagesWasChosen","customImagesWasChosen","managedImage","packageType","showManagedImages","baseOs","showCustomImages","onChangeAccount","r","onChangeManagedImage","selectedManagedImage","onChangeOsType","e","$watch","forOwn","val","getCredentialsKeyedByAccount","BakeryReader","getRegions","getBaseOsOptions","getBaseLabelOptions","credentialsKeyedByAccount","baseOsOptions","baseLabelOptions","baseImages","osTypeOptions","packageTypeOptions","showAdvancedOptions","stg","showAdvanced","AZURE_PIPELINE_STAGES_DESTROYASG_AZUREDESTROYASGSTAGE","executionStepLabelUrl","accountExtractor","configAccountExtractor","message","fieldLabel","regionsLoaded","getAccountDetails","org","targets","StageConstants","TARGET_LIST","target","AZURE_PIPELINE_STAGES_DISABLEASG_AZUREDISABLEASGSTAGE","alias","attributes","platformHealthOnly","AZURE_PIPELINE_STAGES_ENABLEASG_AZUREENABLEASGSTAGE","reset","resetSelectedCluster","AZURE_SECURITYGROUP_SECURITYGROUP_WRITE_SERVICE","deleteSecurityGroup","securityGroup","operation","TaskExecutor","executeTask","job","InfrastructureCaches","clearCache","upsertSecurityGroup","assignWith","other","isUndefined","AZURE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUPCTRL","$controller","azureSecurityGroupWriter","ingress","firewallLabel","accountName","swapRules","ruleset","a","b","temp","priorityA","priority","priorityB","infiniteScroll","numToAdd","currentItems","addMoreItems","namePreview","upsert","addRule","protocolUI","access","direction","sourceAddressPrefix","sourceAddressPrefixes","sourcePortRange","destinationAddressPrefix","destinationPortRange","destinationPortRanges","destPortRanges","sourceIPCIDRRanges","portUpdated","ruleRanges","sourceIPCIDRUpdated","protocolUpdated","removeRule","moveUp","moveDown","securityRules","AZURE_SECURITYGROUP_CONFIGURE_EDITSECURITYGROUPCTRL","CACHE_INITIALIZER_SERVICE","cacheInitializer","destinationPortRangeModel","sourceAddressPrefixModel","refreshingSecurityGroups","getSecurityGroupRefreshTime","getStats","ageMax","refreshSecurityGroups","refreshCache","getAllSecurityGroups","availableGroups","availableSecurityGroups","AZURE_SECURITYGROUP_CLONE_CLONESECURITYGROUP_CONTROLLER","startPort","endPort","AZURE_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER","resolvedSecurityGroup","extractSecurityGroup","getSecurityGroupDetails","fourOhFour","editInboundRules","cloneSecurityGroup","AZURE_SECURITYGROUP_SECURITYGROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","AZURE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","normalizeSecurityGroup","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCEARCHETYPE_CONTROLLER","instanceTypeService","modalWizardService","wizard","getWizard","includePage","markClean","markComplete","excludePage","newVal","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SERVERGROUPINSTANCETYPE_CONTROLLER","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_SERVERGROUPADVANCEDSETTINGS_CONTROLLER","markDirty","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGSSELECTOR_DIRECTIVE","directive","restrict","scope","bindToController","addDataDisk","newDataDisks","lun","managedDisk","storageAccountType","diskSizeGB","caching","createOption","removeDataDisk","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_IMAGE_REGIONAL_FILTER","input","selectedRegion","AZURE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_SERVERGROUPBASICSETTINGS_CONTROLLER","IMAGE_READER","$uibModalStack","imageReader","ModalWizard","markIncomplete","imageChanged","stackPattern","templatingEnabled","detailPattern","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_SERVERGROUPHEALTHSETTINGS_CONTROLLER","healthCheckProtocols","displayName","changeHealthCheckProtocol","newProtocol","port","requestPath","AZURE_SERVERGROUP_CONFIGURE_WIZARD_HEALTHSETTINGS_HEALTHSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_SERVERGROUPIMAGESETTINGS_CONTROLLER","clearImage","AZURE_SERVERGROUP_CONFIGURE_WIZARD_IMAGESETTINGS_IMAGESETTINGS_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERS_CONTROLLER","loadVnetSubnets","LBs","selectedLoadBalancer","attachedVnet","allVnets","attachedSubnet","useLoadBalancer","loadBalancerChanged","backingData","loadBalancerToFind","AZURE_SERVERGROUP_CONFIGURE_WIZARD_LOADBALANCERS_SERVERGROUPLOADBALANCERSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGS_CONTROLLER","vnetChanged","networkSettingsChanged","getVnetName","AZURE_SERVERGROUP_CONFIGURE_WIZARD_NETWORKSETTINGS_SERVERGROUPNETWORKSETTINGSSELECTOR_DIRECTIVE","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPS_CONTROLLER","selectedSecurityGroup","securityGroupChanged","AZURE_SERVERGROUP_CONFIGURE_WIZARD_SECURITYGROUP_SERVERGROUPSECURITYGROUPSSELECTOR_DIRECTIVE","azureServerGroupConfigurationService","link","refreshing","AZURE_SERVERGROUP_CONFIGURE_WIZARD_TAGS_TAGSSELECTOR_DIRECTIVE","getTagResult","AZURE_SERVERGROUP_CONFIGURE_WIZARD_ZONES_ZONESELECTOR_DIRECTIVE","updateEnableInboundNAT","vm","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_AZURE_MODULE","AZURE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE","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","configureImages","regionalImages","packageImages","amis","ami","refreshLoadBalancers","skipCommandReconfiguration","listLoadBalancers","refreshInstanceTypes","AZURE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_AZURE_CONTROLLER","SERVER_GROUP_WRITER","serverGroupWriter","serverGroupCommand","cloneStage","task","execution","stages","newServerGroupName","transitionTo","loaded","initializeWizardState","processCommandUpdateResult","createResultProcessor","method","newValue","oldValue","zoneEnabled","templateSelection","basicSettings","imageSettings","networkSettings","applicationName","templateSelectionText","copied","notCopied","additionalCopyText","cloneServerGroup","toggleSuspendedProcess","process","suspendedProcesses","processIndex","processIsSuspended","templateSelected","AzureModalFooter","verified","handleVerification","onSubmit","onCancel","UserVerification","expectedValue","onValidChange","disabled","_AzureRollbackServerGroupModal","args","apply","ReactInjector","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","AZURE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_AZURE_CONTROLLER","$templateCache","azureServerGroupCommandBuilder","retrieveServerGroup","summary","toCheck","possibleServerGroup","extractServerGroupSummary","ServerGroupReader","getServerGroup","tag","keyVal","baseImage","launchConfig","compact","destroyServerGroup","stateParams","confirmationModalParams","ServerGroupWarningMessageService","addDestroyWarningMessage","disableServerGroup","addDisableWarningMessage","enableServerGroup","cluster","clusters","truncateCommitHash","buildInfo","commit","AZURE_SERVERGROUP_DETAILS_SERVERGROUP_DETAILS_MODULE","AZURE_VALIDATION_APPLICATIONNAME_VALIDATOR","validate","errors","validateSpecialCharacters","warnings","run","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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","x_google_ignoreList":[51]}
|