@spinnaker/oracle 2026.0.2 → 2026.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/helpContents/oracleHelpContents.ts","../src/image/image.reader.js","../src/instance/details/instance.details.controller.js","../src/domain/IOracleLoadBalancer.ts","../src/oracle.settings.ts","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/configure/createLoadBalancer.controller.ts","../src/loadBalancer/details/loadBalancerDetail.controller.ts","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/pipeline/stages/bake/ociBakeStage.js","../src/pipeline/stages/destroyAsg/destroyAsgStage.js","../src/pipeline/stages/disableAsg/disableAsgStage.js","../src/pipeline/stages/findAmi/findAmiStage.js","../src/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.js","../src/pipeline/stages/resizeAsg/resizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/shrinkClusterStage.js","../src/securityGroup/configure/createSecurityGroup.controller.js","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/basicSettings/basicSettings.controller.js","../src/serverGroup/configure/wizard/capacity/capacitySelector.component.js","../src/serverGroup/configure/serverGroup.configure.module.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/wizard/cloneServerGroup.controller.js","../src/common/footer.component.js","../src/serverGroup/details/resize/resizeCapacity.component.js","../src/serverGroup/details/resize/resizeServerGroup.controller.js","../src/serverGroup/details/rollback/rollbackServerGroup.controller.js","../src/serverGroup/details/serverGroupDetails.controller.js","../src/serverGroup/serverGroup.transformer.js","../src/oracle.module.ts"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'oracle.serverGroup.stack',\n value: '(Optional) <b>Stack</b> Stack name',\n },\n {\n key: 'oracle.serverGroup.detail',\n value: '(Optional) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n },\n {\n key: 'oracle.pipeline.config.bake.baseOsOption',\n value: '<p>The base image from which the image will be created.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.image_name',\n value: '<p>The base name of the image that will be created.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.package',\n value:\n '<p>The name of the package you want installed (without any version identifiers).</p>' +\n '<p>If there are multiple packages (space separated), then they will be installed in the order they are entered.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.upgrade',\n value:\n '<p>Perform a package manager upgrade before proceeding with the package installation.</p>' +\n '<p>For example: <i>yum update</i>.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.regions',\n value:\n '<p>The region in which the new image will be created.</p>' +\n '<p>NB: <i>Currently baked images are restricted to a single region</i>.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.user',\n value: '<p>The name of Oracle <i>user</i> that will be used during the baking process.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.account_name',\n value: '<p>The name of Oracle <i>account</i> that will be used during the baking process.</p>',\n },\n {\n key: 'oracle.serverGroup.sshAuthorizedKeys',\n value: '<p>The public SSH key for the default user on the instance.</p>',\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nexport const ORACLE_IMAGE_IMAGE_READER = 'spinnaker.oracle.image.reader';\nexport const name = ORACLE_IMAGE_IMAGE_READER; // for backwards compatibility\nmodule(ORACLE_IMAGE_IMAGE_READER, []).factory('oracleImageReader', function () {\n function findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .catch(function () {\n return [];\n });\n }\n\n function getImage(imageId, region, credentials) {\n return REST('/images')\n .path(credentials, region, imageId)\n .query({ provider: 'oracle' })\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,\n getImage,\n };\n});\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { InstanceReader } from '@spinnaker/core';\n\nexport const ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.oracle.instance.details.controller';\nexport const name = ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'oracleInstanceDetailsCtrl',\n [\n '$scope',\n '$q',\n 'app',\n 'instance',\n function ($scope, $q, app, instance) {\n $scope.application = app;\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n function retrieveInstance() {\n let instanceSummary, account, region;\n if (!$scope.application.serverGroups) {\n instanceSummary = {};\n account = instance.account;\n region = instance.region;\n } else {\n $scope.application.serverGroups.data.some((serverGroup) => {\n return serverGroup.instances.some((possibleInstance) => {\n if (possibleInstance.id === instance.instanceId || possibleInstance.name === instance.instanceId) {\n instanceSummary = possibleInstance;\n account = serverGroup.account;\n region = serverGroup.region;\n return true;\n }\n });\n });\n }\n\n $scope.instance = instanceSummary;\n InstanceReader.getInstanceDetails(account, region, instance.instanceId).then((instanceDetails) => {\n Object.assign($scope.instance, instanceDetails);\n });\n }\n },\n ],\n);\n","import type { ILoadBalancer, ILoadBalancerDeleteCommand, ILoadBalancerUpsertCommand, ISubnet } from '@spinnaker/core';\n\nexport type ListenerProtocol = 'HTTP' | 'HTTPS' | 'TCP' | 'SSL';\nexport enum LoadBalancingPolicy {\n ROUND_ROBIN = 'ROUND_ROBIN',\n IP_HASH = 'IP_HASH',\n LEAST_CONNECTIONS = 'LEAST_CONNECTIONS',\n}\n\nexport interface IOracleSubnet extends ISubnet {\n id: string;\n name: string;\n availabilityDomain: string;\n securityListIds: string[];\n vcnId: string;\n}\n\nexport interface IOracleLoadBalancer extends ILoadBalancer {\n shape: string; // required\n isPrivate: boolean; // required\n subnets: IOracleSubnet[]; // required 1 for private LB, 2 for public LB\n certificates?: { [name: string]: IOracleListenerCertificate };\n listeners?: { [name: string]: IOracleListener }; // not required to create LB, but useless without it\n hostnames?: IOracleHostname[];\n backendSets?: { [name: string]: IOracleBackEndSet }; // not required to create LB, but useless without it\n freeformTags?: { [tagName: string]: string };\n id?: string; // not required to create LB\n subnetTypeMap?: { [id: string]: 'AD' | 'Regional' };\n // TODO support path route sets\n}\n\n// This is created from loadBalancer/loadBalancer.states.ts\nexport interface ILoadBalancerDetails {\n name: string;\n accountId: string;\n region: string;\n vpcId: string;\n}\n\nexport interface IOracleListener {\n name: string;\n protocol: ListenerProtocol;\n port: number;\n defaultBackendSetName: string;\n isSsl: boolean;\n sslConfiguration?: IOracleListenerSSLConfiguration;\n hostnames?: IOracleHostname[];\n // TODO support pathRouteSets\n}\n\nexport interface IOracleListenerSSLConfiguration {\n certificateName: string;\n verifyDepth: number;\n verifyPeerCertificates: boolean;\n}\n\nexport interface IOracleHostname {\n name: string;\n hostname: string;\n}\n\nexport interface IOracleBackEndSet {\n name: string;\n policy: LoadBalancingPolicy;\n healthChecker: IOracleBackendSetHealthCheck;\n // TODO desagar sessionPersistenceConfiguration?: IOracleLoadBalancerSessionPersistenceConfiguration;\n backends: any[];\n isNew: boolean;\n}\n\nexport interface IOracleListenerCertificate {\n certificateName: string;\n publicCertificate: string;\n caCertificate: string;\n privateKey: string;\n passphrase: string;\n isNew: boolean;\n}\n\nexport interface IOracleBackendSetHealthCheck {\n urlPath: string; // required\n protocol: 'HTTP' | 'TCP';\n port: number;\n intervalMillis?: number;\n timeoutMillis?: number;\n retries?: number;\n returnCode?: number;\n responseBodyRegex?: string;\n}\n\n/**\n * IOracleLoadBalancerUpsertCommand is nearly identical to IOracleLoadBalancer -\n * Command objects are the shape of data sent to gate.\n */\nexport interface IOracleLoadBalancerUpsertCommand extends ILoadBalancerUpsertCommand {\n shape: string; // required\n isPrivate: boolean; // required\n subnetIds: string[]; // required 1 for private LB, 2 for public LB\n certificates?: { [name: string]: IOracleListenerCertificate };\n listeners?: { [name: string]: IOracleListener }; // not required to create LB, but useless without it\n hostnames?: IOracleHostname[];\n backendSets?: { [name: string]: IOracleBackEndSet }; // not required to create LB, but useless without it\n freeformTags?: { [tagName: string]: string };\n vpcId: string;\n subnetTypeMap?: { [id: string]: 'AD' | 'Regional' };\n}\n\nexport interface IOracleLoadBalancerDeleteCommand extends ILoadBalancerDeleteCommand {\n loadBalancerId: string;\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IOracleProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const OracleProviderSettings: IOracleProviderSettings = (SETTINGS.providers\n .oracle as IOracleProviderSettings) || { defaults: {} };\nif (OracleProviderSettings) {\n OracleProviderSettings.resetToOriginal = SETTINGS.resetProvider('oracle');\n}\n\nexport const OracleDefaultProviderSettings = {\n defaults: { account: 'DEFAULT', bakeryRegions: 'us-phoenix-1', region: 'us-phoenix-1' },\n};\n","import { module } from 'angular';\nimport { $q } from 'ngimport';\n\nimport type { Application } from '@spinnaker/core';\nimport type {\n IOracleBackEndSet,\n IOracleListener,\n IOracleListenerCertificate,\n IOracleListenerSSLConfiguration,\n IOracleLoadBalancer,\n IOracleLoadBalancerUpsertCommand,\n} from '../domain/IOracleLoadBalancer';\nimport { LoadBalancingPolicy } from '../domain/IOracleLoadBalancer';\nimport { OracleProviderSettings } from '../oracle.settings';\nimport { OracleDefaultProviderSettings } from '../oracle.settings';\n\nexport class OracleLoadBalancerTransformer {\n public normalizeLoadBalancer(loadBalancer: IOracleLoadBalancer): PromiseLike<IOracleLoadBalancer> {\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 var activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups)\n .map('instances')\n .flatten()\n .value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups)\n .map('detachedInstances')\n .flatten()\n .value();*/\n return $q.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(loadBalancer: IOracleLoadBalancer): IOracleLoadBalancerUpsertCommand {\n if (loadBalancer.listeners) {\n Object.keys(loadBalancer.listeners).forEach((key) => {\n const lis = loadBalancer.listeners[key];\n lis.isSsl = !!lis.sslConfiguration; // use !! operator to get truthiness value\n });\n }\n const toEdit: IOracleLoadBalancerUpsertCommand = {\n name: loadBalancer.name,\n cloudProvider: loadBalancer.cloudProvider,\n credentials: loadBalancer.account,\n region: loadBalancer.region,\n shape: loadBalancer.shape,\n isPrivate: loadBalancer.isPrivate,\n subnetIds: loadBalancer.subnets.map((subnet) => subnet.id),\n certificates: loadBalancer.certificates,\n listeners: loadBalancer.listeners,\n hostnames: loadBalancer.hostnames,\n backendSets: loadBalancer.backendSets,\n freeformTags: loadBalancer.freeformTags,\n loadBalancerType: loadBalancer.type,\n securityGroups: loadBalancer.securityGroups,\n vpcId: loadBalancer.vpcId,\n subnetTypeMap: loadBalancer.subnetTypeMap,\n };\n return toEdit;\n }\n\n public constructNewLoadBalancerTemplate(application: Application): IOracleLoadBalancerUpsertCommand {\n const defaultCredentials =\n application.defaultCredentials.oracle ||\n (OracleProviderSettings.defaults\n ? OracleProviderSettings.defaults.account\n : OracleDefaultProviderSettings.defaults.account);\n const defaultRegion =\n application.defaultRegions.oracle ||\n (OracleProviderSettings.defaults\n ? OracleProviderSettings.defaults.region\n : OracleDefaultProviderSettings.defaults.region);\n return {\n name: undefined,\n cloudProvider: 'oracle',\n credentials: defaultCredentials,\n region: defaultRegion,\n shape: null,\n isPrivate: false,\n subnetIds: [],\n listeners: {},\n hostnames: [],\n backendSets: {},\n freeformTags: {},\n loadBalancerType: null,\n securityGroups: [],\n vpcId: null,\n subnetTypeMap: {},\n };\n }\n\n public constructNewListenerTemplate(): IOracleListener {\n return {\n name: 'HTTP_80',\n port: 80,\n protocol: 'HTTP',\n defaultBackendSetName: undefined,\n isSsl: false,\n };\n }\n\n public constructNewBackendSetTemplate(name: string): IOracleBackEndSet {\n return {\n name: name,\n policy: LoadBalancingPolicy.ROUND_ROBIN,\n healthChecker: { protocol: 'HTTP', port: 80, urlPath: '/' },\n backends: [],\n isNew: true,\n };\n }\n\n public constructNewSSLConfiguration(): IOracleListenerSSLConfiguration {\n return {\n certificateName: '',\n verifyDepth: 0,\n verifyPeerCertificates: false,\n };\n }\n\n public constructNewCertificateTemplate(name: string): IOracleListenerCertificate {\n return {\n certificateName: name,\n publicCertificate: undefined,\n caCertificate: undefined,\n privateKey: undefined,\n passphrase: undefined,\n isNew: true,\n };\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_TRANSFORMER = 'spinnaker.oracle.loadBalancer.transformer';\nmodule(ORACLE_LOAD_BALANCER_TRANSFORMER, []).service('oracleLoadBalancerTransformer', OracleLoadBalancerTransformer);\n","import type { StateService } from '@uirouter/angularjs';\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport { cloneDeep, trimEnd } from 'lodash';\n\nimport type { Application, IAccountDetails, ILoadBalancer, INetwork, IRegion, ISubnet } from '@spinnaker/core';\nimport {\n AccountService,\n LoadBalancerWriter,\n NameUtils,\n NetworkReader,\n SubnetReader,\n TaskMonitor,\n} from '@spinnaker/core';\nimport type {\n IOracleBackEndSet,\n IOracleListener,\n IOracleListenerCertificate,\n IOracleLoadBalancer,\n IOracleSubnet,\n} from '../../domain/IOracleLoadBalancer';\nimport { LoadBalancingPolicy } from '../../domain/IOracleLoadBalancer';\n\nimport type { OracleLoadBalancerTransformer } from '../loadBalancer.transformer';\nimport { ORACLE_LOAD_BALANCER_TRANSFORMER } from '../loadBalancer.transformer';\n\nexport class OracleLoadBalancerController implements IController {\n public oracle = 'oracle';\n public shapes: string[] = ['100Mbps', '400Mbps', '8000Mbps']; // TODO desagar use listShapes to get this from clouddriver later\n public loadBalancingPolicies: string[] = Object.keys(LoadBalancingPolicy).map((k) => (LoadBalancingPolicy as any)[k]);\n public pages: { [key: string]: any } = {\n properties: require('./createLoadBalancerProperties.html'),\n listeners: require('./listeners.html'),\n backendSets: require('./backendSets.html'),\n certificates: require('./certificates.html'),\n };\n\n public state: { [key: string]: boolean } = {\n accountsLoaded: false,\n submitting: false,\n };\n\n public allVnets: INetwork[];\n public allSubnets: IOracleSubnet[];\n public filteredVnets: INetwork[];\n public filteredSubnets: ISubnet[];\n public filteredSubnetsByType: ISubnet[];\n public selectedVnet: INetwork;\n public selectedSubnets: IOracleSubnet[];\n public numSubnetsAllowed = 1;\n public listeners: IOracleListener[] = [];\n public backendSets: IOracleBackEndSet[] = [];\n public certificates: IOracleListenerCertificate[] = [];\n\n public static $inject = [\n '$scope',\n '$uibModalInstance',\n '$state',\n 'oracleLoadBalancerTransformer',\n 'application',\n 'loadBalancer',\n 'isNew',\n ];\n constructor(\n private $scope: ng.IScope,\n private $uibModalInstance: IModalServiceInstance,\n private $state: StateService,\n private oracleLoadBalancerTransformer: OracleLoadBalancerTransformer,\n private application: Application,\n private loadBalancer: IOracleLoadBalancer,\n private isNew: boolean,\n ) {\n this.initializeController();\n }\n\n public onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if (this.$scope.$$destroyed) {\n return;\n }\n this.$uibModalInstance.close();\n const newStateParams = {\n name: this.loadBalancer.name,\n accountId: this.loadBalancer.account,\n region: this.loadBalancer.region,\n provider: 'oracle',\n };\n\n if (!this.$state.includes('**.loadBalancerDetails')) {\n this.$state.go('.loadBalancerDetails', newStateParams);\n } else {\n this.$state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n\n public onTaskComplete() {\n this.application.loadBalancers.refresh();\n this.application.loadBalancers.onNextRefresh(this.$scope, this.onApplicationRefresh);\n }\n\n public initializeCreateMode() {\n AccountService.listAccounts(this.oracle).then((accounts: IAccountDetails[]) => {\n this.$scope.accounts = accounts; // TODO desagar does this need to be in $scope?\n this.state.accountsLoaded = true;\n this.$scope.state = this.state;\n this.accountUpdated();\n });\n this.loadVnets();\n this.loadSubnets();\n }\n\n private initControllerFromLoadBalancerCmd() {\n this.numSubnetsAllowed = this.calcNumSubnetsAllowed();\n if (this.$scope.loadBalancerCmd.listeners) {\n Object.keys(this.$scope.loadBalancerCmd.listeners).forEach((lis) => {\n this.listeners.push(this.$scope.loadBalancerCmd.listeners[lis]);\n });\n }\n if (this.$scope.loadBalancerCmd.backendSets) {\n Object.keys(this.$scope.loadBalancerCmd.backendSets).forEach((b) => {\n this.backendSets.push(this.$scope.loadBalancerCmd.backendSets[b]);\n });\n }\n if (this.$scope.loadBalancerCmd.certificates) {\n Object.keys(this.$scope.loadBalancerCmd.certificates).forEach((b) => {\n this.certificates.push(this.$scope.loadBalancerCmd.certificates[b]);\n });\n }\n }\n\n public initializeController() {\n if (this.loadBalancer) {\n this.$scope.loadBalancerCmd = this.oracleLoadBalancerTransformer.convertLoadBalancerForEditing(this.loadBalancer);\n this.initControllerFromLoadBalancerCmd();\n if (this.isNew) {\n const nameParts = NameUtils.parseLoadBalancerName(this.loadBalancer.name);\n this.$scope.loadBalancerCmd.stack = nameParts.stack;\n this.$scope.loadBalancerCmd.detail = nameParts.freeFormDetails;\n delete this.$scope.loadBalancerCmd.name;\n }\n } else {\n this.$scope.loadBalancerCmd = this.oracleLoadBalancerTransformer.constructNewLoadBalancerTemplate(\n this.application,\n );\n }\n this.$scope.prevBackendSetNames = [];\n this.$scope.prevCertNames = [];\n if (this.isNew) {\n this.updateName();\n this.updateLoadBalancerNames();\n this.initializeCreateMode();\n }\n this.$scope.taskMonitor = new TaskMonitor({\n application: this.application,\n title: (this.isNew ? 'Creating ' : 'Updating ') + 'your load balancer',\n modalInstance: this.$uibModalInstance,\n onTaskComplete: this.onTaskComplete,\n });\n }\n\n public updateLoadBalancerNames() {\n const account = this.$scope.loadBalancerCmd.credentials;\n const region = this.$scope.loadBalancerCmd.region;\n\n const accountLoadBalancerNamesByRegion: { [key: string]: string[] } = {};\n this.application\n .getDataSource('loadBalancers')\n .refresh(true)\n .then(() => {\n const loadBalancers: ILoadBalancer[] = this.application.loadBalancers.data;\n loadBalancers.forEach((loadBalancer) => {\n if (loadBalancer.account === account) {\n accountLoadBalancerNamesByRegion[loadBalancer.region] =\n accountLoadBalancerNamesByRegion[loadBalancer.region] || [];\n accountLoadBalancerNamesByRegion[loadBalancer.region].push(loadBalancer.name);\n }\n });\n\n this.$scope.existingLoadBalancerNames = accountLoadBalancerNamesByRegion[region] || [];\n });\n }\n\n public validateBeforeSubmit() {\n return this.propertiesValid() && this.listenersValid();\n }\n\n /**\n * Used to prevent form submission if listeners are invalid\n * Currently it calls the two validations applicable to listeners.\n * @returns {boolean}\n */\n public listenersValid() {\n return this.listenersUniqueProtocolPort() && this.listenersBackendSetsExist() && this.listenersCertificatesExist();\n }\n\n /**\n * Used to prevent form submission if the properties section is invalid\n * Current the only validation is for subnet count.\n */\n public propertiesValid() {\n return this.selectedSubnets && this.selectedSubnets.length === this.calcNumSubnetsAllowed();\n }\n\n public listenersUniqueProtocolPort() {\n // validate that listeners have unique protocol/port combination\n const countsMap: { [key: string]: number } = {};\n this.listeners.reduce((counts, listener) => {\n const protocolPort = listener.protocol + '_' + listener.port;\n counts[protocolPort] = counts[protocolPort] ? counts[protocolPort] + 1 : 1;\n return counts;\n }, countsMap);\n // There should be no protocol/port combo in the countsMap with a count > 1\n return (\n Object.keys(countsMap).filter((key) => {\n return countsMap[key] > 1;\n }).length === 0\n );\n }\n\n public listenersBackendSetsExist() {\n // validate that the listeners' selected backend sets must exist. This is needed because Angular\n // does not clear the selected backendSet from the drop down if the backend set is deleted.\n const listenersWithNonExistentBackendSet: IOracleListener[] = this.listeners.filter(\n (listener) => !this.backendSets.find((backendSet) => backendSet.name === listener.defaultBackendSetName),\n );\n return listenersWithNonExistentBackendSet.length === 0;\n }\n\n public listenersCertificatesExist() {\n // validate that the listeners' selected certificate names exist. This is needed because Angular\n // does not clear the selected certificate from the drop down if the certificate is deleted.\n const listenersWithNonExistentCertificate: IOracleListener[] = this.listeners.filter(\n (listener) =>\n listener.sslConfiguration &&\n !this.certificates.find((cert) => cert.certificateName === listener.sslConfiguration.certificateName),\n );\n return listenersWithNonExistentCertificate.length === 0;\n }\n\n public updateName() {\n this.$scope.loadBalancerCmd.name = this.getName();\n }\n\n public getName() {\n const lb = this.$scope.loadBalancerCmd;\n const lbName = [this.application.name, lb.stack || '', lb.detail || ''].join('-');\n return trimEnd(lbName, '-');\n }\n\n public accountUpdated() {\n this.loadRegionsForAccount();\n }\n\n public regionUpdated() {\n this.updateLoadBalancerNames();\n this.updateVnets();\n }\n\n public loadRegionsForAccount() {\n AccountService.getRegionsForAccount(this.$scope.loadBalancerCmd.credentials).then((regions: IRegion[]) => {\n this.$scope.regions = regions; // TODO desagar does this need to be in $scope?\n if (regions.length === 1) {\n this.$scope.loadBalancerCmd.region = regions[0].name;\n this.regionUpdated();\n }\n });\n }\n\n public loadVnets() {\n NetworkReader.listNetworksByProvider(this.oracle).then((vnets: INetwork[]) => {\n this.allVnets = vnets || [];\n if (this.$scope.loadBalancerCmd.region) {\n this.updateVnets();\n }\n });\n }\n\n public loadSubnets() {\n SubnetReader.listSubnetsByProvider(this.oracle).then((subnets: IOracleSubnet[]) => {\n this.allSubnets = subnets || [];\n });\n }\n\n public updateVnets() {\n const account = this.$scope.loadBalancerCmd.credentials;\n const region = this.$scope.loadBalancerCmd.region;\n this.filteredVnets = this.allVnets.filter((vnet: INetwork) => {\n return vnet.account === account && vnet.region === region;\n });\n }\n\n public updateSubnets(network: INetwork) {\n this.selectedSubnets = [];\n this.$scope.loadBalancerCmd.subnetIds = [];\n this.filteredSubnets = this.allSubnets.filter((subnet: IOracleSubnet) => {\n return subnet.vcnId === network.id;\n });\n this.filteredSubnetsByType = cloneDeep(this.filteredSubnets);\n }\n\n public selectedVnetChanged(network: INetwork) {\n this.selectedVnet = network;\n this.$scope.loadBalancerCmd.vpcId = network.id;\n this.updateSubnets(network);\n }\n\n public selectedSubnetsChanged(selectedSubnet: IOracleSubnet) {\n if (selectedSubnet.availabilityDomain) {\n this.filteredSubnetsByType = this.filteredSubnets.filter((subnet: IOracleSubnet) => {\n return !!subnet.availabilityDomain;\n });\n } else {\n this.filteredSubnetsByType = [];\n }\n }\n\n public selectedSubnetRemoved() {\n if (this.selectedSubnets.length === 0) {\n this.filteredSubnetsByType = cloneDeep(this.filteredSubnets);\n }\n if (this.selectedSubnets.length === 1 && this.selectedSubnets[0].availabilityDomain) {\n this.filteredSubnetsByType = this.filteredSubnets.filter((subnet: IOracleSubnet) => {\n return !!subnet.availabilityDomain;\n });\n }\n }\n\n public isPrivateChanged() {\n this.numSubnetsAllowed = this.calcNumSubnetsAllowed();\n }\n\n public listenerIsSslChanged(listener: IOracleListener) {\n if (listener.isSsl) {\n listener.sslConfiguration = this.oracleLoadBalancerTransformer.constructNewSSLConfiguration();\n } else {\n listener.sslConfiguration = undefined;\n }\n }\n\n public calcNumSubnetsAllowed() {\n if (this.$scope.loadBalancerCmd.isPrivate) {\n return 1;\n }\n\n if (this.selectedSubnets && this.selectedSubnets.length === 1 && !this.selectedSubnets[0].availabilityDomain) {\n return 1;\n }\n\n return 2;\n }\n\n public getSubnetLimit() {}\n\n public removeListener(idx: number) {\n this.listeners.splice(idx, 1);\n }\n\n public addListener() {\n this.listeners.push(this.oracleLoadBalancerTransformer.constructNewListenerTemplate());\n }\n\n public removeBackendSet(idx: number) {\n const backendSet = this.backendSets[idx];\n this.backendSets.splice(idx, 1);\n this.$scope.prevBackendSetNames.splice(idx, 1);\n // Also clear the defaultBackendSetName field of any listeners who are using this backendSet\n this.listeners.forEach((lis) => {\n if (lis.defaultBackendSetName === backendSet.name) {\n lis.defaultBackendSetName = undefined;\n }\n });\n }\n\n public isBackendSetRemovable(idx: number): boolean {\n const backendSet = this.backendSets[idx];\n if (backendSet && backendSet.backends && backendSet.backends.length > 0) {\n return false;\n }\n let hasListener = false;\n this.listeners.forEach((lis) => {\n if (lis.defaultBackendSetName === backendSet.name) {\n hasListener = true;\n }\n });\n return !hasListener;\n }\n\n public addBackendSet() {\n const nameSuffix: number = this.backendSets.length + 1;\n const name: string = 'backendSet' + nameSuffix;\n this.$scope.prevBackendSetNames.push(name);\n this.backendSets.push(this.oracleLoadBalancerTransformer.constructNewBackendSetTemplate(name));\n }\n\n public backendSetNameChanged(idx: number) {\n const prevName = this.$scope.prevBackendSetNames && this.$scope.prevBackendSetNames[idx];\n if (prevName && prevName !== this.backendSets[idx].name) {\n this.listeners\n .filter((lis) => lis.defaultBackendSetName === prevName)\n .forEach((lis) => {\n lis.defaultBackendSetName = this.backendSets[idx].name;\n });\n }\n }\n\n public isCertRemovable(idx: number): boolean {\n const cert = this.certificates[idx];\n let hasListener = false;\n this.listeners.forEach((lis) => {\n if (lis.isSsl && lis.sslConfiguration && lis.sslConfiguration.certificateName === cert.certificateName) {\n hasListener = true;\n }\n });\n return !hasListener;\n }\n\n public removeCert(idx: number) {\n const cert = this.certificates[idx];\n this.certificates.splice(idx, 1);\n this.$scope.prevCertNames.splice(idx, 1);\n // Also clear the certificateName field of any listeners who are using this certificate\n this.listeners.forEach((lis) => {\n if (lis.sslConfiguration && lis.sslConfiguration.certificateName === cert.certificateName) {\n lis.sslConfiguration.certificateName = undefined;\n }\n });\n }\n\n public addCert() {\n const nameSuffix: number = this.certificates.length + 1;\n const name: string = 'certificate' + nameSuffix;\n this.$scope.prevCertNames.push(name);\n this.certificates.push(this.oracleLoadBalancerTransformer.constructNewCertificateTemplate(name));\n }\n\n public certNameChanged(idx: number) {\n const prevName = this.$scope.prevCertNames && this.$scope.prevCertNames[idx];\n if (prevName && prevName !== this.certificates[idx].certificateName) {\n this.listeners\n .filter((lis) => lis.sslConfiguration && lis.sslConfiguration.certificateName === prevName)\n .forEach((lis) => {\n lis.sslConfiguration.certificateName = this.certificates[idx].certificateName;\n });\n }\n }\n\n public submit() {\n const descriptor = this.isNew ? 'Create' : 'Update';\n\n this.$scope.taskMonitor.submit(() => {\n const params = {\n cloudProvider: 'oracle',\n application: this.application.name,\n clusterName: this.$scope.loadBalancerCmd.clusterName,\n resourceGroupName: this.$scope.loadBalancerCmd.clusterName,\n loadBalancerName: this.$scope.loadBalancerCmd.name,\n loadBalancerId: null as string,\n };\n if (this.loadBalancer && this.loadBalancer.id) {\n params.loadBalancerId = this.loadBalancer.id;\n }\n\n if (this.selectedVnet) {\n this.$scope.loadBalancerCmd.vpcId = this.selectedVnet.id;\n }\n\n if (this.selectedSubnets && this.selectedSubnets.length > 0) {\n this.$scope.loadBalancerCmd.subnetIds = this.selectedSubnets.map((subnet: IOracleSubnet) => {\n return subnet.id;\n });\n\n for (const subnet of this.selectedSubnets) {\n if (!this.$scope.loadBalancerCmd.subnetTypeMap) {\n this.$scope.loadBalancerCmd.subnetTypeMap = {\n [subnet.id]: !subnet.availabilityDomain ? 'Regional' : 'AD',\n };\n } else {\n this.$scope.loadBalancerCmd.subnetTypeMap[subnet.id] = !subnet.availabilityDomain ? 'Regional' : 'AD';\n }\n }\n }\n\n if (this.backendSets) {\n this.$scope.loadBalancerCmd.backendSets = this.backendSets.reduce(\n (backendSetsMap: { [name: string]: IOracleBackEndSet }, backendSet: IOracleBackEndSet) => {\n backendSetsMap[backendSet.name] = backendSet;\n return backendSetsMap;\n },\n {},\n );\n }\n\n if (this.listeners) {\n this.$scope.loadBalancerCmd.listeners = this.listeners.reduce(\n (listenersMap: { [name: string]: IOracleListener }, listener: IOracleListener) => {\n listener.name = listener.protocol + '_' + listener.port;\n listenersMap[listener.name] = listener;\n return listenersMap;\n },\n {},\n );\n }\n\n if (this.certificates) {\n this.$scope.loadBalancerCmd.certificates = this.certificates.reduce(\n (certMap: { [name: string]: IOracleListenerCertificate }, cert: IOracleListenerCertificate) => {\n certMap[cert.certificateName] = cert;\n if (!cert.isNew) {\n // existing certificate sends only the name\n certMap[cert.certificateName].publicCertificate = null;\n }\n return certMap;\n },\n {},\n );\n }\n\n this.$scope.loadBalancerCmd.type = 'upsertLoadBalancer';\n if (!this.$scope.loadBalancerCmd.vnet && !this.$scope.loadBalancerCmd.subnetType) {\n this.$scope.loadBalancerCmd.securityGroups = null;\n }\n\n return LoadBalancerWriter.upsertLoadBalancer(this.$scope.loadBalancerCmd, this.application, descriptor, params);\n });\n }\n\n public cancel() {\n this.$uibModalInstance.dismiss();\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_CREATE_CONTROLLER = 'spinnaker.oracle.loadBalancer.create.controller';\nmodule(ORACLE_LOAD_BALANCER_CREATE_CONTROLLER, [\n ANGULAR_UI_BOOTSTRAP as any,\n UIROUTER_ANGULARJS,\n ORACLE_LOAD_BALANCER_TRANSFORMER,\n]).controller('oracleCreateLoadBalancerCtrl', OracleLoadBalancerController);\n","import type { StateService } from '@uirouter/angularjs';\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport angular, { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport { sortBy } from 'lodash';\n\nimport type { Application, ISecurityGroup, LoadBalancerReader, SecurityGroupReader } from '@spinnaker/core';\nimport { ConfirmationModalService, FirewallLabels, LoadBalancerWriter } from '@spinnaker/core';\n\nimport { OracleLoadBalancerController } from '../configure/createLoadBalancer.controller';\nimport type { ILoadBalancerDetails, IOracleLoadBalancer } from '../../domain/IOracleLoadBalancer';\n\nexport class OracleLoadBalancerDetailController implements IController {\n public static $inject = [\n '$scope',\n '$state',\n '$uibModal',\n 'loadBalancer',\n 'app',\n 'securityGroupReader',\n 'loadBalancerReader',\n '$q',\n ];\n constructor(\n private $scope: ng.IScope,\n private $state: StateService,\n private $uibModal: IModalService,\n private loadBalancer: ILoadBalancerDetails,\n private app: Application,\n private securityGroupReader: SecurityGroupReader,\n private loadBalancerReader: LoadBalancerReader,\n private $q: angular.IQService,\n ) {\n $scope.state = {\n loading: true,\n };\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n const extractLoadBalancer = (): PromiseLike<any> => {\n $scope.loadBalancer = app.loadBalancers.data.filter((test: IOracleLoadBalancer) => {\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 = this.loadBalancerReader.getLoadBalancerDetails(\n $scope.loadBalancer.cloudProvider,\n loadBalancer.accountId,\n loadBalancer.region,\n loadBalancer.name,\n );\n\n return detailsLoader.then((details) => {\n // ILoadBalancerSourceData\n $scope.state.loading = false;\n const securityGroups: ISecurityGroup[] = [];\n\n const filtered = details.filter((test: IOracleLoadBalancer) => {\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((securityGroupId: string) => {\n const match = this.securityGroupReader.getApplicationSecurityGroup(\n this.app,\n loadBalancer.accountId,\n loadBalancer.region,\n securityGroupId,\n );\n if (match) {\n securityGroups.push(match);\n }\n });\n this.$scope.securityGroups = sortBy(securityGroups, 'name');\n }\n }\n });\n }\n if (!this.$scope.loadBalancer) {\n this.$state.go('^');\n }\n\n return this.$q.when(null);\n };\n\n this.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 (!this.$scope.$$destroyed) {\n this.app.onRefresh($scope, extractLoadBalancer);\n }\n });\n }\n\n public editLoadBalancer() {\n this.$uibModal.open({\n templateUrl: require('../configure/editLoadBalancer.html'),\n controller: OracleLoadBalancerController,\n controllerAs: 'ctrl',\n size: 'lg',\n resolve: {\n application: () => {\n return this.app;\n },\n loadBalancer: () => {\n return angular.copy(this.$scope.loadBalancer);\n },\n isNew: () => {\n return false;\n },\n },\n });\n }\n\n public deleteLoadBalancer() {\n if (this.$scope.loadBalancer.instances && this.$scope.loadBalancer.instances.length) {\n return;\n }\n\n const taskMonitor = {\n application: this.app,\n title: 'Deleting ' + this.loadBalancer.name,\n };\n\n const command = {\n cloudProvider: 'oracle',\n loadBalancerName: this.$scope.loadBalancer.name,\n credentials: this.$scope.loadBalancer.account,\n region: this.loadBalancer.region,\n application: this.app.name,\n loadBalancerId: this.$scope.loadBalancer.id,\n };\n\n const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, this.app);\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + this.loadBalancer.name + '?',\n buttonText: 'Delete ' + this.loadBalancer.name,\n account: this.loadBalancer.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER = 'spinnaker.oracle.loadBalancerDetail.controller';\nmodule(ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP as any]).controller(\n 'oracleLoadBalancerDetailCtrl',\n OracleLoadBalancerDetailController,\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { EXECUTION_DETAILS_SECTION_SERVICE, SETTINGS } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.oracle.pipeline.stage.bake.executionDetails.controller';\nexport const name = ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [\n EXECUTION_DETAILS_SECTION_SERVICE,\n UIROUTER_ANGULARJS,\n]).controller('oracleBakeExecutionDetailsCtrl', [\n '$log',\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($log, $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 || 'oracle';\n $scope.roscoMode = SETTINGS.feature.roscoMode;\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","'use strict';\n\nimport { module } from 'angular';\nimport { size } from 'lodash';\n\nimport {\n AccountService,\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n PipelineTemplates,\n Registry,\n} from '@spinnaker/core';\n\nimport { ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\n\nexport const ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE = 'spinnaker.oracle.pipeline.stage.bakeStage';\nexport const name = ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE, [ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'oracle',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'accountName' },\n { type: 'requiredField', fieldName: 'region' },\n { type: 'requiredField', fieldName: 'baseOs' },\n { type: 'requiredField', fieldName: 'upgrade' },\n { type: 'requiredField', fieldName: 'cloudProviderType' },\n { type: 'requiredField', fieldName: 'amiName', fieldLabel: 'Image Name' },\n ],\n restartable: true,\n });\n })\n .controller('oracleBakeStageCtrl', [\n '$scope',\n '$q',\n '$uibModal',\n function ($scope, $q, $uibModal) {\n const provider = 'oracle';\n\n if (!$scope.stage.cloudProvider) {\n $scope.stage.cloudProvider = provider;\n }\n\n if (!$scope.stage) {\n $scope.stage = {};\n }\n\n $scope.stage.extendedAttributes = $scope.stage.extendedAttributes || {};\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n function initialize() {\n $scope.viewState.providerSelected = true;\n\n $q.all([BakeryReader.getBaseOsOptions(provider), AccountService.listAccounts(provider)]).then(\n ([baseOsOptions, accounts]) => {\n if (baseOsOptions.baseImages.length > 0) {\n $scope.baseOsOptions = baseOsOptions;\n if (!$scope.stage.baseOs) {\n $scope.stage.baseOs = $scope.baseOsOptions.baseImages[0].id;\n }\n }\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n if (!$scope.stage.upgrade) {\n $scope.stage.upgrade = true;\n }\n\n $scope.accounts = accounts;\n\n if ($scope.stage.accountName) {\n AccountService.getRegionsForAccount($scope.stage.accountName).then(function (regions) {\n if (Array.isArray(regions) && regions.length != 0) {\n // there is exactly one region per account\n $scope.stage.region = regions[0].name;\n }\n });\n }\n\n $scope.viewState.loading = false;\n },\n );\n }\n\n this.getBaseOsDescription = function (baseOsOption) {\n return baseOsOption.id + (baseOsOption.shortDescription ? ' (' + baseOsOption.shortDescription + ')' : '');\n };\n\n this.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.stage.accountName).then(function (regions) {\n if (Array.isArray(regions) && regions.length != 0) {\n // there is exactly one region per account\n $scope.stage.region = regions[0].name;\n }\n });\n };\n\n this.addExtendedAttribute = function () {\n if (!$scope.stage.extendedAttributes) {\n $scope.stage.extendedAttributes = {};\n }\n $uibModal\n .open({\n templateUrl: PipelineTemplates.addExtendedAttributes,\n controller: 'bakeStageAddExtendedAttributeController',\n controllerAs: 'addExtendedAttribute',\n resolve: {\n extendedAttribute: function () {\n return {\n key: '',\n value: '',\n };\n },\n },\n })\n .result.then(function (extendedAttribute) {\n $scope.stage.extendedAttributes[extendedAttribute.key] = extendedAttribute.value;\n })\n .catch(() => {});\n };\n\n this.removeExtendedAttribute = function (key) {\n delete $scope.stage.extendedAttributes[key];\n };\n\n this.showExtendedAttributes = function () {\n return (\n $scope.viewState.roscoMode || ($scope.stage.extendedAttributes && size($scope.stage.extendedAttributes) > 0)\n );\n };\n\n $scope.$watch('stage.accountName', $scope.accountUpdated);\n\n initialize();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE = 'spinnaker.oracle.pipeline.stage.destroyAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n cloudProvider: 'oracle',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\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('oracleDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n const provider = 'oracle';\n\n $scope.targets = StageConstants.TARGET_LIST;\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n init();\n\n function init() {\n AccountService.listAccounts(provider).then((accounts) => {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE = 'spinnaker.oracle.pipeline.stage.disableAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n cloudProvider: 'oracle',\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('oracleDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n const provider = 'oracle';\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then((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 = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport * as angular from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE = 'spinnaker.oracle.pipeline.stage.findAmiStage';\nexport const name = ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE; // for backwards compatibility\nangular\n .module(ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImage',\n cloudProvider: 'oracle',\n templateUrl: require('./findAmiStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'selectionStrategy', fieldLabel: 'Server Group Selection' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials' },\n ],\n });\n })\n .controller('oracleFindAmiStageCtrl', [\n '$scope',\n ($scope) => {\n const provider = 'oracle';\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then((accounts) => {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.selectionStrategies = [\n {\n label: 'Largest',\n val: 'LARGEST',\n description: 'When multiple server groups exist, prefer the server group with the most instances',\n },\n {\n label: 'Newest',\n val: 'NEWEST',\n description: 'When multiple server groups exist, prefer the newest',\n },\n {\n label: 'Oldest',\n val: 'OLDEST',\n description: 'When multiple server groups exist, prefer the oldest',\n },\n {\n label: 'Fail',\n val: 'FAIL',\n description: 'When multiple server groups exist, fail',\n },\n ];\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n stage.selectionStrategy = stage.selectionStrategy || $scope.selectionStrategies[0].val;\n\n if (angular.isUndefined(stage.onlyEnabled)) {\n stage.onlyEnabled = true;\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { BakeryReader, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE =\n 'spinnaker.oracle.pipeline.stage.findImageFromTagsStage';\nexport const name = ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'oracle',\n templateUrl: require('./findImageFromTagsStage.html'),\n executionDetailsUrl: require('./findImageFromTagsExecutionDetails.html'),\n executionConfigSections: ['findImageConfig', 'taskStatus'],\n validators: [\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'packageName' },\n ],\n });\n })\n .controller('oracleFindImageFromTagsStageCtrl', [\n '$scope',\n function ($scope) {\n $scope.stage.packageName = $scope.stage.packageName || '*';\n $scope.stage.tags = $scope.stage.tags || {};\n $scope.stage.regions = $scope.stage.regions || [];\n $scope.stage.cloudProvider = $scope.stage.cloudProvider || 'oracle';\n\n BakeryReader.getRegions('oracle').then(function (regions) {\n $scope.regions = regions;\n });\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE = 'spinnaker.oracle.pipeline.stage.resizeAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n cloudProvider: 'oracle',\n templateUrl: require('./resizeAsgStage.html'),\n executionStepLabelUrl: require('./resizeAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize 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: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('oracleResizeAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const provider = 'oracle';\n\n const stage = $scope.stage;\n\n $scope.viewState = {\n accountsLoaded: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then(function (accounts) {\n $scope.accounts = accounts;\n $scope.viewState.accountsLoaded = true;\n });\n\n $scope.resizeTargets = StageConstants.TARGET_LIST;\n\n $scope.scaleActions = [\n { label: 'Scale Up', val: 'scale_up' },\n { label: 'Scale Down', val: 'scale_down' },\n { label: 'Scale to Cluster Size', val: 'scale_to_cluster' },\n { label: 'Scale to Exact Size', val: 'scale_exact' },\n ];\n\n $scope.resizeTypes = [\n { label: 'Percentage', val: 'pct' },\n { label: 'Incremental', val: 'incr' },\n ];\n\n stage.capacity = stage.capacity || {};\n stage.regions = stage.regions || [];\n stage.target = stage.target || $scope.resizeTargets[0].val;\n stage.action = stage.action || $scope.scaleActions[0].val;\n stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;\n\n if (!stage.action && stage.resizeType === 'exact') {\n stage.action = 'scale_exact';\n }\n\n stage.cloudProvider = provider;\n stage.cloudProviderType = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.gce) {\n stage.credentials = $scope.application.defaultCredentials.gce;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.gce);\n }\n\n ctrl.updateResizeType = function () {\n if (stage.action === 'scale_exact') {\n stage.resizeType = 'exact';\n delete stage.scalePct;\n delete stage.scaleNum;\n } else {\n stage.capacity = {};\n if (stage.resizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n stage.resizeType = 'incr';\n delete stage.scalePct;\n stage.scaleNum = stage.scaleNum || 0;\n }\n }\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE =\n 'spinnaker.oracle.pipeline.stage.scaleDownClusterStage';\nexport const name = ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'oracle',\n templateUrl: require('./scaleDownClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n })\n .controller('oracleScaleDownClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n const provider = 'oracle';\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.gce) {\n stage.credentials = $scope.application.defaultCredentials.gce;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.gce);\n }\n\n if (stage.remainingFullSizeServerGroups === undefined) {\n stage.remainingFullSizeServerGroups = 1;\n }\n\n if (stage.allowScaleDownActive === undefined) {\n stage.allowScaleDownActive = false;\n }\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n\n this.pluralize = function (str, val) {\n return val === 1 ? str : str + 's';\n };\n\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE =\n 'spinnaker.core.pipeline.stage.oracle.shrinkClusterStage';\nexport const name = ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'oracle',\n templateUrl: require('./shrinkClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('oracleShrinkClusterStageCtrl', [\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('oracle').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n\n stage.cloudProvider = 'oracle';\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (stage.shrinkToSize === undefined) {\n stage.shrinkToSize = 1;\n }\n\n if (stage.allowDeleteActive === undefined) {\n stage.allowDeleteActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n return val === 1 ? str : str + 's';\n };\n\n if (stage.retainLargerOverNewer === undefined) {\n stage.retainLargerOverNewer = 'false';\n }\n\n stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { FirewallLabels } from '@spinnaker/core';\n\nexport const ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER =\n 'spinnaker.oracle.securityGroup.create.controller';\nexport const name = ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER, []).controller('oracleCreateSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n function ($scope, $uibModalInstance) {\n this.cancel = () => {\n $uibModalInstance.dismiss();\n };\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ORACLE_SECURITYGROUP_SECURITYGROUP_READER = 'spinnaker.oracle.securityGroup.reader';\nexport const name = ORACLE_SECURITYGROUP_SECURITYGROUP_READER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_SECURITYGROUP_READER, []).factory('oracleSecurityGroupReader', function () {\n function resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n\n return {\n resolveIndexedSecurityGroup: resolveIndexedSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { NetworkReader } from '@spinnaker/core';\n\nexport const ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.oracle.securityGroup.transformer';\nexport const name = ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('oracleSecurityGroupTransformer', function () {\n const provider = 'oracle';\n\n function normalizeSecurityGroup(securityGroup) {\n return NetworkReader.listNetworksByProvider(provider).then(_.partial(addVcnNameToSecurityGroup, securityGroup));\n }\n\n function addVcnNameToSecurityGroup(securityGroup, vcns) {\n const matches = vcns.find((vcn) => vcn.id === securityGroup.network);\n securityGroup.vpcName = matches.length ? matches[0].name : '';\n }\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, NetworkReader, SECURITY_GROUP_READER, SubnetReader } from '@spinnaker/core';\nimport { OracleProviderSettings } from '../../oracle.settings';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE =\n 'spinnaker.oracle.serverGroup.configure.configuration.service';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE, [SECURITY_GROUP_READER]).factory(\n 'oracleServerGroupConfigurationService',\n [\n '$q',\n 'oracleImageReader',\n 'securityGroupReader',\n function ($q, oracleImageReader, securityGroupReader) {\n const oracle = 'oracle';\n\n const getShapes = (image) => {\n if (!image || !image.compatibleShapes) {\n return [];\n }\n return image.compatibleShapes.map((shape) => {\n return { name: shape };\n });\n };\n\n const loadAndSelectRegions = (command, backingData) => {\n if (command.account) {\n const selectedAccountDetails = backingData.credentialsKeyedByAccount[command.account];\n if (!selectedAccountDetails) {\n return;\n }\n backingData.filtered.regions = _.map(selectedAccountDetails.regions, (region) => {\n return { name: region.name };\n });\n if (selectedAccountDetails) {\n command.region = selectedAccountDetails.region;\n }\n }\n };\n\n const loadAvailabilityDomains = (command) => {\n if (command.account && command.region) {\n AccountService.getAvailabilityZonesForAccountAndRegion(oracle, command.account, command.region).then(\n (availDoms) => {\n if (availDoms) {\n command.backingData.filtered.availabilityDomains = availDoms.map((av) => {\n return { name: av };\n });\n } else {\n command.backingData.filtered.availabilityDomains = [];\n command.availabilityDomain = null;\n }\n },\n );\n }\n };\n\n const loadLoadBalancers = (command) => {\n if (command.account && command.region) {\n command.backingData.filtered.loadBalancers = command.backingData.loadBalancers.filter(function (lb) {\n return lb.region === command.region && lb.account === command.account;\n });\n }\n };\n\n function configureCommand(application, command) {\n const defaults = command || {};\n const defaultCredentials =\n defaults.account || application.defaultCredentials.oracle || OracleProviderSettings.defaults.account;\n const defaultRegion =\n defaults.region || application.defaultRegions.oracle || OracleProviderSettings.defaults.region;\n\n return $q\n .all([\n AccountService.getCredentialsKeyedByAccount(oracle),\n NetworkReader.listNetworksByProvider(oracle),\n SubnetReader.listSubnetsByProvider(oracle),\n securityGroupReader.getAllSecurityGroups(),\n loadImages(),\n AccountService.getAvailabilityZonesForAccountAndRegion(oracle, defaultCredentials, defaultRegion),\n ])\n .then(function ([credentialsKeyedByAccount, networks, subnets, securityGroups, images, availDomains]) {\n const backingData = {\n credentialsKeyedByAccount,\n networks,\n subnets,\n securityGroups,\n images,\n availDomains,\n };\n\n backingData.accounts = _.keys(backingData.credentialsKeyedByAccount);\n backingData.filtered = {};\n loadAndSelectRegions(command, backingData);\n backingData.filtered.availabilityDomains = _.map(backingData.availDomains, function (zone) {\n return { name: zone };\n });\n\n backingData.filterSubnets = function () {\n if (command.vpcId && command.availabilityDomain) {\n return _.filter(backingData.subnets, {\n vcnId: command.vpcId,\n availabilityDomain: command.availabilityDomain,\n });\n }\n return backingData.subnets;\n };\n\n backingData.loadBalancers = application.loadBalancers.data;\n\n backingData.accountOnChange = function () {\n loadAndSelectRegions(command, command.backingData);\n loadAvailabilityDomains(command);\n loadLoadBalancers(command);\n };\n\n backingData.regionOnChange = function () {\n loadAvailabilityDomains(command);\n loadLoadBalancers(command);\n };\n\n backingData.availabilityDomainOnChange = function () {\n command.subnetId = null;\n backingData.seclists = null;\n };\n\n backingData.vpcOnChange = function () {\n command.subnetId = null;\n backingData.seclists = null;\n };\n\n backingData.subnetOnChange = function () {\n const subnet = _.find(backingData.subnets, { id: command.subnetId });\n const mySecGroups = backingData.securityGroups[command.account][oracle][command.region];\n const secLists = [];\n _.forEach(subnet.securityListIds, function (sid) {\n const sgRef = _.find(mySecGroups, { id: sid });\n securityGroupReader\n .getSecurityGroupDetails(\n command.application,\n command.account,\n oracle,\n command.region,\n command.vpcId,\n sgRef.name,\n )\n .then(function (sgd) {\n secLists.push(sgd);\n backingData.seclists = secLists;\n });\n });\n };\n\n backingData.findBackendSetsByLoadBalancerId = (loadBalancerId) => {\n const lb = backingData.filtered.loadBalancers.find((lb) => lb.id === loadBalancerId);\n if (lb && lb.backendSets) {\n //reduce the backendSets object to an array. The object is keyed by the backendSet name\n const bsetArray = [];\n Object.keys(lb.backendSets).reduce((arr, bsetName) => {\n const bset = lb.backendSets[bsetName];\n bset['name'] = bsetName;\n arr.push(bset);\n return arr;\n }, bsetArray);\n return bsetArray;\n } else {\n return [];\n }\n };\n\n backingData.findLoadBalListenersByBackendSetName = (loadBalancerId, backendSetName) => {\n const lb = backingData.filtered.loadBalancers.find((lb) => lb.id === loadBalancerId);\n if (lb && lb.listeners) {\n return Object.keys(lb.listeners)\n .filter((lisName) => lb.listeners[lisName].defaultBackendSetName === backendSetName)\n .map((lisName) => lb.listeners[lisName]);\n } else {\n return [];\n }\n };\n\n backingData.loadBalancerOnChange = () => {\n if (command.loadBalancerId) {\n backingData.filtered.backendSets = backingData.findBackendSetsByLoadBalancerId(command.loadBalancerId);\n } else {\n //no backend set name should be set if no load balancer id is set\n command.backendSetName = undefined;\n backingData.backendSetOnChange();\n backingData.filtered.backendSets = [];\n }\n };\n\n backingData.backendSetOnChange = () => {\n backingData.filtered.listeners =\n command.loadBalancerId && command.backendSetName\n ? backingData.findLoadBalListenersByBackendSetName(command.loadBalancerId, command.backendSetName)\n : [];\n };\n\n backingData.filtered.images = backingData.images;\n const shapesMap = {};\n _.forEach(backingData.filtered.images, (image) => {\n shapesMap[image.id] = getShapes(image);\n });\n backingData.filtered.shapes = shapesMap;\n backingData.filtered.allShapes = _.uniqBy(_.flatten(_.values(shapesMap)), 'name');\n command.backingData = backingData;\n if (command.account) {\n loadLoadBalancers(command);\n backingData.loadBalancerOnChange();\n backingData.backendSetOnChange();\n }\n });\n }\n\n function loadImages() {\n return oracleImageReader.findImages({ provider: oracle });\n }\n\n return {\n configureCommand: configureCommand,\n };\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 } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER =\n 'spinnaker.oracle.serverGroup.configure.wizard.basicSettings.controller';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n IMAGE_READER,\n ])\n .controller('oracleServerGroupBasicSettingsCtrl', [\n '$scope',\n '$state',\n '$uibModalStack',\n '$controller',\n 'imageReader',\n function ($scope, $state, $uibModalStack, $controller, imageReader) {\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n imageReader: imageReader,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n },\n ]);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT =\n 'spinnaker.oracle.serverGroup.configure.wizard.capacity.selector.component';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT, [])\n .component('oracleServerGroupCapacitySelector', {\n templateUrl: require('./capacitySelector.component.html'),\n bindings: {\n command: '=',\n },\n controllerAs: 'vm',\n controller: angular.noop,\n });\n","import { module } from 'angular';\n\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE } from './serverGroupConfiguration.service';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER } from './wizard/basicSettings/basicSettings.controller';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT } from './wizard/capacity/capacitySelector.component';\n\n('use strict');\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE = 'spinnaker.oracle.serverGroup.configure';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE, [\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER,\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE,\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\n\nimport { OracleProviderSettings } from '../../oracle.settings';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.oracle.serverGroupCommandBuilder.service';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [])\n .factory('oracleServerGroupCommandBuilder', [\n '$q',\n function ($q) {\n const oracle = 'oracle';\n\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultAccount = defaults.account || OracleProviderSettings.defaults.account;\n const defaultRegion = defaults.region || OracleProviderSettings.defaults.region;\n\n const command = {\n account: defaultAccount,\n application: application.name,\n capacity: {\n desired: 1,\n },\n region: defaultRegion,\n selectedProvider: oracle,\n viewState: {\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n },\n };\n\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n account: serverGroup.account,\n application: application.name,\n shape: serverGroup.launchConfig.shape,\n strategy: '',\n stack: serverGroupName.stack,\n vpcId: serverGroup.launchConfig.vpcId,\n subnetId: serverGroup.launchConfig.subnetId,\n region: serverGroup.region,\n availabilityDomain: serverGroup.launchConfig.availabilityDomain,\n sshAuthorizedKeys: serverGroup.launchConfig.sshAuthorizedKeys,\n selectedProvider: oracle,\n capacity: {\n desired: serverGroup.capacity.desired,\n },\n viewState: {\n mode: mode,\n disableStrategySelection: true,\n },\n };\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const commandDefaults = { account: pipelineCluster.account, region: pipelineCluster.region };\n return buildNewServerGroupCommand(application, commandDefaults).then((command) => {\n const viewState = {\n disableImageSelection: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n };\n\n const viewOverrides = {\n viewState: viewState,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n return angular.extend({}, command, pipelineCluster, viewOverrides);\n });\n }\n\n function buildNewServerGroupCommandForPipeline() {\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { FirewallLabels, ModalWizard, TaskMonitor } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.configure.cloneServerGroup';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'oracleCloneServerGroupCtrl',\n [\n '$scope',\n '$uibModalInstance',\n '$q',\n 'application',\n 'serverGroupWriter',\n 'serverGroupCommand',\n 'oracleServerGroupConfigurationService',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n application,\n serverGroupWriter,\n serverGroupCommand,\n oracleServerGroupConfigurationService,\n title,\n ) {\n $scope.title = title;\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n $scope.command = serverGroupCommand;\n $scope.application = application;\n\n $scope.pages = {\n basicSettings: require('./basicSettings/basicSettings.html'),\n instanceType: require('./instanceType/instanceType.html'),\n capacity: require('./capacity/capacity.html'),\n loadBalancers: require('./loadBalancers/loadBalancers.html'),\n networkSettings: require('./network/networkSettings.html'),\n templateSelection: require('./templateSelection/templateSelection.html'),\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 };\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 $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n });\n\n function configureCommand() {\n oracleServerGroupConfigurationService.configureCommand(application, serverGroupCommand).then(function () {\n $scope.state.loaded = true;\n });\n }\n\n this.isValid = function () {\n return $scope.command && $scope.form.$valid && ModalWizard.isComplete();\n };\n\n this.showSubmitButton = function () {\n return ModalWizard.allPagesVisited();\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\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 configureCommand();\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n },\n ],\n);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const ORACLE_COMMON_FOOTER_COMPONENT = 'spinnaker.oracle.footer.component';\nexport const name = ORACLE_COMMON_FOOTER_COMPONENT; // for backwards compatibility\nangular.module(ORACLE_COMMON_FOOTER_COMPONENT, []).component('oracleFooter', {\n templateUrl: require('./footer.component.html'),\n bindings: {\n action: '&',\n isValid: '&',\n cancel: '&',\n account: '=?',\n verification: '=?',\n },\n controllerAs: 'vm',\n controller: angular.noop,\n});\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { SERVER_GROUP_WRITER } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT =\n 'spinnaker.oracle.serverGroup.details.resize.capacity.component';\nexport const name = ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT, [SERVER_GROUP_WRITER])\n .component('oracleResizeCapacity', {\n bindings: {\n command: '=',\n application: '=',\n serverGroup: '=',\n formMethods: '=',\n },\n templateUrl: require('./resizeCapacity.component.html'),\n controller: [\n '$scope',\n 'serverGroupWriter',\n function ($scope, serverGroupWriter) {\n this.command.newSize = null;\n\n angular.extend(this.formMethods, {\n formIsValid: () => _.every([this.command.newSize !== null, $scope.resizeCapacityForm.$valid]),\n submitMethod: () => {\n return serverGroupWriter.resizeServerGroup(this.serverGroup, this.application, {\n capacity: { min: this.command.newSize, max: this.command.newSize, desired: this.command.newSize },\n serverGroupName: this.serverGroup.name,\n targetSize: this.command.newSize,\n region: this.serverGroup.region,\n interestingHealthProviderNames: this.command.interestingHealthProviderNames,\n reason: this.command.reason,\n });\n },\n });\n },\n ],\n });\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { TaskMonitor } from '@spinnaker/core';\nimport { ORACLE_COMMON_FOOTER_COMPONENT } from '../../../common/footer.component';\n\nimport { ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT } from './resizeCapacity.component';\n\nexport const ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.resize.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER, [\n ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT,\n ORACLE_COMMON_FOOTER_COMPONENT,\n]).controller('oracleResizeServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'application',\n 'serverGroup',\n function ($scope, $uibModalInstance, application, serverGroup) {\n $scope.serverGroup = serverGroup;\n $scope.application = application;\n $scope.verification = {};\n $scope.command = {};\n $scope.formMethods = {};\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Oracle'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n if (!$scope.verification.verified) {\n return false;\n }\n return $scope.formMethods.formIsValid();\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Resizing ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.resize = function () {\n this.submitting = true;\n if (!this.isValid()) {\n return;\n }\n\n $scope.taskMonitor.submit($scope.formMethods.submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\nimport { ORACLE_COMMON_FOOTER_COMPONENT } from '../../../common/footer.component';\n\nexport const ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.rollback.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER, [\n SERVER_GROUP_WRITER,\n ORACLE_COMMON_FOOTER_COMPONENT,\n]).controller('oracleRollbackServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n 'disabledServerGroups',\n function ($scope, $uibModalInstance, serverGroupWriter, application, serverGroup, disabledServerGroups) {\n $scope.serverGroup = serverGroup;\n $scope.disabledServerGroups = disabledServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.verification = {};\n\n $scope.command = {\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n },\n };\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Oracle'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n\n return command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Rollback ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.rollback = function () {\n this.submitting = true;\n if (!this.isValid()) {\n return;\n }\n\n const submitMethod = function () {\n return serverGroupWriter.rollbackServerGroup(serverGroup, application, $scope.command);\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport {\n ConfirmationModalService,\n NetworkReader,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n SubnetReader,\n} from '@spinnaker/core';\n\nimport { ORACLE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER } from './resize/resizeServerGroup.controller';\nimport { ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER } from './rollback/rollbackServerGroup.controller';\n\nexport const ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SERVER_GROUP_WRITER,\n ORACLE_IMAGE_IMAGE_READER,\n ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER,\n ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER,\n]).controller('oracleServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n '$uibModal',\n 'app',\n 'serverGroup',\n 'serverGroupWriter',\n 'oracleImageReader',\n function ($scope, $state, $uibModal, app, serverGroup, serverGroupWriter, oracleImageReader) {\n const provider = 'oracle';\n\n this.application = app;\n this.serverGroup = serverGroup;\n\n this.state = {\n loading: true,\n };\n\n /////////////////////////////////////////////////////////\n // Fetch data\n /////////////////////////////////////////////////////////\n\n const retrieveServerGroup = () => {\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then((details) => {\n cancelLoader();\n details.account = serverGroup.accountId;\n this.serverGroup = details;\n retrieveNetwork();\n retrieveSubnet();\n retrieveImage();\n });\n };\n\n const retrieveNetwork = () => {\n NetworkReader.listNetworksByProvider(provider).then((networks) => {\n this.serverGroup.network = _.chain(networks)\n .filter({ account: this.serverGroup.account, id: this.serverGroup.launchConfig.vpcId })\n .head()\n .value();\n });\n };\n\n const retrieveSubnet = () => {\n SubnetReader.getSubnetByIdAndProvider(this.serverGroup.launchConfig.subnetId, provider).then((subnet) => {\n this.serverGroup.subnet = subnet;\n });\n };\n\n const retrieveImage = () => {\n oracleImageReader\n .getImage(this.serverGroup.launchConfig.imageId, this.serverGroup.region, this.serverGroup.account)\n .then((image) => {\n if (!image) {\n image = { id: this.serverGroup.launchConfig.imageId, name: this.serverGroup.launchConfig.imageId };\n }\n this.serverGroup.image = image;\n });\n };\n\n ////////////////////////////////////////////////////////////\n // Actions. Triggered by server group details dropdown menu\n ////////////////////////////////////////////////////////////\n\n this.destroyServerGroup = function destroyServerGroup() {\n const serverGroup = this.serverGroup;\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 stateParams = {\n name: serverGroup.name,\n account: serverGroup.account,\n region: serverGroup.region,\n };\n\n ConfirmationModalService.confirm({\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.resizeServerGroup = () => {\n $uibModal.open({\n templateUrl: require('./resize/resizeServerGroup.html'),\n controller: 'oracleResizeServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => {\n return this.serverGroup;\n },\n application: () => {\n return app;\n },\n },\n });\n };\n\n this.rollbackServerGroup = () => {\n $uibModal.open({\n templateUrl: require('./rollback/rollbackServerGroup.html'),\n controller: 'oracleRollbackServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => this.serverGroup,\n disabledServerGroups: () => {\n const sgSummary = _.find(app.serverGroups.data, {\n name: this.serverGroup.name,\n account: this.serverGroup.account,\n region: this.serverGroup.region,\n });\n const cluster = _.find(app.clusters, { name: sgSummary.cluster, account: this.serverGroup.account });\n return _.filter(cluster.serverGroups, { isDisabled: true, region: this.serverGroup.region });\n },\n application: () => app,\n },\n });\n };\n\n this.disableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => serverGroupWriter.disableServerGroup(serverGroup, app, params);\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Oracle',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Oracle'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => serverGroupWriter.enableServerGroup(serverGroup, app, params);\n\n const confirmationModalParams = {\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Oracle',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Oracle'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n const cancelLoader = () => {\n this.state.loading = false;\n };\n\n retrieveServerGroup().then(() => {\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport _ from 'lodash';\n\nexport const ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.oracle.serverGroup.transformer';\nexport const name = ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('oracleServerGroupTransformer', [\n '$q',\n function ($q) {\n const PROVIDER = 'oracle';\n\n function normalizeServerGroup(serverGroup) {\n return $q.when(serverGroup);\n }\n\n function convertServerGroupCommandToDeployConfiguration(base) {\n const command = _.defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = PROVIDER;\n return command;\n }\n\n return {\n convertServerGroupCommandToDeployConfiguration,\n normalizeServerGroup,\n };\n },\n]);\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './helpContents/oracleHelpContents';\nimport { ORACLE_IMAGE_IMAGE_READER } from './image/image.reader';\nimport { ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { ORACLE_LOAD_BALANCER_CREATE_CONTROLLER } from './loadBalancer/configure/createLoadBalancer.controller';\nimport { ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER } from './loadBalancer/details/loadBalancerDetail.controller';\nimport { ORACLE_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/loadBalancer.transformer';\nimport { ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE } from './pipeline/stages/bake/ociBakeStage';\nimport { ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE } from './pipeline/stages/destroyAsg/destroyAsgStage';\nimport { ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE } from './pipeline/stages/disableAsg/disableAsgStage';\nimport { ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE } from './pipeline/stages/findAmi/findAmiStage';\nimport { ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE } from './pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage';\nimport { ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE } from './pipeline/stages/resizeAsg/resizeAsgStage';\nimport { ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE } from './pipeline/stages/scaleDownCluster/scaleDownClusterStage';\nimport { ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE } from './pipeline/stages/shrinkCluster/shrinkClusterStage';\nimport { ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER } from './securityGroup/configure/createSecurityGroup.controller';\nimport { ORACLE_SECURITYGROUP_SECURITYGROUP_READER } from './securityGroup/securityGroup.reader';\nimport { ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup/securityGroup.transformer';\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE } from './serverGroup/configure/serverGroup.configure.module';\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER } from './serverGroup/configure/wizard/cloneServerGroup.controller';\nimport { ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER } from './serverGroup/details/serverGroupDetails.controller';\nimport { ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\n\nexport const ORACLE_MODULE = 'spinnaker.oracle';\nmodule(ORACLE_MODULE, [\n // Pipeline\n ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE,\n ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE,\n ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE,\n ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE,\n ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE,\n ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE,\n ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE,\n ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE,\n\n // Load Balancers\n ORACLE_LOAD_BALANCER_TRANSFORMER,\n ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER,\n ORACLE_LOAD_BALANCER_CREATE_CONTROLLER,\n\n // Server Groups\n ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE,\n ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER,\n // Images\n ORACLE_IMAGE_IMAGE_READER,\n // Instances\n ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n // Firewalls\n ORACLE_SECURITYGROUP_SECURITYGROUP_READER,\n ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER,\n]).config(function () {\n CloudProviderRegistry.registerProvider('oracle', {\n name: 'Oracle',\n image: {\n reader: 'oracleImageReader',\n },\n loadBalancer: {\n transformer: 'oracleLoadBalancerTransformer',\n detailsTemplateUrl: require('./loadBalancer/details/loadBalancerDetail.html'),\n detailsController: 'oracleLoadBalancerDetailCtrl',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/createLoadBalancer.html'),\n createLoadBalancerController: 'oracleCreateLoadBalancerCtrl',\n },\n serverGroup: {\n transformer: 'oracleServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'oracleServerGroupDetailsCtrl',\n commandBuilder: 'oracleServerGroupCommandBuilder',\n cloneServerGroupController: 'oracleCloneServerGroupCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n configurationService: 'oracleServerGroupConfigurationService',\n },\n instance: {\n detailsController: 'oracleInstanceDetailsCtrl',\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n },\n securityGroup: {\n reader: 'oracleSecurityGroupReader',\n transformer: 'oracleSecurityGroupTransformer',\n createSecurityGroupTemplateUrl: require('./securityGroup/configure/createSecurityGroup.html'),\n createSecurityGroupController: 'oracleCreateSecurityGroupCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('oracle', []);\n"],"names":["key","value","forEach","entry","HelpContentsRegistry","register","ORACLE_IMAGE_IMAGE_READER","module","factory","findImages","params","REST","query","get","catch","getImage","imageId","region","credentials","path","provider","then","results","length","ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","LoadBalancingPolicy","LoadBalancingPolicy2","UIROUTER_ANGULARJS","controller","$scope","$q","app","instance","application","retrieveInstance","instanceSummary","account","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","name","InstanceReader","getInstanceDetails","instanceDetails","Object","assign","isStandalone","all","ready","$$destroyed","onRefresh","OracleProviderSettings","SETTINGS","providers","oracle","defaults","resetToOriginal","resetProvider","OracleDefaultProviderSettings","bakeryRegions","ORACLE_LOAD_BALANCER_TRANSFORMER","service","normalizeLoadBalancer","loadBalancer","resolve","convertLoadBalancerForEditing","listeners","keys","lis","isSsl","sslConfiguration","cloudProvider","shape","isPrivate","subnetIds","subnets","map","subnet","certificates","hostnames","backendSets","freeformTags","loadBalancerType","type","securityGroups","vpcId","subnetTypeMap","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","constructNewListenerTemplate","port","protocol","defaultBackendSetName","constructNewBackendSetTemplate","policy","ROUND_ROBIN","healthChecker","urlPath","backends","isNew","constructNewSSLConfiguration","certificateName","verifyDepth","verifyPeerCertificates","constructNewCertificateTemplate","publicCertificate","caCertificate","privateKey","passphrase","OracleLoadBalancerController","constructor","$uibModalInstance","$state","oracleLoadBalancerTransformer","this","shapes","loadBalancingPolicies","k","pages","properties","state","accountsLoaded","submitting","numSubnetsAllowed","initializeController","onApplicationRefresh","close","newStateParams","accountId","includes","go","onTaskComplete","loadBalancers","refresh","onNextRefresh","initializeCreateMode","AccountService","listAccounts","accounts","accountUpdated","loadVnets","loadSubnets","initControllerFromLoadBalancerCmd","calcNumSubnetsAllowed","loadBalancerCmd","push","b","nameParts","NameUtils","parseLoadBalancerName","stack","detail","freeFormDetails","prevBackendSetNames","prevCertNames","updateName","updateLoadBalancerNames","taskMonitor","TaskMonitor","title","modalInstance","accountLoadBalancerNamesByRegion","getDataSource","existingLoadBalancerNames","validateBeforeSubmit","propertiesValid","listenersValid","listenersUniqueProtocolPort","listenersBackendSetsExist","listenersCertificatesExist","selectedSubnets","countsMap","reduce","counts","listener","protocolPort","filter","find","backendSet","cert","getName","lb","lbName","join","trimEnd","loadRegionsForAccount","regionUpdated","updateVnets","getRegionsForAccount","regions","NetworkReader","listNetworksByProvider","vnets","allVnets","SubnetReader","listSubnetsByProvider","allSubnets","filteredVnets","vnet","updateSubnets","network","filteredSubnets","vcnId","filteredSubnetsByType","cloneDeep","selectedVnetChanged","selectedVnet","selectedSubnetsChanged","selectedSubnet","availabilityDomain","selectedSubnetRemoved","isPrivateChanged","listenerIsSslChanged","getSubnetLimit","removeListener","idx","splice","addListener","removeBackendSet","isBackendSetRemovable","hasListener","addBackendSet","backendSetNameChanged","prevName","isCertRemovable","removeCert","addCert","certNameChanged","submit","descriptor","clusterName","resourceGroupName","loadBalancerName","loadBalancerId","backendSetsMap","listenersMap","certMap","subnetType","LoadBalancerWriter","upsertLoadBalancer","cancel","dismiss","$inject","ORACLE_LOAD_BALANCER_CREATE_CONTROLLER","ANGULAR_UI_BOOTSTRAP","OracleLoadBalancerDetailController","$uibModal","securityGroupReader","loadBalancerReader","loading","firewallsLabel","FirewallLabels","extractLoadBalancer","test","getLoadBalancerDetails","details","filtered","elb","securityGroupId","match","getApplicationSecurityGroup","sortBy","when","editLoadBalancer","open","templateUrl","controllerAs","size","angular","copy","deleteLoadBalancer","command","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER","ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","EXECUTION_DETAILS_SECTION_SERVICE","$log","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE","config","Registry","pipeline","registerStage","provides","label","description","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","supportsCustomTimeout","validators","fieldName","fieldLabel","restartable","extendedAttributes","user","AuthenticationService","getAuthenticatedUser","getBaseOsDescription","baseOsOption","shortDescription","accountName","Array","isArray","addExtendedAttribute","PipelineTemplates","addExtendedAttributes","extendedAttribute","result","removeExtendedAttribute","showExtendedAttributes","viewState","$watch","providerSelected","BakeryReader","getBaseOsOptions","baseOsOptions","baseImages","baseOs","upgrade","ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE","executionStepLabelUrl","message","targets","StageConstants","TARGET_LIST","regionsLoaded","target","val","init","ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE","gce","ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE","selectionStrategies","selectionStrategy","isUndefined","onlyEnabled","ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE","executionConfigSections","packageName","tags","getRegions","ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE","resizeTargets","scaleActions","resizeTypes","capacity","action","resizeType","updateResizeType","scalePct","scaleNum","ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE","strategy","remainingFullSizeServerGroups","allowScaleDownActive","preferLargerOverNewer","pluralize","str","toString","ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE","shrinkToSize","allowDeleteActive","retainLargerOverNewer","ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER","firewallLabel","ORACLE_SECURITYGROUP_SECURITYGROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","addVcnNameToSecurityGroup","securityGroup","vcns","matches","vcn","vpcName","normalizeSecurityGroup","_","partial","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE","SECURITY_GROUP_READER","oracleImageReader","loadAndSelectRegions","backingData","selectedAccountDetails","credentialsKeyedByAccount","loadAvailabilityDomains","getAvailabilityZonesForAccountAndRegion","availDoms","availabilityDomains","av","loadLoadBalancers","configureCommand","defaultRegion","getCredentialsKeyedByAccount","getAllSecurityGroups","networks","images","availDomains","zone","filterSubnets","accountOnChange","regionOnChange","availabilityDomainOnChange","subnetId","seclists","vpcOnChange","subnetOnChange","mySecGroups","secLists","securityListIds","sid","sgRef","getSecurityGroupDetails","sgd","findBackendSetsByLoadBalancerId","lb2","bsetArray","arr","bsetName","bset","findLoadBalListenersByBackendSetName","backendSetName","lisName","loadBalancerOnChange","backendSetOnChange","shapesMap","image","compatibleShapes","getShapes","allShapes","uniqBy","flatten","values","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER","IMAGE_READER","$uibModalStack","$controller","imageReader","extend","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT","component","bindings","noop","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","buildNewServerGroupCommand","defaultAccount","desired","selectedProvider","mode","disableStrategySelection","buildServerGroupCommandFromExisting","serverGroupName","parseServerGroupName","launchConfig","sshAuthorizedKeys","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","viewOverrides","disableImageSelection","submitButtonLabel","templatingEnabled","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER","serverGroupWriter","serverGroupCommand","oracleServerGroupConfigurationService","loaded","basicSettings","instanceType","networkSettings","templateSelection","templateSelectionText","copied","notCopied","isValid","form","$valid","ModalWizard","isComplete","showSubmitButton","allPagesVisited","cloneServerGroup","templateSelected","ORACLE_COMMON_FOOTER_COMPONENT","verification","ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT","SERVER_GROUP_WRITER","formMethods","newSize","formIsValid","every","resizeCapacityForm","resizeServerGroup","min","max","targetSize","interestingHealthProviderNames","reason","ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER","attributes","platformHealthOnlyShowOverride","platformHealthOnly","verified","resize","ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER","disabledServerGroups","sort","a","localeCompare","rollbackType","rollbackContext","rollbackServerGroupName","restoreServerGroupName","rollback","rollbackServerGroup","ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER","retrieveServerGroup","ServerGroupReader","getServerGroup","cancelLoader","retrieveNetwork","retrieveSubnet","retrieveImage","chain","head","getSubnetByIdAndProvider","destroyServerGroup","serverGroup2","stateParams","sgSummary","cluster","clusters","isDisabled","disableServerGroup","confirmationModalParams","platformHealthType","askForReason","ServerGroupWarningMessageService","addDisableWarningMessage","enableServerGroup","ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER","convertServerGroupCommandToDeployConfiguration","base","normalizeServerGroup","ORACLE_MODULE","CloudProviderRegistry","registerProvider","reader","transformer","detailsTemplateUrl","detailsController","createLoadBalancerTemplateUrl","createLoadBalancerController","commandBuilder","cloneServerGroupController","cloneServerGroupTemplateUrl","configurationService","createSecurityGroupTemplateUrl","createSecurityGroupController","DeploymentStrategyRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/helpContents/oracleHelpContents.ts","../src/image/image.reader.js","../src/instance/details/instance.details.controller.js","../src/domain/IOracleLoadBalancer.ts","../src/oracle.settings.ts","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/configure/createLoadBalancer.controller.ts","../src/loadBalancer/details/loadBalancerDetail.controller.ts","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/pipeline/stages/bake/ociBakeStage.js","../src/pipeline/stages/destroyAsg/destroyAsgStage.js","../src/pipeline/stages/disableAsg/disableAsgStage.js","../src/pipeline/stages/findAmi/findAmiStage.js","../src/pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage.js","../src/pipeline/stages/resizeAsg/resizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/scaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/shrinkClusterStage.js","../src/securityGroup/configure/createSecurityGroup.controller.js","../src/securityGroup/securityGroup.reader.js","../src/securityGroup/securityGroup.transformer.js","../src/serverGroup/configure/serverGroupConfiguration.service.js","../src/serverGroup/configure/wizard/basicSettings/basicSettings.controller.js","../src/serverGroup/configure/wizard/capacity/capacitySelector.component.js","../src/serverGroup/configure/serverGroup.configure.module.js","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/wizard/cloneServerGroup.controller.js","../src/common/footer.component.js","../src/serverGroup/details/resize/resizeCapacity.component.js","../src/serverGroup/details/resize/resizeServerGroup.controller.js","../src/serverGroup/details/rollback/rollbackServerGroup.controller.js","../src/serverGroup/details/serverGroupDetails.controller.js","../src/serverGroup/serverGroup.transformer.js","../src/oracle.module.ts"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'oracle.serverGroup.stack',\n value: '(Optional) <b>Stack</b> Stack name',\n },\n {\n key: 'oracle.serverGroup.detail',\n value: '(Optional) <b>Detail</b> is a naming component to help distinguish specifics of the server group.',\n },\n {\n key: 'oracle.pipeline.config.bake.baseOsOption',\n value: '<p>The base image from which the image will be created.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.image_name',\n value: '<p>The base name of the image that will be created.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.package',\n value:\n '<p>The name of the package you want installed (without any version identifiers).</p>' +\n '<p>If there are multiple packages (space separated), then they will be installed in the order they are entered.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.upgrade',\n value:\n '<p>Perform a package manager upgrade before proceeding with the package installation.</p>' +\n '<p>For example: <i>yum update</i>.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.regions',\n value:\n '<p>The region in which the new image will be created.</p>' +\n '<p>NB: <i>Currently baked images are restricted to a single region</i>.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.user',\n value: '<p>The name of Oracle <i>user</i> that will be used during the baking process.</p>',\n },\n {\n key: 'oracle.pipeline.config.bake.account_name',\n value: '<p>The name of Oracle <i>account</i> that will be used during the baking process.</p>',\n },\n {\n key: 'oracle.serverGroup.sshAuthorizedKeys',\n value: '<p>The public SSH key for the default user on the instance.</p>',\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nexport const ORACLE_IMAGE_IMAGE_READER = 'spinnaker.oracle.image.reader';\nexport const name = ORACLE_IMAGE_IMAGE_READER; // for backwards compatibility\nmodule(ORACLE_IMAGE_IMAGE_READER, []).factory('oracleImageReader', function () {\n function findImages(params) {\n return REST('/images/find')\n .query(params)\n .get()\n .catch(function () {\n return [];\n });\n }\n\n function getImage(imageId, region, credentials) {\n return REST('/images')\n .path(credentials, region, imageId)\n .query({ provider: 'oracle' })\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,\n getImage,\n };\n});\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { InstanceReader } from '@spinnaker/core';\n\nexport const ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.oracle.instance.details.controller';\nexport const name = ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'oracleInstanceDetailsCtrl',\n [\n '$scope',\n '$q',\n 'app',\n 'instance',\n function ($scope, $q, app, instance) {\n $scope.application = app;\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n function retrieveInstance() {\n let instanceSummary, account, region;\n if (!$scope.application.serverGroups) {\n instanceSummary = {};\n account = instance.account;\n region = instance.region;\n } else {\n $scope.application.serverGroups.data.some((serverGroup) => {\n return serverGroup.instances.some((possibleInstance) => {\n if (possibleInstance.id === instance.instanceId || possibleInstance.name === instance.instanceId) {\n instanceSummary = possibleInstance;\n account = serverGroup.account;\n region = serverGroup.region;\n return true;\n }\n });\n });\n }\n\n $scope.instance = instanceSummary;\n InstanceReader.getInstanceDetails(account, region, instance.instanceId).then((instanceDetails) => {\n Object.assign($scope.instance, instanceDetails);\n });\n }\n },\n ],\n);\n","import type { ILoadBalancer, ILoadBalancerDeleteCommand, ILoadBalancerUpsertCommand, ISubnet } from '@spinnaker/core';\n\nexport type ListenerProtocol = 'HTTP' | 'HTTPS' | 'TCP' | 'SSL';\nexport enum LoadBalancingPolicy {\n ROUND_ROBIN = 'ROUND_ROBIN',\n IP_HASH = 'IP_HASH',\n LEAST_CONNECTIONS = 'LEAST_CONNECTIONS',\n}\n\nexport interface IOracleSubnet extends ISubnet {\n id: string;\n name: string;\n availabilityDomain: string;\n securityListIds: string[];\n vcnId: string;\n}\n\nexport interface IOracleLoadBalancer extends ILoadBalancer {\n shape: string; // required\n isPrivate: boolean; // required\n subnets: IOracleSubnet[]; // required 1 for private LB, 2 for public LB\n certificates?: { [name: string]: IOracleListenerCertificate };\n listeners?: { [name: string]: IOracleListener }; // not required to create LB, but useless without it\n hostnames?: IOracleHostname[];\n backendSets?: { [name: string]: IOracleBackEndSet }; // not required to create LB, but useless without it\n freeformTags?: { [tagName: string]: string };\n id?: string; // not required to create LB\n subnetTypeMap?: { [id: string]: 'AD' | 'Regional' };\n // TODO support path route sets\n}\n\n// This is created from loadBalancer/loadBalancer.states.ts\nexport interface ILoadBalancerDetails {\n name: string;\n accountId: string;\n region: string;\n vpcId: string;\n}\n\nexport interface IOracleListener {\n name: string;\n protocol: ListenerProtocol;\n port: number;\n defaultBackendSetName: string;\n isSsl: boolean;\n sslConfiguration?: IOracleListenerSSLConfiguration;\n hostnames?: IOracleHostname[];\n // TODO support pathRouteSets\n}\n\nexport interface IOracleListenerSSLConfiguration {\n certificateName: string;\n verifyDepth: number;\n verifyPeerCertificates: boolean;\n}\n\nexport interface IOracleHostname {\n name: string;\n hostname: string;\n}\n\nexport interface IOracleBackEndSet {\n name: string;\n policy: LoadBalancingPolicy;\n healthChecker: IOracleBackendSetHealthCheck;\n // TODO desagar sessionPersistenceConfiguration?: IOracleLoadBalancerSessionPersistenceConfiguration;\n backends: any[];\n isNew: boolean;\n}\n\nexport interface IOracleListenerCertificate {\n certificateName: string;\n publicCertificate: string;\n caCertificate: string;\n privateKey: string;\n passphrase: string;\n isNew: boolean;\n}\n\nexport interface IOracleBackendSetHealthCheck {\n urlPath: string; // required\n protocol: 'HTTP' | 'TCP';\n port: number;\n intervalMillis?: number;\n timeoutMillis?: number;\n retries?: number;\n returnCode?: number;\n responseBodyRegex?: string;\n}\n\n/**\n * IOracleLoadBalancerUpsertCommand is nearly identical to IOracleLoadBalancer -\n * Command objects are the shape of data sent to gate.\n */\nexport interface IOracleLoadBalancerUpsertCommand extends ILoadBalancerUpsertCommand {\n shape: string; // required\n isPrivate: boolean; // required\n subnetIds: string[]; // required 1 for private LB, 2 for public LB\n certificates?: { [name: string]: IOracleListenerCertificate };\n listeners?: { [name: string]: IOracleListener }; // not required to create LB, but useless without it\n hostnames?: IOracleHostname[];\n backendSets?: { [name: string]: IOracleBackEndSet }; // not required to create LB, but useless without it\n freeformTags?: { [tagName: string]: string };\n vpcId: string;\n subnetTypeMap?: { [id: string]: 'AD' | 'Regional' };\n}\n\nexport interface IOracleLoadBalancerDeleteCommand extends ILoadBalancerDeleteCommand {\n loadBalancerId: string;\n}\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IOracleProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n };\n}\n\nexport const OracleProviderSettings: IOracleProviderSettings = (SETTINGS.providers\n .oracle as IOracleProviderSettings) || { defaults: {} };\nif (OracleProviderSettings) {\n OracleProviderSettings.resetToOriginal = SETTINGS.resetProvider('oracle');\n}\n\nexport const OracleDefaultProviderSettings = {\n defaults: { account: 'DEFAULT', bakeryRegions: 'us-phoenix-1', region: 'us-phoenix-1' },\n};\n","import { module } from 'angular';\nimport { $q } from 'ngimport';\n\nimport type { Application } from '@spinnaker/core';\nimport type {\n IOracleBackEndSet,\n IOracleListener,\n IOracleListenerCertificate,\n IOracleListenerSSLConfiguration,\n IOracleLoadBalancer,\n IOracleLoadBalancerUpsertCommand,\n} from '../domain/IOracleLoadBalancer';\nimport { LoadBalancingPolicy } from '../domain/IOracleLoadBalancer';\nimport { OracleProviderSettings } from '../oracle.settings';\nimport { OracleDefaultProviderSettings } from '../oracle.settings';\n\nexport class OracleLoadBalancerTransformer {\n public normalizeLoadBalancer(loadBalancer: IOracleLoadBalancer): PromiseLike<IOracleLoadBalancer> {\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 var activeServerGroups = _.filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = _.chain(activeServerGroups)\n .map('instances')\n .flatten()\n .value();\n loadBalancer.detachedInstances = _.chain(activeServerGroups)\n .map('detachedInstances')\n .flatten()\n .value();*/\n return $q.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(loadBalancer: IOracleLoadBalancer): IOracleLoadBalancerUpsertCommand {\n if (loadBalancer.listeners) {\n Object.keys(loadBalancer.listeners).forEach((key) => {\n const lis = loadBalancer.listeners[key];\n lis.isSsl = !!lis.sslConfiguration; // use !! operator to get truthiness value\n });\n }\n const toEdit: IOracleLoadBalancerUpsertCommand = {\n name: loadBalancer.name,\n cloudProvider: loadBalancer.cloudProvider,\n credentials: loadBalancer.account,\n region: loadBalancer.region,\n shape: loadBalancer.shape,\n isPrivate: loadBalancer.isPrivate,\n subnetIds: loadBalancer.subnets.map((subnet) => subnet.id),\n certificates: loadBalancer.certificates,\n listeners: loadBalancer.listeners,\n hostnames: loadBalancer.hostnames,\n backendSets: loadBalancer.backendSets,\n freeformTags: loadBalancer.freeformTags,\n loadBalancerType: loadBalancer.type,\n securityGroups: loadBalancer.securityGroups,\n vpcId: loadBalancer.vpcId,\n subnetTypeMap: loadBalancer.subnetTypeMap,\n };\n return toEdit;\n }\n\n public constructNewLoadBalancerTemplate(application: Application): IOracleLoadBalancerUpsertCommand {\n const defaultCredentials =\n application.defaultCredentials.oracle ||\n (OracleProviderSettings.defaults\n ? OracleProviderSettings.defaults.account\n : OracleDefaultProviderSettings.defaults.account);\n const defaultRegion =\n application.defaultRegions.oracle ||\n (OracleProviderSettings.defaults\n ? OracleProviderSettings.defaults.region\n : OracleDefaultProviderSettings.defaults.region);\n return {\n name: undefined,\n cloudProvider: 'oracle',\n credentials: defaultCredentials,\n region: defaultRegion,\n shape: null,\n isPrivate: false,\n subnetIds: [],\n listeners: {},\n hostnames: [],\n backendSets: {},\n freeformTags: {},\n loadBalancerType: null,\n securityGroups: [],\n vpcId: null,\n subnetTypeMap: {},\n };\n }\n\n public constructNewListenerTemplate(): IOracleListener {\n return {\n name: 'HTTP_80',\n port: 80,\n protocol: 'HTTP',\n defaultBackendSetName: undefined,\n isSsl: false,\n };\n }\n\n public constructNewBackendSetTemplate(name: string): IOracleBackEndSet {\n return {\n name: name,\n policy: LoadBalancingPolicy.ROUND_ROBIN,\n healthChecker: { protocol: 'HTTP', port: 80, urlPath: '/' },\n backends: [],\n isNew: true,\n };\n }\n\n public constructNewSSLConfiguration(): IOracleListenerSSLConfiguration {\n return {\n certificateName: '',\n verifyDepth: 0,\n verifyPeerCertificates: false,\n };\n }\n\n public constructNewCertificateTemplate(name: string): IOracleListenerCertificate {\n return {\n certificateName: name,\n publicCertificate: undefined,\n caCertificate: undefined,\n privateKey: undefined,\n passphrase: undefined,\n isNew: true,\n };\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_TRANSFORMER = 'spinnaker.oracle.loadBalancer.transformer';\nmodule(ORACLE_LOAD_BALANCER_TRANSFORMER, []).service('oracleLoadBalancerTransformer', OracleLoadBalancerTransformer);\n","import type { StateService } from '@uirouter/angularjs';\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport { cloneDeep, trimEnd } from 'lodash';\n\nimport type { Application, IAccountDetails, ILoadBalancer, INetwork, IRegion, ISubnet } from '@spinnaker/core';\nimport {\n AccountService,\n LoadBalancerWriter,\n NameUtils,\n NetworkReader,\n SubnetReader,\n TaskMonitor,\n} from '@spinnaker/core';\nimport type {\n IOracleBackEndSet,\n IOracleListener,\n IOracleListenerCertificate,\n IOracleLoadBalancer,\n IOracleSubnet,\n} from '../../domain/IOracleLoadBalancer';\nimport { LoadBalancingPolicy } from '../../domain/IOracleLoadBalancer';\n\nimport type { OracleLoadBalancerTransformer } from '../loadBalancer.transformer';\nimport { ORACLE_LOAD_BALANCER_TRANSFORMER } from '../loadBalancer.transformer';\n\nexport class OracleLoadBalancerController implements IController {\n public oracle = 'oracle';\n public shapes: string[] = ['100Mbps', '400Mbps', '8000Mbps']; // TODO desagar use listShapes to get this from clouddriver later\n public loadBalancingPolicies: string[] = Object.keys(LoadBalancingPolicy).map((k) => (LoadBalancingPolicy as any)[k]);\n public pages: { [key: string]: any } = {\n properties: require('./createLoadBalancerProperties.html'),\n listeners: require('./listeners.html'),\n backendSets: require('./backendSets.html'),\n certificates: require('./certificates.html'),\n };\n\n public state: { [key: string]: boolean } = {\n accountsLoaded: false,\n submitting: false,\n };\n\n public allVnets: INetwork[];\n public allSubnets: IOracleSubnet[];\n public filteredVnets: INetwork[];\n public filteredSubnets: ISubnet[];\n public filteredSubnetsByType: ISubnet[];\n public selectedVnet: INetwork;\n public selectedSubnets: IOracleSubnet[];\n public numSubnetsAllowed = 1;\n public listeners: IOracleListener[] = [];\n public backendSets: IOracleBackEndSet[] = [];\n public certificates: IOracleListenerCertificate[] = [];\n\n public static $inject = [\n '$scope',\n '$uibModalInstance',\n '$state',\n 'oracleLoadBalancerTransformer',\n 'application',\n 'loadBalancer',\n 'isNew',\n ];\n constructor(\n private $scope: ng.IScope,\n private $uibModalInstance: IModalServiceInstance,\n private $state: StateService,\n private oracleLoadBalancerTransformer: OracleLoadBalancerTransformer,\n private application: Application,\n private loadBalancer: IOracleLoadBalancer,\n private isNew: boolean,\n ) {\n this.initializeController();\n }\n\n public onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if (this.$scope.$$destroyed) {\n return;\n }\n this.$uibModalInstance.close();\n const newStateParams = {\n name: this.loadBalancer.name,\n accountId: this.loadBalancer.account,\n region: this.loadBalancer.region,\n provider: 'oracle',\n };\n\n if (!this.$state.includes('**.loadBalancerDetails')) {\n this.$state.go('.loadBalancerDetails', newStateParams);\n } else {\n this.$state.go('^.loadBalancerDetails', newStateParams);\n }\n }\n\n public onTaskComplete() {\n this.application.loadBalancers.refresh();\n this.application.loadBalancers.onNextRefresh(this.$scope, this.onApplicationRefresh);\n }\n\n public initializeCreateMode() {\n AccountService.listAccounts(this.oracle).then((accounts: IAccountDetails[]) => {\n this.$scope.accounts = accounts; // TODO desagar does this need to be in $scope?\n this.state.accountsLoaded = true;\n this.$scope.state = this.state;\n this.accountUpdated();\n });\n this.loadVnets();\n this.loadSubnets();\n }\n\n private initControllerFromLoadBalancerCmd() {\n this.numSubnetsAllowed = this.calcNumSubnetsAllowed();\n if (this.$scope.loadBalancerCmd.listeners) {\n Object.keys(this.$scope.loadBalancerCmd.listeners).forEach((lis) => {\n this.listeners.push(this.$scope.loadBalancerCmd.listeners[lis]);\n });\n }\n if (this.$scope.loadBalancerCmd.backendSets) {\n Object.keys(this.$scope.loadBalancerCmd.backendSets).forEach((b) => {\n this.backendSets.push(this.$scope.loadBalancerCmd.backendSets[b]);\n });\n }\n if (this.$scope.loadBalancerCmd.certificates) {\n Object.keys(this.$scope.loadBalancerCmd.certificates).forEach((b) => {\n this.certificates.push(this.$scope.loadBalancerCmd.certificates[b]);\n });\n }\n }\n\n public initializeController() {\n if (this.loadBalancer) {\n this.$scope.loadBalancerCmd = this.oracleLoadBalancerTransformer.convertLoadBalancerForEditing(this.loadBalancer);\n this.initControllerFromLoadBalancerCmd();\n if (this.isNew) {\n const nameParts = NameUtils.parseLoadBalancerName(this.loadBalancer.name);\n this.$scope.loadBalancerCmd.stack = nameParts.stack;\n this.$scope.loadBalancerCmd.detail = nameParts.freeFormDetails;\n delete this.$scope.loadBalancerCmd.name;\n }\n } else {\n this.$scope.loadBalancerCmd = this.oracleLoadBalancerTransformer.constructNewLoadBalancerTemplate(\n this.application,\n );\n }\n this.$scope.prevBackendSetNames = [];\n this.$scope.prevCertNames = [];\n if (this.isNew) {\n this.updateName();\n this.updateLoadBalancerNames();\n this.initializeCreateMode();\n }\n this.$scope.taskMonitor = new TaskMonitor({\n application: this.application,\n title: (this.isNew ? 'Creating ' : 'Updating ') + 'your load balancer',\n modalInstance: this.$uibModalInstance,\n onTaskComplete: this.onTaskComplete,\n });\n }\n\n public updateLoadBalancerNames() {\n const account = this.$scope.loadBalancerCmd.credentials;\n const region = this.$scope.loadBalancerCmd.region;\n\n const accountLoadBalancerNamesByRegion: { [key: string]: string[] } = {};\n this.application\n .getDataSource('loadBalancers')\n .refresh(true)\n .then(() => {\n const loadBalancers: ILoadBalancer[] = this.application.loadBalancers.data;\n loadBalancers.forEach((loadBalancer) => {\n if (loadBalancer.account === account) {\n accountLoadBalancerNamesByRegion[loadBalancer.region] =\n accountLoadBalancerNamesByRegion[loadBalancer.region] || [];\n accountLoadBalancerNamesByRegion[loadBalancer.region].push(loadBalancer.name);\n }\n });\n\n this.$scope.existingLoadBalancerNames = accountLoadBalancerNamesByRegion[region] || [];\n });\n }\n\n public validateBeforeSubmit() {\n return this.propertiesValid() && this.listenersValid();\n }\n\n /**\n * Used to prevent form submission if listeners are invalid\n * Currently it calls the two validations applicable to listeners.\n * @returns {boolean}\n */\n public listenersValid() {\n return this.listenersUniqueProtocolPort() && this.listenersBackendSetsExist() && this.listenersCertificatesExist();\n }\n\n /**\n * Used to prevent form submission if the properties section is invalid\n * Current the only validation is for subnet count.\n */\n public propertiesValid() {\n return this.selectedSubnets && this.selectedSubnets.length === this.calcNumSubnetsAllowed();\n }\n\n public listenersUniqueProtocolPort() {\n // validate that listeners have unique protocol/port combination\n const countsMap: { [key: string]: number } = {};\n this.listeners.reduce((counts, listener) => {\n const protocolPort = listener.protocol + '_' + listener.port;\n counts[protocolPort] = counts[protocolPort] ? counts[protocolPort] + 1 : 1;\n return counts;\n }, countsMap);\n // There should be no protocol/port combo in the countsMap with a count > 1\n return (\n Object.keys(countsMap).filter((key) => {\n return countsMap[key] > 1;\n }).length === 0\n );\n }\n\n public listenersBackendSetsExist() {\n // validate that the listeners' selected backend sets must exist. This is needed because Angular\n // does not clear the selected backendSet from the drop down if the backend set is deleted.\n const listenersWithNonExistentBackendSet: IOracleListener[] = this.listeners.filter(\n (listener) => !this.backendSets.find((backendSet) => backendSet.name === listener.defaultBackendSetName),\n );\n return listenersWithNonExistentBackendSet.length === 0;\n }\n\n public listenersCertificatesExist() {\n // validate that the listeners' selected certificate names exist. This is needed because Angular\n // does not clear the selected certificate from the drop down if the certificate is deleted.\n const listenersWithNonExistentCertificate: IOracleListener[] = this.listeners.filter(\n (listener) =>\n listener.sslConfiguration &&\n !this.certificates.find((cert) => cert.certificateName === listener.sslConfiguration.certificateName),\n );\n return listenersWithNonExistentCertificate.length === 0;\n }\n\n public updateName() {\n this.$scope.loadBalancerCmd.name = this.getName();\n }\n\n public getName() {\n const lb = this.$scope.loadBalancerCmd;\n const lbName = [this.application.name, lb.stack || '', lb.detail || ''].join('-');\n return trimEnd(lbName, '-');\n }\n\n public accountUpdated() {\n this.loadRegionsForAccount();\n }\n\n public regionUpdated() {\n this.updateLoadBalancerNames();\n this.updateVnets();\n }\n\n public loadRegionsForAccount() {\n AccountService.getRegionsForAccount(this.$scope.loadBalancerCmd.credentials).then((regions: IRegion[]) => {\n this.$scope.regions = regions; // TODO desagar does this need to be in $scope?\n if (regions.length === 1) {\n this.$scope.loadBalancerCmd.region = regions[0].name;\n this.regionUpdated();\n }\n });\n }\n\n public loadVnets() {\n NetworkReader.listNetworksByProvider(this.oracle).then((vnets: INetwork[]) => {\n this.allVnets = vnets || [];\n if (this.$scope.loadBalancerCmd.region) {\n this.updateVnets();\n }\n });\n }\n\n public loadSubnets() {\n SubnetReader.listSubnetsByProvider(this.oracle).then((subnets: IOracleSubnet[]) => {\n this.allSubnets = subnets || [];\n });\n }\n\n public updateVnets() {\n const account = this.$scope.loadBalancerCmd.credentials;\n const region = this.$scope.loadBalancerCmd.region;\n this.filteredVnets = this.allVnets.filter((vnet: INetwork) => {\n return vnet.account === account && vnet.region === region;\n });\n }\n\n public updateSubnets(network: INetwork) {\n this.selectedSubnets = [];\n this.$scope.loadBalancerCmd.subnetIds = [];\n this.filteredSubnets = this.allSubnets.filter((subnet: IOracleSubnet) => {\n return subnet.vcnId === network.id;\n });\n this.filteredSubnetsByType = cloneDeep(this.filteredSubnets);\n }\n\n public selectedVnetChanged(network: INetwork) {\n this.selectedVnet = network;\n this.$scope.loadBalancerCmd.vpcId = network.id;\n this.updateSubnets(network);\n }\n\n public selectedSubnetsChanged(selectedSubnet: IOracleSubnet) {\n if (selectedSubnet.availabilityDomain) {\n this.filteredSubnetsByType = this.filteredSubnets.filter((subnet: IOracleSubnet) => {\n return !!subnet.availabilityDomain;\n });\n } else {\n this.filteredSubnetsByType = [];\n }\n }\n\n public selectedSubnetRemoved() {\n if (this.selectedSubnets.length === 0) {\n this.filteredSubnetsByType = cloneDeep(this.filteredSubnets);\n }\n if (this.selectedSubnets.length === 1 && this.selectedSubnets[0].availabilityDomain) {\n this.filteredSubnetsByType = this.filteredSubnets.filter((subnet: IOracleSubnet) => {\n return !!subnet.availabilityDomain;\n });\n }\n }\n\n public isPrivateChanged() {\n this.numSubnetsAllowed = this.calcNumSubnetsAllowed();\n }\n\n public listenerIsSslChanged(listener: IOracleListener) {\n if (listener.isSsl) {\n listener.sslConfiguration = this.oracleLoadBalancerTransformer.constructNewSSLConfiguration();\n } else {\n listener.sslConfiguration = undefined;\n }\n }\n\n public calcNumSubnetsAllowed() {\n if (this.$scope.loadBalancerCmd.isPrivate) {\n return 1;\n }\n\n if (this.selectedSubnets && this.selectedSubnets.length === 1 && !this.selectedSubnets[0].availabilityDomain) {\n return 1;\n }\n\n return 2;\n }\n\n public getSubnetLimit() {}\n\n public removeListener(idx: number) {\n this.listeners.splice(idx, 1);\n }\n\n public addListener() {\n this.listeners.push(this.oracleLoadBalancerTransformer.constructNewListenerTemplate());\n }\n\n public removeBackendSet(idx: number) {\n const backendSet = this.backendSets[idx];\n this.backendSets.splice(idx, 1);\n this.$scope.prevBackendSetNames.splice(idx, 1);\n // Also clear the defaultBackendSetName field of any listeners who are using this backendSet\n this.listeners.forEach((lis) => {\n if (lis.defaultBackendSetName === backendSet.name) {\n lis.defaultBackendSetName = undefined;\n }\n });\n }\n\n public isBackendSetRemovable(idx: number): boolean {\n const backendSet = this.backendSets[idx];\n if (backendSet && backendSet.backends && backendSet.backends.length > 0) {\n return false;\n }\n let hasListener = false;\n this.listeners.forEach((lis) => {\n if (lis.defaultBackendSetName === backendSet.name) {\n hasListener = true;\n }\n });\n return !hasListener;\n }\n\n public addBackendSet() {\n const nameSuffix: number = this.backendSets.length + 1;\n const name: string = 'backendSet' + nameSuffix;\n this.$scope.prevBackendSetNames.push(name);\n this.backendSets.push(this.oracleLoadBalancerTransformer.constructNewBackendSetTemplate(name));\n }\n\n public backendSetNameChanged(idx: number) {\n const prevName = this.$scope.prevBackendSetNames && this.$scope.prevBackendSetNames[idx];\n if (prevName && prevName !== this.backendSets[idx].name) {\n this.listeners\n .filter((lis) => lis.defaultBackendSetName === prevName)\n .forEach((lis) => {\n lis.defaultBackendSetName = this.backendSets[idx].name;\n });\n }\n }\n\n public isCertRemovable(idx: number): boolean {\n const cert = this.certificates[idx];\n let hasListener = false;\n this.listeners.forEach((lis) => {\n if (lis.isSsl && lis.sslConfiguration && lis.sslConfiguration.certificateName === cert.certificateName) {\n hasListener = true;\n }\n });\n return !hasListener;\n }\n\n public removeCert(idx: number) {\n const cert = this.certificates[idx];\n this.certificates.splice(idx, 1);\n this.$scope.prevCertNames.splice(idx, 1);\n // Also clear the certificateName field of any listeners who are using this certificate\n this.listeners.forEach((lis) => {\n if (lis.sslConfiguration && lis.sslConfiguration.certificateName === cert.certificateName) {\n lis.sslConfiguration.certificateName = undefined;\n }\n });\n }\n\n public addCert() {\n const nameSuffix: number = this.certificates.length + 1;\n const name: string = 'certificate' + nameSuffix;\n this.$scope.prevCertNames.push(name);\n this.certificates.push(this.oracleLoadBalancerTransformer.constructNewCertificateTemplate(name));\n }\n\n public certNameChanged(idx: number) {\n const prevName = this.$scope.prevCertNames && this.$scope.prevCertNames[idx];\n if (prevName && prevName !== this.certificates[idx].certificateName) {\n this.listeners\n .filter((lis) => lis.sslConfiguration && lis.sslConfiguration.certificateName === prevName)\n .forEach((lis) => {\n lis.sslConfiguration.certificateName = this.certificates[idx].certificateName;\n });\n }\n }\n\n public submit() {\n const descriptor = this.isNew ? 'Create' : 'Update';\n\n this.$scope.taskMonitor.submit(() => {\n const params = {\n cloudProvider: 'oracle',\n application: this.application.name,\n clusterName: this.$scope.loadBalancerCmd.clusterName,\n resourceGroupName: this.$scope.loadBalancerCmd.clusterName,\n loadBalancerName: this.$scope.loadBalancerCmd.name,\n loadBalancerId: null as string,\n };\n if (this.loadBalancer && this.loadBalancer.id) {\n params.loadBalancerId = this.loadBalancer.id;\n }\n\n if (this.selectedVnet) {\n this.$scope.loadBalancerCmd.vpcId = this.selectedVnet.id;\n }\n\n if (this.selectedSubnets && this.selectedSubnets.length > 0) {\n this.$scope.loadBalancerCmd.subnetIds = this.selectedSubnets.map((subnet: IOracleSubnet) => {\n return subnet.id;\n });\n\n for (const subnet of this.selectedSubnets) {\n if (!this.$scope.loadBalancerCmd.subnetTypeMap) {\n this.$scope.loadBalancerCmd.subnetTypeMap = {\n [subnet.id]: !subnet.availabilityDomain ? 'Regional' : 'AD',\n };\n } else {\n this.$scope.loadBalancerCmd.subnetTypeMap[subnet.id] = !subnet.availabilityDomain ? 'Regional' : 'AD';\n }\n }\n }\n\n if (this.backendSets) {\n this.$scope.loadBalancerCmd.backendSets = this.backendSets.reduce(\n (backendSetsMap: { [name: string]: IOracleBackEndSet }, backendSet: IOracleBackEndSet) => {\n backendSetsMap[backendSet.name] = backendSet;\n return backendSetsMap;\n },\n {},\n );\n }\n\n if (this.listeners) {\n this.$scope.loadBalancerCmd.listeners = this.listeners.reduce(\n (listenersMap: { [name: string]: IOracleListener }, listener: IOracleListener) => {\n listener.name = listener.protocol + '_' + listener.port;\n listenersMap[listener.name] = listener;\n return listenersMap;\n },\n {},\n );\n }\n\n if (this.certificates) {\n this.$scope.loadBalancerCmd.certificates = this.certificates.reduce(\n (certMap: { [name: string]: IOracleListenerCertificate }, cert: IOracleListenerCertificate) => {\n certMap[cert.certificateName] = cert;\n if (!cert.isNew) {\n // existing certificate sends only the name\n certMap[cert.certificateName].publicCertificate = null;\n }\n return certMap;\n },\n {},\n );\n }\n\n this.$scope.loadBalancerCmd.type = 'upsertLoadBalancer';\n if (!this.$scope.loadBalancerCmd.vnet && !this.$scope.loadBalancerCmd.subnetType) {\n this.$scope.loadBalancerCmd.securityGroups = null;\n }\n\n return LoadBalancerWriter.upsertLoadBalancer(this.$scope.loadBalancerCmd, this.application, descriptor, params);\n });\n }\n\n public cancel() {\n this.$uibModalInstance.dismiss();\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_CREATE_CONTROLLER = 'spinnaker.oracle.loadBalancer.create.controller';\nmodule(ORACLE_LOAD_BALANCER_CREATE_CONTROLLER, [\n ANGULAR_UI_BOOTSTRAP as any,\n UIROUTER_ANGULARJS,\n ORACLE_LOAD_BALANCER_TRANSFORMER,\n]).controller('oracleCreateLoadBalancerCtrl', OracleLoadBalancerController);\n","import type { StateService } from '@uirouter/angularjs';\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport angular, { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport { sortBy } from 'lodash';\n\nimport type { Application, ISecurityGroup, LoadBalancerReader, SecurityGroupReader } from '@spinnaker/core';\nimport { ConfirmationModalService, FirewallLabels, LoadBalancerWriter } from '@spinnaker/core';\n\nimport { OracleLoadBalancerController } from '../configure/createLoadBalancer.controller';\nimport type { ILoadBalancerDetails, IOracleLoadBalancer } from '../../domain/IOracleLoadBalancer';\n\nexport class OracleLoadBalancerDetailController implements IController {\n public static $inject = [\n '$scope',\n '$state',\n '$uibModal',\n 'loadBalancer',\n 'app',\n 'securityGroupReader',\n 'loadBalancerReader',\n '$q',\n ];\n constructor(\n private $scope: ng.IScope,\n private $state: StateService,\n private $uibModal: IModalService,\n private loadBalancer: ILoadBalancerDetails,\n private app: Application,\n private securityGroupReader: SecurityGroupReader,\n private loadBalancerReader: LoadBalancerReader,\n private $q: angular.IQService,\n ) {\n $scope.state = {\n loading: true,\n };\n $scope.firewallsLabel = FirewallLabels.get('Firewalls');\n\n const extractLoadBalancer = (): PromiseLike<any> => {\n $scope.loadBalancer = app.loadBalancers.data.filter((test: IOracleLoadBalancer) => {\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 = this.loadBalancerReader.getLoadBalancerDetails(\n $scope.loadBalancer.cloudProvider,\n loadBalancer.accountId,\n loadBalancer.region,\n loadBalancer.name,\n );\n\n return detailsLoader.then((details) => {\n // ILoadBalancerSourceData\n $scope.state.loading = false;\n const securityGroups: ISecurityGroup[] = [];\n\n const filtered = details.filter((test: IOracleLoadBalancer) => {\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((securityGroupId: string) => {\n const match = this.securityGroupReader.getApplicationSecurityGroup(\n this.app,\n loadBalancer.accountId,\n loadBalancer.region,\n securityGroupId,\n );\n if (match) {\n securityGroups.push(match);\n }\n });\n this.$scope.securityGroups = sortBy(securityGroups, 'name');\n }\n }\n });\n }\n if (!this.$scope.loadBalancer) {\n this.$state.go('^');\n }\n\n return this.$q.when(null);\n };\n\n this.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 (!this.$scope.$$destroyed) {\n this.app.onRefresh($scope, extractLoadBalancer);\n }\n });\n }\n\n public editLoadBalancer() {\n this.$uibModal.open({\n templateUrl: require('../configure/editLoadBalancer.html'),\n controller: OracleLoadBalancerController,\n controllerAs: 'ctrl',\n size: 'lg',\n resolve: {\n application: () => {\n return this.app;\n },\n loadBalancer: () => {\n return angular.copy(this.$scope.loadBalancer);\n },\n isNew: () => {\n return false;\n },\n },\n });\n }\n\n public deleteLoadBalancer() {\n if (this.$scope.loadBalancer.instances && this.$scope.loadBalancer.instances.length) {\n return;\n }\n\n const taskMonitor = {\n application: this.app,\n title: 'Deleting ' + this.loadBalancer.name,\n };\n\n const command = {\n cloudProvider: 'oracle',\n loadBalancerName: this.$scope.loadBalancer.name,\n credentials: this.$scope.loadBalancer.account,\n region: this.loadBalancer.region,\n application: this.app.name,\n loadBalancerId: this.$scope.loadBalancer.id,\n };\n\n const submitMethod = () => LoadBalancerWriter.deleteLoadBalancer(command, this.app);\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + this.loadBalancer.name + '?',\n buttonText: 'Delete ' + this.loadBalancer.name,\n account: this.loadBalancer.accountId,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n }\n}\n\nexport const ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER = 'spinnaker.oracle.loadBalancerDetail.controller';\nmodule(ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP as any]).controller(\n 'oracleLoadBalancerDetailCtrl',\n OracleLoadBalancerDetailController,\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { EXECUTION_DETAILS_SECTION_SERVICE, SETTINGS } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.oracle.pipeline.stage.bake.executionDetails.controller';\nexport const name = ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [\n EXECUTION_DETAILS_SECTION_SERVICE,\n UIROUTER_ANGULARJS,\n]).controller('oracleBakeExecutionDetailsCtrl', [\n '$log',\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($log, $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 || 'oracle';\n $scope.roscoMode = SETTINGS.feature.roscoMode;\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","'use strict';\n\nimport { module } from 'angular';\nimport { size } from 'lodash';\n\nimport {\n AccountService,\n AuthenticationService,\n BakeExecutionLabel,\n BakeryReader,\n PipelineTemplates,\n Registry,\n} from '@spinnaker/core';\n\nimport { ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\n\nexport const ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE = 'spinnaker.oracle.pipeline.stage.bakeStage';\nexport const name = ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE, [ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'oracle',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n supportsCustomTimeout: true,\n validators: [\n { type: 'requiredField', fieldName: 'accountName' },\n { type: 'requiredField', fieldName: 'region' },\n { type: 'requiredField', fieldName: 'baseOs' },\n { type: 'requiredField', fieldName: 'upgrade' },\n { type: 'requiredField', fieldName: 'cloudProviderType' },\n { type: 'requiredField', fieldName: 'amiName', fieldLabel: 'Image Name' },\n ],\n restartable: true,\n });\n })\n .controller('oracleBakeStageCtrl', [\n '$scope',\n '$q',\n '$uibModal',\n function ($scope, $q, $uibModal) {\n const provider = 'oracle';\n\n if (!$scope.stage.cloudProvider) {\n $scope.stage.cloudProvider = provider;\n }\n\n if (!$scope.stage) {\n $scope.stage = {};\n }\n\n $scope.stage.extendedAttributes = $scope.stage.extendedAttributes || {};\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n function initialize() {\n $scope.viewState.providerSelected = true;\n\n $q.all([BakeryReader.getBaseOsOptions(provider), AccountService.listAccounts(provider)]).then(\n ([baseOsOptions, accounts]) => {\n if (baseOsOptions.baseImages.length > 0) {\n $scope.baseOsOptions = baseOsOptions;\n if (!$scope.stage.baseOs) {\n $scope.stage.baseOs = $scope.baseOsOptions.baseImages[0].id;\n }\n }\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n if (!$scope.stage.upgrade) {\n $scope.stage.upgrade = true;\n }\n\n $scope.accounts = accounts;\n\n if ($scope.stage.accountName) {\n AccountService.getRegionsForAccount($scope.stage.accountName).then(function (regions) {\n if (Array.isArray(regions) && regions.length != 0) {\n // there is exactly one region per account\n $scope.stage.region = regions[0].name;\n }\n });\n }\n\n $scope.viewState.loading = false;\n },\n );\n }\n\n this.getBaseOsDescription = function (baseOsOption) {\n return baseOsOption.id + (baseOsOption.shortDescription ? ' (' + baseOsOption.shortDescription + ')' : '');\n };\n\n this.accountUpdated = function () {\n AccountService.getRegionsForAccount($scope.stage.accountName).then(function (regions) {\n if (Array.isArray(regions) && regions.length != 0) {\n // there is exactly one region per account\n $scope.stage.region = regions[0].name;\n }\n });\n };\n\n this.addExtendedAttribute = function () {\n if (!$scope.stage.extendedAttributes) {\n $scope.stage.extendedAttributes = {};\n }\n $uibModal\n .open({\n templateUrl: PipelineTemplates.addExtendedAttributes,\n controller: 'bakeStageAddExtendedAttributeController',\n controllerAs: 'addExtendedAttribute',\n resolve: {\n extendedAttribute: function () {\n return {\n key: '',\n value: '',\n };\n },\n },\n })\n .result.then(function (extendedAttribute) {\n $scope.stage.extendedAttributes[extendedAttribute.key] = extendedAttribute.value;\n })\n .catch(() => {});\n };\n\n this.removeExtendedAttribute = function (key) {\n delete $scope.stage.extendedAttributes[key];\n };\n\n this.showExtendedAttributes = function () {\n return (\n $scope.viewState.roscoMode || ($scope.stage.extendedAttributes && size($scope.stage.extendedAttributes) > 0)\n );\n };\n\n $scope.$watch('stage.accountName', $scope.accountUpdated);\n\n initialize();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE = 'spinnaker.oracle.pipeline.stage.destroyAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n cloudProvider: 'oracle',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\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('oracleDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n const provider = 'oracle';\n\n $scope.targets = StageConstants.TARGET_LIST;\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n init();\n\n function init() {\n AccountService.listAccounts(provider).then((accounts) => {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE = 'spinnaker.oracle.pipeline.stage.disableAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n cloudProvider: 'oracle',\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('oracleDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n const provider = 'oracle';\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then((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 = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport * as angular from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE = 'spinnaker.oracle.pipeline.stage.findAmiStage';\nexport const name = ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE; // for backwards compatibility\nangular\n .module(ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImage',\n cloudProvider: 'oracle',\n templateUrl: require('./findAmiStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'selectionStrategy', fieldLabel: 'Server Group Selection' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials' },\n ],\n });\n })\n .controller('oracleFindAmiStageCtrl', [\n '$scope',\n ($scope) => {\n const provider = 'oracle';\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then((accounts) => {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.selectionStrategies = [\n {\n label: 'Largest',\n val: 'LARGEST',\n description: 'When multiple server groups exist, prefer the server group with the most instances',\n },\n {\n label: 'Newest',\n val: 'NEWEST',\n description: 'When multiple server groups exist, prefer the newest',\n },\n {\n label: 'Oldest',\n val: 'OLDEST',\n description: 'When multiple server groups exist, prefer the oldest',\n },\n {\n label: 'Fail',\n val: 'FAIL',\n description: 'When multiple server groups exist, fail',\n },\n ];\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n stage.selectionStrategy = stage.selectionStrategy || $scope.selectionStrategies[0].val;\n\n if (angular.isUndefined(stage.onlyEnabled)) {\n stage.onlyEnabled = true;\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { BakeryReader, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE =\n 'spinnaker.oracle.pipeline.stage.findImageFromTagsStage';\nexport const name = ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'oracle',\n templateUrl: require('./findImageFromTagsStage.html'),\n executionDetailsUrl: require('./findImageFromTagsExecutionDetails.html'),\n executionConfigSections: ['findImageConfig', 'taskStatus'],\n validators: [\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'packageName' },\n ],\n });\n })\n .controller('oracleFindImageFromTagsStageCtrl', [\n '$scope',\n function ($scope) {\n $scope.stage.packageName = $scope.stage.packageName || '*';\n $scope.stage.tags = $scope.stage.tags || {};\n $scope.stage.regions = $scope.stage.regions || [];\n $scope.stage.cloudProvider = $scope.stage.cloudProvider || 'oracle';\n\n BakeryReader.getRegions('oracle').then(function (regions) {\n $scope.regions = regions;\n });\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE = 'spinnaker.oracle.pipeline.stage.resizeAsgStage';\nexport const name = ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n cloudProvider: 'oracle',\n templateUrl: require('./resizeAsgStage.html'),\n executionStepLabelUrl: require('./resizeAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize 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: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('oracleResizeAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const provider = 'oracle';\n\n const stage = $scope.stage;\n\n $scope.viewState = {\n accountsLoaded: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then(function (accounts) {\n $scope.accounts = accounts;\n $scope.viewState.accountsLoaded = true;\n });\n\n $scope.resizeTargets = StageConstants.TARGET_LIST;\n\n $scope.scaleActions = [\n { label: 'Scale Up', val: 'scale_up' },\n { label: 'Scale Down', val: 'scale_down' },\n { label: 'Scale to Cluster Size', val: 'scale_to_cluster' },\n { label: 'Scale to Exact Size', val: 'scale_exact' },\n ];\n\n $scope.resizeTypes = [\n { label: 'Percentage', val: 'pct' },\n { label: 'Incremental', val: 'incr' },\n ];\n\n stage.capacity = stage.capacity || {};\n stage.regions = stage.regions || [];\n stage.target = stage.target || $scope.resizeTargets[0].val;\n stage.action = stage.action || $scope.scaleActions[0].val;\n stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;\n\n if (!stage.action && stage.resizeType === 'exact') {\n stage.action = 'scale_exact';\n }\n\n stage.cloudProvider = provider;\n stage.cloudProviderType = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.gce) {\n stage.credentials = $scope.application.defaultCredentials.gce;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.gce);\n }\n\n ctrl.updateResizeType = function () {\n if (stage.action === 'scale_exact') {\n stage.resizeType = 'exact';\n delete stage.scalePct;\n delete stage.scaleNum;\n } else {\n stage.capacity = {};\n if (stage.resizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n stage.resizeType = 'incr';\n delete stage.scalePct;\n stage.scaleNum = stage.scaleNum || 0;\n }\n }\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE =\n 'spinnaker.oracle.pipeline.stage.scaleDownClusterStage';\nexport const name = ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'oracle',\n templateUrl: require('./scaleDownClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n })\n .controller('oracleScaleDownClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n const provider = 'oracle';\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts(provider).then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = provider;\n\n if (!stage.credentials && $scope.application.defaultCredentials.gce) {\n stage.credentials = $scope.application.defaultCredentials.gce;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.gce) {\n stage.regions.push($scope.application.defaultRegions.gce);\n }\n\n if (stage.remainingFullSizeServerGroups === undefined) {\n stage.remainingFullSizeServerGroups = 1;\n }\n\n if (stage.allowScaleDownActive === undefined) {\n stage.allowScaleDownActive = false;\n }\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n\n this.pluralize = function (str, val) {\n return val === 1 ? str : str + 's';\n };\n\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE =\n 'spinnaker.core.pipeline.stage.oracle.shrinkClusterStage';\nexport const name = ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE; // for backwards compatibility\nmodule(ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'oracle',\n templateUrl: require('./shrinkClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('oracleShrinkClusterStageCtrl', [\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('oracle').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n\n stage.cloudProvider = 'oracle';\n\n if (!stage.credentials && $scope.application.defaultCredentials.oracle) {\n stage.credentials = $scope.application.defaultCredentials.oracle;\n }\n\n if (!stage.regions.length && $scope.application.defaultRegions.oracle) {\n stage.regions.push($scope.application.defaultRegions.oracle);\n }\n\n if (stage.shrinkToSize === undefined) {\n stage.shrinkToSize = 1;\n }\n\n if (stage.allowDeleteActive === undefined) {\n stage.allowDeleteActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n return val === 1 ? str : str + 's';\n };\n\n if (stage.retainLargerOverNewer === undefined) {\n stage.retainLargerOverNewer = 'false';\n }\n\n stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { FirewallLabels } from '@spinnaker/core';\n\nexport const ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER =\n 'spinnaker.oracle.securityGroup.create.controller';\nexport const name = ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER, []).controller('oracleCreateSecurityGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n function ($scope, $uibModalInstance) {\n this.cancel = () => {\n $uibModalInstance.dismiss();\n };\n $scope.firewallLabel = FirewallLabels.get('Firewall');\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ORACLE_SECURITYGROUP_SECURITYGROUP_READER = 'spinnaker.oracle.securityGroup.reader';\nexport const name = ORACLE_SECURITYGROUP_SECURITYGROUP_READER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_SECURITYGROUP_READER, []).factory('oracleSecurityGroupReader', function () {\n function resolveIndexedSecurityGroup(indexedSecurityGroups, container, securityGroupId) {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n\n return {\n resolveIndexedSecurityGroup: resolveIndexedSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { NetworkReader } from '@spinnaker/core';\n\nexport const ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.oracle.securityGroup.transformer';\nexport const name = ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('oracleSecurityGroupTransformer', function () {\n const provider = 'oracle';\n\n function normalizeSecurityGroup(securityGroup) {\n return NetworkReader.listNetworksByProvider(provider).then(_.partial(addVcnNameToSecurityGroup, securityGroup));\n }\n\n function addVcnNameToSecurityGroup(securityGroup, vcns) {\n const matches = vcns.find((vcn) => vcn.id === securityGroup.network);\n securityGroup.vpcName = matches.length ? matches[0].name : '';\n }\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, NetworkReader, SECURITY_GROUP_READER, SubnetReader } from '@spinnaker/core';\nimport { OracleProviderSettings } from '../../oracle.settings';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE =\n 'spinnaker.oracle.serverGroup.configure.configuration.service';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE, [SECURITY_GROUP_READER]).factory(\n 'oracleServerGroupConfigurationService',\n [\n '$q',\n 'oracleImageReader',\n 'securityGroupReader',\n function ($q, oracleImageReader, securityGroupReader) {\n const oracle = 'oracle';\n\n const getShapes = (image) => {\n if (!image || !image.compatibleShapes) {\n return [];\n }\n return image.compatibleShapes.map((shape) => {\n return { name: shape };\n });\n };\n\n const loadAndSelectRegions = (command, backingData) => {\n if (command.account) {\n const selectedAccountDetails = backingData.credentialsKeyedByAccount[command.account];\n if (!selectedAccountDetails) {\n return;\n }\n backingData.filtered.regions = _.map(selectedAccountDetails.regions, (region) => {\n return { name: region.name };\n });\n if (selectedAccountDetails) {\n command.region = selectedAccountDetails.region;\n }\n }\n };\n\n const loadAvailabilityDomains = (command) => {\n if (command.account && command.region) {\n AccountService.getAvailabilityZonesForAccountAndRegion(oracle, command.account, command.region).then(\n (availDoms) => {\n if (availDoms) {\n command.backingData.filtered.availabilityDomains = availDoms.map((av) => {\n return { name: av };\n });\n } else {\n command.backingData.filtered.availabilityDomains = [];\n command.availabilityDomain = null;\n }\n },\n );\n }\n };\n\n const loadLoadBalancers = (command) => {\n if (command.account && command.region) {\n command.backingData.filtered.loadBalancers = command.backingData.loadBalancers.filter(function (lb) {\n return lb.region === command.region && lb.account === command.account;\n });\n }\n };\n\n function configureCommand(application, command) {\n const defaults = command || {};\n const defaultCredentials =\n defaults.account || application.defaultCredentials.oracle || OracleProviderSettings.defaults.account;\n const defaultRegion =\n defaults.region || application.defaultRegions.oracle || OracleProviderSettings.defaults.region;\n\n return $q\n .all([\n AccountService.getCredentialsKeyedByAccount(oracle),\n NetworkReader.listNetworksByProvider(oracle),\n SubnetReader.listSubnetsByProvider(oracle),\n securityGroupReader.getAllSecurityGroups(),\n loadImages(),\n AccountService.getAvailabilityZonesForAccountAndRegion(oracle, defaultCredentials, defaultRegion),\n ])\n .then(function ([credentialsKeyedByAccount, networks, subnets, securityGroups, images, availDomains]) {\n const backingData = {\n credentialsKeyedByAccount,\n networks,\n subnets,\n securityGroups,\n images,\n availDomains,\n };\n\n backingData.accounts = _.keys(backingData.credentialsKeyedByAccount);\n backingData.filtered = {};\n loadAndSelectRegions(command, backingData);\n backingData.filtered.availabilityDomains = _.map(backingData.availDomains, function (zone) {\n return { name: zone };\n });\n\n backingData.filterSubnets = function () {\n if (command.vpcId && command.availabilityDomain) {\n return _.filter(backingData.subnets, {\n vcnId: command.vpcId,\n availabilityDomain: command.availabilityDomain,\n });\n }\n return backingData.subnets;\n };\n\n backingData.loadBalancers = application.loadBalancers.data;\n\n backingData.accountOnChange = function () {\n loadAndSelectRegions(command, command.backingData);\n loadAvailabilityDomains(command);\n loadLoadBalancers(command);\n };\n\n backingData.regionOnChange = function () {\n loadAvailabilityDomains(command);\n loadLoadBalancers(command);\n };\n\n backingData.availabilityDomainOnChange = function () {\n command.subnetId = null;\n backingData.seclists = null;\n };\n\n backingData.vpcOnChange = function () {\n command.subnetId = null;\n backingData.seclists = null;\n };\n\n backingData.subnetOnChange = function () {\n const subnet = _.find(backingData.subnets, { id: command.subnetId });\n const mySecGroups = backingData.securityGroups[command.account][oracle][command.region];\n const secLists = [];\n _.forEach(subnet.securityListIds, function (sid) {\n const sgRef = _.find(mySecGroups, { id: sid });\n securityGroupReader\n .getSecurityGroupDetails(\n command.application,\n command.account,\n oracle,\n command.region,\n command.vpcId,\n sgRef.name,\n )\n .then(function (sgd) {\n secLists.push(sgd);\n backingData.seclists = secLists;\n });\n });\n };\n\n backingData.findBackendSetsByLoadBalancerId = (loadBalancerId) => {\n const lb = backingData.filtered.loadBalancers.find((lb) => lb.id === loadBalancerId);\n if (lb && lb.backendSets) {\n //reduce the backendSets object to an array. The object is keyed by the backendSet name\n const bsetArray = [];\n Object.keys(lb.backendSets).reduce((arr, bsetName) => {\n const bset = lb.backendSets[bsetName];\n bset['name'] = bsetName;\n arr.push(bset);\n return arr;\n }, bsetArray);\n return bsetArray;\n } else {\n return [];\n }\n };\n\n backingData.findLoadBalListenersByBackendSetName = (loadBalancerId, backendSetName) => {\n const lb = backingData.filtered.loadBalancers.find((lb) => lb.id === loadBalancerId);\n if (lb && lb.listeners) {\n return Object.keys(lb.listeners)\n .filter((lisName) => lb.listeners[lisName].defaultBackendSetName === backendSetName)\n .map((lisName) => lb.listeners[lisName]);\n } else {\n return [];\n }\n };\n\n backingData.loadBalancerOnChange = () => {\n if (command.loadBalancerId) {\n backingData.filtered.backendSets = backingData.findBackendSetsByLoadBalancerId(command.loadBalancerId);\n } else {\n //no backend set name should be set if no load balancer id is set\n command.backendSetName = undefined;\n backingData.backendSetOnChange();\n backingData.filtered.backendSets = [];\n }\n };\n\n backingData.backendSetOnChange = () => {\n backingData.filtered.listeners =\n command.loadBalancerId && command.backendSetName\n ? backingData.findLoadBalListenersByBackendSetName(command.loadBalancerId, command.backendSetName)\n : [];\n };\n\n backingData.filtered.images = backingData.images;\n const shapesMap = {};\n _.forEach(backingData.filtered.images, (image) => {\n shapesMap[image.id] = getShapes(image);\n });\n backingData.filtered.shapes = shapesMap;\n backingData.filtered.allShapes = _.uniqBy(_.flatten(_.values(shapesMap)), 'name');\n command.backingData = backingData;\n if (command.account) {\n loadLoadBalancers(command);\n backingData.loadBalancerOnChange();\n backingData.backendSetOnChange();\n }\n });\n }\n\n function loadImages() {\n return oracleImageReader.findImages({ provider: oracle });\n }\n\n return {\n configureCommand: configureCommand,\n };\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 } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER =\n 'spinnaker.oracle.serverGroup.configure.wizard.basicSettings.controller';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n IMAGE_READER,\n ])\n .controller('oracleServerGroupBasicSettingsCtrl', [\n '$scope',\n '$state',\n '$uibModalStack',\n '$controller',\n 'imageReader',\n function ($scope, $state, $uibModalStack, $controller, imageReader) {\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n imageReader: imageReader,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n },\n ]);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT =\n 'spinnaker.oracle.serverGroup.configure.wizard.capacity.selector.component';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT, [])\n .component('oracleServerGroupCapacitySelector', {\n templateUrl: require('./capacitySelector.component.html'),\n bindings: {\n command: '=',\n },\n controllerAs: 'vm',\n controller: angular.noop,\n });\n","import { module } from 'angular';\n\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE } from './serverGroupConfiguration.service';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER } from './wizard/basicSettings/basicSettings.controller';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT } from './wizard/capacity/capacitySelector.component';\n\n('use strict');\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE = 'spinnaker.oracle.serverGroup.configure';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE, [\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER,\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE,\n]);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { NameUtils } from '@spinnaker/core';\n\nimport { OracleProviderSettings } from '../../oracle.settings';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.oracle.serverGroupCommandBuilder.service';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [])\n .factory('oracleServerGroupCommandBuilder', [\n '$q',\n function ($q) {\n const oracle = 'oracle';\n\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n\n const defaultAccount = defaults.account || OracleProviderSettings.defaults.account;\n const defaultRegion = defaults.region || OracleProviderSettings.defaults.region;\n\n const command = {\n account: defaultAccount,\n application: application.name,\n capacity: {\n desired: 1,\n },\n region: defaultRegion,\n selectedProvider: oracle,\n viewState: {\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n },\n };\n\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode) {\n mode = mode || 'clone';\n const serverGroupName = NameUtils.parseServerGroupName(serverGroup.name);\n\n const command = {\n account: serverGroup.account,\n application: application.name,\n shape: serverGroup.launchConfig.shape,\n strategy: '',\n stack: serverGroupName.stack,\n vpcId: serverGroup.launchConfig.vpcId,\n subnetId: serverGroup.launchConfig.subnetId,\n region: serverGroup.region,\n availabilityDomain: serverGroup.launchConfig.availabilityDomain,\n sshAuthorizedKeys: serverGroup.launchConfig.sshAuthorizedKeys,\n selectedProvider: oracle,\n capacity: {\n desired: serverGroup.capacity.desired,\n },\n viewState: {\n mode: mode,\n disableStrategySelection: true,\n },\n };\n return $q.when(command);\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const commandDefaults = { account: pipelineCluster.account, region: pipelineCluster.region };\n return buildNewServerGroupCommand(application, commandDefaults).then((command) => {\n const viewState = {\n disableImageSelection: true,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n };\n\n const viewOverrides = {\n viewState: viewState,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n return angular.extend({}, command, pipelineCluster, viewOverrides);\n });\n }\n\n function buildNewServerGroupCommandForPipeline() {\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n },\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { FirewallLabels, ModalWizard, TaskMonitor } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.configure.cloneServerGroup';\nexport const name = ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'oracleCloneServerGroupCtrl',\n [\n '$scope',\n '$uibModalInstance',\n '$q',\n 'application',\n 'serverGroupWriter',\n 'serverGroupCommand',\n 'oracleServerGroupConfigurationService',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n application,\n serverGroupWriter,\n serverGroupCommand,\n oracleServerGroupConfigurationService,\n title,\n ) {\n $scope.title = title;\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n $scope.command = serverGroupCommand;\n $scope.application = application;\n\n $scope.pages = {\n basicSettings: require('./basicSettings/basicSettings.html'),\n instanceType: require('./instanceType/instanceType.html'),\n capacity: require('./capacity/capacity.html'),\n loadBalancers: require('./loadBalancers/loadBalancers.html'),\n networkSettings: require('./network/networkSettings.html'),\n templateSelection: require('./templateSelection/templateSelection.html'),\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 };\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 $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n });\n\n function configureCommand() {\n oracleServerGroupConfigurationService.configureCommand(application, serverGroupCommand).then(function () {\n $scope.state.loaded = true;\n });\n }\n\n this.isValid = function () {\n return $scope.command && $scope.form.$valid && ModalWizard.isComplete();\n };\n\n this.showSubmitButton = function () {\n return ModalWizard.allPagesVisited();\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\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 configureCommand();\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n },\n ],\n);\n","'use strict';\n\nimport * as angular from 'angular';\n\nexport const ORACLE_COMMON_FOOTER_COMPONENT = 'spinnaker.oracle.footer.component';\nexport const name = ORACLE_COMMON_FOOTER_COMPONENT; // for backwards compatibility\nangular.module(ORACLE_COMMON_FOOTER_COMPONENT, []).component('oracleFooter', {\n templateUrl: require('./footer.component.html'),\n bindings: {\n action: '&',\n isValid: '&',\n cancel: '&',\n account: '=?',\n verification: '=?',\n },\n controllerAs: 'vm',\n controller: angular.noop,\n});\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { SERVER_GROUP_WRITER } from '@spinnaker/core';\n\nexport const ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT =\n 'spinnaker.oracle.serverGroup.details.resize.capacity.component';\nexport const name = ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT; // for backwards compatibility\nangular\n .module(ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT, [SERVER_GROUP_WRITER])\n .component('oracleResizeCapacity', {\n bindings: {\n command: '=',\n application: '=',\n serverGroup: '=',\n formMethods: '=',\n },\n templateUrl: require('./resizeCapacity.component.html'),\n controller: [\n '$scope',\n 'serverGroupWriter',\n function ($scope, serverGroupWriter) {\n this.command.newSize = null;\n\n angular.extend(this.formMethods, {\n formIsValid: () => _.every([this.command.newSize !== null, $scope.resizeCapacityForm.$valid]),\n submitMethod: () => {\n return serverGroupWriter.resizeServerGroup(this.serverGroup, this.application, {\n capacity: { min: this.command.newSize, max: this.command.newSize, desired: this.command.newSize },\n serverGroupName: this.serverGroup.name,\n targetSize: this.command.newSize,\n region: this.serverGroup.region,\n interestingHealthProviderNames: this.command.interestingHealthProviderNames,\n reason: this.command.reason,\n });\n },\n });\n },\n ],\n });\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { TaskMonitor } from '@spinnaker/core';\nimport { ORACLE_COMMON_FOOTER_COMPONENT } from '../../../common/footer.component';\n\nimport { ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT } from './resizeCapacity.component';\n\nexport const ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.resize.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER, [\n ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT,\n ORACLE_COMMON_FOOTER_COMPONENT,\n]).controller('oracleResizeServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'application',\n 'serverGroup',\n function ($scope, $uibModalInstance, application, serverGroup) {\n $scope.serverGroup = serverGroup;\n $scope.application = application;\n $scope.verification = {};\n $scope.command = {};\n $scope.formMethods = {};\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Oracle'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n if (!$scope.verification.verified) {\n return false;\n }\n return $scope.formMethods.formIsValid();\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Resizing ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.resize = function () {\n this.submitting = true;\n if (!this.isValid()) {\n return;\n }\n\n $scope.taskMonitor.submit($scope.formMethods.submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\nimport { ORACLE_COMMON_FOOTER_COMPONENT } from '../../../common/footer.component';\n\nexport const ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.rollback.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER, [\n SERVER_GROUP_WRITER,\n ORACLE_COMMON_FOOTER_COMPONENT,\n]).controller('oracleRollbackServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n 'disabledServerGroups',\n function ($scope, $uibModalInstance, serverGroupWriter, application, serverGroup, disabledServerGroups) {\n $scope.serverGroup = serverGroup;\n $scope.disabledServerGroups = disabledServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.verification = {};\n\n $scope.command = {\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n },\n };\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Oracle'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n\n return command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Rollback ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.rollback = function () {\n this.submitting = true;\n if (!this.isValid()) {\n return;\n }\n\n const submitMethod = function () {\n return serverGroupWriter.rollbackServerGroup(serverGroup, application, $scope.command);\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport {\n ConfirmationModalService,\n NetworkReader,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n SubnetReader,\n} from '@spinnaker/core';\n\nimport { ORACLE_IMAGE_IMAGE_READER } from '../../image/image.reader';\nimport { ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER } from './resize/resizeServerGroup.controller';\nimport { ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER } from './rollback/rollbackServerGroup.controller';\n\nexport const ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER =\n 'spinnaker.oracle.serverGroup.details.controller';\nexport const name = ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SERVER_GROUP_WRITER,\n ORACLE_IMAGE_IMAGE_READER,\n ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER,\n ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER,\n]).controller('oracleServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n '$uibModal',\n 'app',\n 'serverGroup',\n 'serverGroupWriter',\n 'oracleImageReader',\n function ($scope, $state, $uibModal, app, serverGroup, serverGroupWriter, oracleImageReader) {\n const provider = 'oracle';\n\n this.application = app;\n this.serverGroup = serverGroup;\n\n this.state = {\n loading: true,\n };\n\n /////////////////////////////////////////////////////////\n // Fetch data\n /////////////////////////////////////////////////////////\n\n const retrieveServerGroup = () => {\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then((details) => {\n cancelLoader();\n details.account = serverGroup.accountId;\n this.serverGroup = details;\n retrieveNetwork();\n retrieveSubnet();\n retrieveImage();\n });\n };\n\n const retrieveNetwork = () => {\n NetworkReader.listNetworksByProvider(provider).then((networks) => {\n this.serverGroup.network = _.chain(networks)\n .filter({ account: this.serverGroup.account, id: this.serverGroup.launchConfig.vpcId })\n .head()\n .value();\n });\n };\n\n const retrieveSubnet = () => {\n SubnetReader.getSubnetByIdAndProvider(this.serverGroup.launchConfig.subnetId, provider).then((subnet) => {\n this.serverGroup.subnet = subnet;\n });\n };\n\n const retrieveImage = () => {\n oracleImageReader\n .getImage(this.serverGroup.launchConfig.imageId, this.serverGroup.region, this.serverGroup.account)\n .then((image) => {\n if (!image) {\n image = { id: this.serverGroup.launchConfig.imageId, name: this.serverGroup.launchConfig.imageId };\n }\n this.serverGroup.image = image;\n });\n };\n\n ////////////////////////////////////////////////////////////\n // Actions. Triggered by server group details dropdown menu\n ////////////////////////////////////////////////////////////\n\n this.destroyServerGroup = function destroyServerGroup() {\n const serverGroup = this.serverGroup;\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 stateParams = {\n name: serverGroup.name,\n account: serverGroup.account,\n region: serverGroup.region,\n };\n\n ConfirmationModalService.confirm({\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.resizeServerGroup = () => {\n $uibModal.open({\n templateUrl: require('./resize/resizeServerGroup.html'),\n controller: 'oracleResizeServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => {\n return this.serverGroup;\n },\n application: () => {\n return app;\n },\n },\n });\n };\n\n this.rollbackServerGroup = () => {\n $uibModal.open({\n templateUrl: require('./rollback/rollbackServerGroup.html'),\n controller: 'oracleRollbackServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => this.serverGroup,\n disabledServerGroups: () => {\n const sgSummary = _.find(app.serverGroups.data, {\n name: this.serverGroup.name,\n account: this.serverGroup.account,\n region: this.serverGroup.region,\n });\n const cluster = _.find(app.clusters, { name: sgSummary.cluster, account: this.serverGroup.account });\n return _.filter(cluster.serverGroups, { isDisabled: true, region: this.serverGroup.region });\n },\n application: () => app,\n },\n });\n };\n\n this.disableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => serverGroupWriter.disableServerGroup(serverGroup, app, params);\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Oracle',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Oracle'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => serverGroupWriter.enableServerGroup(serverGroup, app, params);\n\n const confirmationModalParams = {\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Oracle',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Oracle'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n const cancelLoader = () => {\n this.state.loading = false;\n };\n\n retrieveServerGroup().then(() => {\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport _ from 'lodash';\n\nexport const ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER = 'spinnaker.oracle.serverGroup.transformer';\nexport const name = ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER, []).factory('oracleServerGroupTransformer', [\n '$q',\n function ($q) {\n const PROVIDER = 'oracle';\n\n function normalizeServerGroup(serverGroup) {\n return $q.when(serverGroup);\n }\n\n function convertServerGroupCommandToDeployConfiguration(base) {\n const command = _.defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = PROVIDER;\n return command;\n }\n\n return {\n convertServerGroupCommandToDeployConfiguration,\n normalizeServerGroup,\n };\n },\n]);\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './helpContents/oracleHelpContents';\nimport { ORACLE_IMAGE_IMAGE_READER } from './image/image.reader';\nimport { ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { ORACLE_LOAD_BALANCER_CREATE_CONTROLLER } from './loadBalancer/configure/createLoadBalancer.controller';\nimport { ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER } from './loadBalancer/details/loadBalancerDetail.controller';\nimport { ORACLE_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/loadBalancer.transformer';\nimport { ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE } from './pipeline/stages/bake/ociBakeStage';\nimport { ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE } from './pipeline/stages/destroyAsg/destroyAsgStage';\nimport { ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE } from './pipeline/stages/disableAsg/disableAsgStage';\nimport { ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE } from './pipeline/stages/findAmi/findAmiStage';\nimport { ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE } from './pipeline/stages/findImageFromTags/oracleFindImageFromTagsStage';\nimport { ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE } from './pipeline/stages/resizeAsg/resizeAsgStage';\nimport { ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE } from './pipeline/stages/scaleDownCluster/scaleDownClusterStage';\nimport { ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE } from './pipeline/stages/shrinkCluster/shrinkClusterStage';\nimport { ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER } from './securityGroup/configure/createSecurityGroup.controller';\nimport { ORACLE_SECURITYGROUP_SECURITYGROUP_READER } from './securityGroup/securityGroup.reader';\nimport { ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup/securityGroup.transformer';\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE } from './serverGroup/configure/serverGroup.configure.module';\nimport { ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER } from './serverGroup/configure/wizard/cloneServerGroup.controller';\nimport { ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER } from './serverGroup/details/serverGroupDetails.controller';\nimport { ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\n\nexport const ORACLE_MODULE = 'spinnaker.oracle';\nmodule(ORACLE_MODULE, [\n // Pipeline\n ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE,\n ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE,\n ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE,\n ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE,\n ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE,\n ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE,\n ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE,\n ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE,\n\n // Load Balancers\n ORACLE_LOAD_BALANCER_TRANSFORMER,\n ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER,\n ORACLE_LOAD_BALANCER_CREATE_CONTROLLER,\n\n // Server Groups\n ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE,\n ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER,\n ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER,\n // Images\n ORACLE_IMAGE_IMAGE_READER,\n // Instances\n ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n // Firewalls\n ORACLE_SECURITYGROUP_SECURITYGROUP_READER,\n ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER,\n]).config(function () {\n CloudProviderRegistry.registerProvider('oracle', {\n name: 'Oracle',\n image: {\n reader: 'oracleImageReader',\n },\n loadBalancer: {\n transformer: 'oracleLoadBalancerTransformer',\n detailsTemplateUrl: require('./loadBalancer/details/loadBalancerDetail.html'),\n detailsController: 'oracleLoadBalancerDetailCtrl',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/createLoadBalancer.html'),\n createLoadBalancerController: 'oracleCreateLoadBalancerCtrl',\n },\n serverGroup: {\n transformer: 'oracleServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'oracleServerGroupDetailsCtrl',\n commandBuilder: 'oracleServerGroupCommandBuilder',\n cloneServerGroupController: 'oracleCloneServerGroupCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n configurationService: 'oracleServerGroupConfigurationService',\n },\n instance: {\n detailsController: 'oracleInstanceDetailsCtrl',\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n },\n securityGroup: {\n reader: 'oracleSecurityGroupReader',\n transformer: 'oracleSecurityGroupTransformer',\n createSecurityGroupTemplateUrl: require('./securityGroup/configure/createSecurityGroup.html'),\n createSecurityGroupController: 'oracleCreateSecurityGroupCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('oracle', []);\n"],"names":["key","value","forEach","entry","HelpContentsRegistry","register","ORACLE_IMAGE_IMAGE_READER","module","factory","findImages","params","REST","query","get","catch","getImage","imageId","region","credentials","path","provider","then","results","length","ORACLE_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","UIROUTER_ANGULARJS","controller","$scope","$q","app","instance","application","retrieveInstance","instanceSummary","account","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","name","InstanceReader","getInstanceDetails","instanceDetails","Object","assign","isStandalone","all","ready","$$destroyed","onRefresh","LoadBalancingPolicy","OracleProviderSettings","SETTINGS","providers","oracle","defaults","resetToOriginal","resetProvider","OracleDefaultProviderSettings","ORACLE_LOAD_BALANCER_TRANSFORMER","service","normalizeLoadBalancer","loadBalancer","resolve","convertLoadBalancerForEditing","listeners","keys","lis","isSsl","sslConfiguration","cloudProvider","shape","isPrivate","subnetIds","subnets","map","subnet","certificates","hostnames","backendSets","freeformTags","loadBalancerType","type","securityGroups","vpcId","subnetTypeMap","constructNewLoadBalancerTemplate","defaultCredentials","defaultRegions","constructNewListenerTemplate","port","protocol","defaultBackendSetName","constructNewBackendSetTemplate","policy","ROUND_ROBIN","healthChecker","urlPath","backends","isNew","constructNewSSLConfiguration","certificateName","verifyDepth","verifyPeerCertificates","constructNewCertificateTemplate","publicCertificate","caCertificate","privateKey","passphrase","OracleLoadBalancerController","constructor","$uibModalInstance","$state","oracleLoadBalancerTransformer","this","shapes","loadBalancingPolicies","k","pages","properties","state","accountsLoaded","submitting","numSubnetsAllowed","initializeController","onApplicationRefresh","close","newStateParams","accountId","includes","go","onTaskComplete","loadBalancers","refresh","onNextRefresh","initializeCreateMode","AccountService","listAccounts","accounts","accountUpdated","loadVnets","loadSubnets","initControllerFromLoadBalancerCmd","calcNumSubnetsAllowed","loadBalancerCmd","push","b","nameParts","NameUtils","parseLoadBalancerName","stack","detail","freeFormDetails","prevBackendSetNames","prevCertNames","updateName","updateLoadBalancerNames","taskMonitor","TaskMonitor","title","modalInstance","accountLoadBalancerNamesByRegion","getDataSource","existingLoadBalancerNames","validateBeforeSubmit","propertiesValid","listenersValid","listenersUniqueProtocolPort","listenersBackendSetsExist","listenersCertificatesExist","selectedSubnets","countsMap","reduce","counts","listener","protocolPort","filter","find","backendSet","cert","getName","lb","lbName","join","trimEnd","loadRegionsForAccount","regionUpdated","updateVnets","getRegionsForAccount","regions","NetworkReader","listNetworksByProvider","vnets","allVnets","SubnetReader","listSubnetsByProvider","allSubnets","filteredVnets","vnet","updateSubnets","network","filteredSubnets","vcnId","filteredSubnetsByType","cloneDeep","selectedVnetChanged","selectedVnet","selectedSubnetsChanged","selectedSubnet","availabilityDomain","selectedSubnetRemoved","isPrivateChanged","listenerIsSslChanged","getSubnetLimit","removeListener","idx","splice","addListener","removeBackendSet","isBackendSetRemovable","hasListener","addBackendSet","backendSetNameChanged","prevName","isCertRemovable","removeCert","addCert","certNameChanged","submit","descriptor","clusterName","resourceGroupName","loadBalancerName","loadBalancerId","backendSetsMap","listenersMap","certMap","subnetType","LoadBalancerWriter","upsertLoadBalancer","cancel","dismiss","$inject","ORACLE_LOAD_BALANCER_CREATE_CONTROLLER","ANGULAR_UI_BOOTSTRAP","OracleLoadBalancerDetailController","$uibModal","securityGroupReader","loadBalancerReader","loading","firewallsLabel","FirewallLabels","extractLoadBalancer","test","getLoadBalancerDetails","details","filtered","elb","securityGroupId","match","getApplicationSecurityGroup","sortBy","when","editLoadBalancer","open","templateUrl","controllerAs","size","angular","copy","deleteLoadBalancer","command","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","ORACLE_LOAD_BALANCER_DETAIL_CONTROLLER","ORACLE_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","EXECUTION_DETAILS_SECTION_SERVICE","$log","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","stage","context","cloudProviderType","roscoMode","feature","bakeryDetailUrl","roscoDetailUrl","initialize","synchronizeSection","$on","ORACLE_PIPELINE_STAGES_BAKE_OCIBAKESTAGE","config","Registry","pipeline","registerStage","provides","label","description","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","supportsCustomTimeout","validators","fieldName","fieldLabel","restartable","extendedAttributes","user","AuthenticationService","getAuthenticatedUser","getBaseOsDescription","baseOsOption","shortDescription","accountName","Array","isArray","addExtendedAttribute","PipelineTemplates","addExtendedAttributes","extendedAttribute","result","removeExtendedAttribute","showExtendedAttributes","viewState","$watch","providerSelected","BakeryReader","getBaseOsOptions","baseOsOptions","baseImages","baseOs","upgrade","ORACLE_PIPELINE_STAGES_DESTROYASG_DESTROYASGSTAGE","executionStepLabelUrl","message","targets","StageConstants","TARGET_LIST","regionsLoaded","target","val","init","ORACLE_PIPELINE_STAGES_DISABLEASG_DISABLEASGSTAGE","gce","ORACLE_PIPELINE_STAGES_FINDAMI_FINDAMISTAGE","selectionStrategies","selectionStrategy","isUndefined","onlyEnabled","ORACLE_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ORACLEFINDIMAGEFROMTAGSSTAGE","executionConfigSections","packageName","tags","getRegions","ORACLE_PIPELINE_STAGES_RESIZEASG_RESIZEASGSTAGE","resizeTargets","scaleActions","resizeTypes","capacity","action","resizeType","updateResizeType","scalePct","scaleNum","ORACLE_PIPELINE_STAGES_SCALEDOWNCLUSTER_SCALEDOWNCLUSTERSTAGE","strategy","remainingFullSizeServerGroups","allowScaleDownActive","preferLargerOverNewer","pluralize","str","toString","ORACLE_PIPELINE_STAGES_SHRINKCLUSTER_SHRINKCLUSTERSTAGE","shrinkToSize","allowDeleteActive","retainLargerOverNewer","ORACLE_SECURITYGROUP_CONFIGURE_CREATESECURITYGROUP_CONTROLLER","firewallLabel","ORACLE_SECURITYGROUP_SECURITYGROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","ORACLE_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","addVcnNameToSecurityGroup","securityGroup","vcns","matches","vcn","vpcName","normalizeSecurityGroup","_","partial","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCONFIGURATION_SERVICE","SECURITY_GROUP_READER","oracleImageReader","loadAndSelectRegions","backingData","selectedAccountDetails","credentialsKeyedByAccount","loadAvailabilityDomains","getAvailabilityZonesForAccountAndRegion","availDoms","availabilityDomains","av","loadLoadBalancers","configureCommand","defaultRegion","getCredentialsKeyedByAccount","getAllSecurityGroups","networks","images","availDomains","zone","filterSubnets","accountOnChange","regionOnChange","availabilityDomainOnChange","subnetId","seclists","vpcOnChange","subnetOnChange","mySecGroups","secLists","securityListIds","sid","sgRef","getSecurityGroupDetails","sgd","findBackendSetsByLoadBalancerId","bsetArray","arr","bsetName","bset","findLoadBalListenersByBackendSetName","backendSetName","lisName","loadBalancerOnChange","backendSetOnChange","shapesMap","image","compatibleShapes","getShapes","allShapes","uniqBy","flatten","values","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_BASICSETTINGS_BASICSETTINGS_CONTROLLER","IMAGE_READER","$uibModalStack","$controller","imageReader","extend","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CAPACITY_CAPACITYSELECTOR_COMPONENT","component","bindings","noop","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUP_CONFIGURE_MODULE","ORACLE_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","buildNewServerGroupCommand","defaultAccount","desired","selectedProvider","mode","disableStrategySelection","buildServerGroupCommandFromExisting","serverGroupName","parseServerGroupName","launchConfig","sshAuthorizedKeys","buildNewServerGroupCommandForPipeline","requiresTemplateSelection","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","viewOverrides","disableImageSelection","submitButtonLabel","templatingEnabled","ORACLE_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_CONTROLLER","serverGroupWriter","serverGroupCommand","oracleServerGroupConfigurationService","loaded","basicSettings","instanceType","networkSettings","templateSelection","templateSelectionText","copied","notCopied","isValid","form","$valid","ModalWizard","isComplete","showSubmitButton","allPagesVisited","cloneServerGroup","templateSelected","ORACLE_COMMON_FOOTER_COMPONENT","verification","ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZECAPACITY_COMPONENT","SERVER_GROUP_WRITER","formMethods","newSize","formIsValid","every","resizeCapacityForm","resizeServerGroup","min","max","targetSize","interestingHealthProviderNames","reason","ORACLE_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER","attributes","platformHealthOnlyShowOverride","platformHealthOnly","verified","resize","ORACLE_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER","disabledServerGroups","sort","a","localeCompare","rollbackType","rollbackContext","rollbackServerGroupName","restoreServerGroupName","rollback","rollbackServerGroup","ORACLE_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_CONTROLLER","retrieveServerGroup","ServerGroupReader","getServerGroup","cancelLoader","retrieveNetwork","retrieveSubnet","retrieveImage","chain","head","getSubnetByIdAndProvider","destroyServerGroup","stateParams","sgSummary","cluster","clusters","isDisabled","disableServerGroup","confirmationModalParams","platformHealthType","askForReason","ServerGroupWarningMessageService","addDisableWarningMessage","enableServerGroup","ORACLE_SERVERGROUP_SERVERGROUP_TRANSFORMER","convertServerGroupCommandToDeployConfiguration","base","normalizeServerGroup","ORACLE_MODULE","CloudProviderRegistry","registerProvider","reader","transformer","detailsTemplateUrl","detailsController","createLoadBalancerTemplateUrl","createLoadBalancerController","commandBuilder","cloneServerGroupController","cloneServerGroupTemplateUrl","configurationService","createSecurityGroupTemplateUrl","createSecurityGroupController","DeploymentStrategyRegistry"],"mappings":"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"}