@spinnaker/cloudrun 2026.2.3 → 2026.3.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/cloudrun.module.d.ts +1 -1
- package/dist/common/ComponentUrlDetails.d.ts +7 -0
- package/dist/common/LoadBalancerMessage.d.ts +4 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/instance/details/CloudrunInstanceDetails.d.ts +23 -0
- package/dist/loadBalancer/configure/wizard/CloudrunLoadBalancerModal.d.ts +32 -0
- package/dist/loadBalancer/details/CloudrunLoadBalancerActions.d.ts +3 -0
- package/dist/loadBalancer/details/sections.d.ts +7 -0
- package/dist/loadBalancer/details/useCloudrunLoadBalancerDetails.d.ts +4 -0
- package/dist/loadBalancer/index.d.ts +4 -2
- package/dist/loadBalancer/loadBalancerTransformer.d.ts +2 -6
- package/dist/manifest/manifest.service.d.ts +5 -0
- package/dist/manifest/manifestCommandBuilder.service.d.ts +1 -1
- package/dist/pipeline/stages/deployManifest/manifestStatus/DeployStatus.d.ts +1 -0
- package/dist/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.d.ts +6 -3
- package/dist/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerExecutionDetails.d.ts +7 -0
- package/dist/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerStageConfig.d.ts +30 -0
- package/dist/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.d.ts +2 -1
- package/dist/serverGroup/configure/serverGroupCommandBuilder.service.d.ts +4 -6
- package/dist/serverGroup/configure/wizard/BasicSettings.d.ts +5 -2
- package/dist/serverGroup/configure/wizard/serverGroupWizard.d.ts +18 -6
- package/dist/serverGroup/details/CloudrunServerGroupActions.d.ts +6 -0
- package/dist/serverGroup/details/cloudrunServerGroupDetailsGetter.d.ts +3 -0
- package/dist/serverGroup/details/sections.d.ts +5 -0
- package/dist/serverGroup/index.d.ts +3 -1
- package/dist/serverGroup/serverGroupTransformer.service.d.ts +1 -5
- package/package.json +4 -11
- package/src/cloudrun.module.spec.ts +22 -0
- package/src/cloudrun.module.ts +54 -59
- package/src/common/ComponentUrlDetails.tsx +25 -0
- package/src/common/LoadBalancerMessage.tsx +17 -0
- package/src/index.ts +2 -1
- package/src/instance/details/CloudrunInstanceDetails.tsx +164 -0
- package/src/loadBalancer/configure/wizard/CloudrunLoadBalancerModal.spec.tsx +85 -0
- package/src/loadBalancer/configure/wizard/CloudrunLoadBalancerModal.tsx +395 -0
- package/src/loadBalancer/details/CloudrunLoadBalancerActions.tsx +66 -0
- package/src/loadBalancer/details/sections.spec.ts +19 -0
- package/src/loadBalancer/details/sections.tsx +91 -0
- package/src/loadBalancer/details/useCloudrunLoadBalancerDetails.ts +56 -0
- package/src/loadBalancer/index.ts +4 -2
- package/src/loadBalancer/loadBalancerTransformer.ts +3 -13
- package/src/manifest/manifest.service.ts +18 -1
- package/src/manifest/manifestCommandBuilder.service.ts +46 -53
- package/src/pipeline/stages/deployManifest/manifestStatus/DeployStatus.tsx +33 -4
- package/src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.spec.tsx +35 -0
- package/src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx +10 -5
- package/src/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerExecutionDetails.tsx +70 -0
- package/src/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerStageConfig.tsx +245 -0
- package/src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.spec.ts +205 -0
- package/src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.ts +14 -71
- package/src/serverGroup/configure/serverGroupCommandBuilder.service.ts +5 -15
- package/src/serverGroup/configure/wizard/BasicSettings.tsx +10 -8
- package/src/serverGroup/configure/wizard/serverGroupWizard.tsx +59 -15
- package/src/serverGroup/details/CloudrunServerGroupActions.tsx +80 -0
- package/src/serverGroup/details/cloudrunServerGroupDetailsGetter.spec.ts +46 -0
- package/src/serverGroup/details/cloudrunServerGroupDetailsGetter.ts +53 -0
- package/src/serverGroup/details/sections.tsx +60 -0
- package/src/serverGroup/index.ts +3 -1
- package/src/serverGroup/routerConsumers.spec.tsx +152 -0
- package/src/serverGroup/serverGroupTransformer.service.ts +2 -12
- package/dist/common/componentUrlDetails.component.d.ts +0 -1
- package/dist/common/conditionalDescriptionListItem.component.d.ts +0 -1
- package/dist/common/loadBalancerMessage.component.d.ts +0 -1
- package/dist/instance/details/details.controller.d.ts +0 -1
- package/dist/loadBalancer/configure/wizard/allocationConfigurationRow.component.d.ts +0 -1
- package/dist/loadBalancer/configure/wizard/basicSettings.component.d.ts +0 -1
- package/dist/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.d.ts +0 -1
- package/dist/loadBalancer/configure/wizard/wizard.controller.d.ts +0 -2
- package/dist/loadBalancer/details/details.controller.d.ts +0 -1
- package/dist/pipeline/pipeline.module.d.ts +0 -1
- package/dist/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.d.ts +0 -1
- package/dist/serverGroup/details/details.controller.d.ts +0 -1
- package/src/common/componentUrlDetails.component.ts +0 -22
- package/src/common/conditionalDescriptionListItem.component.ts +0 -37
- package/src/common/loadBalancerMessage.component.html +0 -11
- package/src/common/loadBalancerMessage.component.ts +0 -13
- package/src/instance/details/details.controller.ts +0 -84
- package/src/instance/details/details.html +0 -68
- package/src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts +0 -70
- package/src/loadBalancer/configure/wizard/basicSettings.component.html +0 -44
- package/src/loadBalancer/configure/wizard/basicSettings.component.ts +0 -86
- package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.html +0 -45
- package/src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts +0 -84
- package/src/loadBalancer/configure/wizard/wizard.controller.ts +0 -157
- package/src/loadBalancer/configure/wizard/wizard.html +0 -39
- package/src/loadBalancer/configure/wizard/wizard.less +0 -9
- package/src/loadBalancer/details/details.controller.ts +0 -140
- package/src/loadBalancer/details/details.html +0 -89
- package/src/pipeline/pipeline.module.ts +0 -6
- package/src/pipeline/stages/editLoadBalancer/editLoadBalancerExecutionDetails.html +0 -33
- package/src/pipeline/stages/editLoadBalancer/editLoadBalancerStage.html +0 -51
- package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts +0 -65
- package/src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.html +0 -53
- package/src/serverGroup/details/details.controller.ts +0 -134
- package/src/serverGroup/details/details.html +0 -94
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/common/componentUrlDetails.component.ts","../src/common/loadBalancerMessage.component.ts","../src/help/cloudrun.help.ts","../src/instance/details/details.controller.ts","../src/loadBalancer/configure/wizard/allocationConfigurationRow.component.ts","../src/loadBalancer/configure/wizard/basicSettings.component.ts","../src/loadBalancer/configure/wizard/stageAllocationConfigurationRow.component.ts","../src/loadBalancer/loadBalancerTransformer.ts","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/loadBalancer/configure/wizard/wizard.controller.ts","../src/loadBalancer/details/details.controller.ts","../src/pipeline/stages/editLoadBalancer/loadBalancerChoice.modal.controller.ts","../src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.ts","../src/pipeline/pipeline.module.ts","../src/pipeline/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/manifest/ManifestSource.ts","../src/manifest/wizard/BasicSettings.tsx","../src/pipeline/stages/deployManifest/serverGroupNamePreview.tsx","../src/pipeline/stages/deployManifest/DeployStageForm.tsx","../src/pipeline/stages/deployManifest/DeployStageConfig.tsx","../src/rolloutStrategy/redblack.strategy.ts","../src/pipeline/stages/deployManifest/deploy.validator.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipeline/stages/deployManifest/deployStage.ts","../src/cloudrun.settings.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.ts","../src/serverGroup/configure/wizard/BasicSettings.tsx","../src/serverGroup/configure/wizard/ConfigFiles.tsx","../src/serverGroup/configure/wizard/serverGroupWizard.tsx","../src/common/cloudrunHealth.ts","../src/serverGroup/details/details.controller.ts","../src/serverGroup/serverGroupTransformer.service.ts","../src/cloudrun.module.ts","../src/logo/cloudrun.logo.png"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst cloudrunComponentUrlDetailsComponent: IComponentOptions = {\n bindings: { component: '<' },\n template: `\n <dt>HTTPS</dt>\n <dl class=\"small\">\n <a href=\"{{$ctrl.component.url}}\" target=\"_blank\">{{$ctrl.component.url}}</a>\n <copy-to-clipboard class=\"copy-to-clipboard copy-to-clipboard-sm\"\n tool-tip=\"'Copy URL to clipboard'\"\n text=\"$ctrl.component.httpsUrl\"></copy-to-clipboard>\n </dl>\n `,\n};\n\nexport const CLOUDRUN_COMPONENT_URL_DETAILS = 'spinnaker.cloudrun.componentUrlDetails.component';\n\nmodule(CLOUDRUN_COMPONENT_URL_DETAILS, []).component(\n 'cloudrunComponentUrlDetails',\n cloudrunComponentUrlDetailsComponent,\n);\n","import { module } from 'angular';\n\nconst cloudRunLoadBalancerMessageComponent: ng.IComponentOptions = {\n bindings: { showCreateMessage: '<', columnOffset: '@', columns: '@' },\n templateUrl: require('./loadBalancerMessage.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE = 'spinnaker.cloudrun.loadBalancer.createMessage.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE, []).component(\n 'cloudrunLoadBalancerMessage',\n cloudRunLoadBalancerMessageComponent,\n);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'cloudrun.serverGroup.stack',\n value:\n '(Optional) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n },\n\n {\n key: 'cloudrun.serverGroup.file',\n value: `<pre>\n apiVersion: serving.knative.dev/v1\n kind: Service\n metadata:\n name: spinappcloud1\n namespace: '135005621049'\n labels:\n cloud.googleapis.com/location: us-central1\n annotations:\n run.googleapis.com/client-name: cloud-console\n serving.knative.dev/creator: kiran@opsmx.io\n serving.knative.dev/lastModifier: kiran@opsmx.io\n client.knative.dev/user-image: us-docker.pkg.dev/cloudrun/container/hello\n run.googleapis.com/ingress-status: all\n spec:\n template:\n metagoogleapis.com/ingress: all\n run.data:\n name: spinappcloud1\n annotations:\n run.googleapis.com/client-name: cloud-console\n autoscaling.knative.dev/minScale: '1'\n autoscaling.knative.dev/maxScale: '3'\n spec:\n containerConcurrency: 80\n timeoutSeconds: 200\n serviceAccountName:spinnaker-cloudrun-account@my-orbit-project-71824.iam.gserviceaccount.com\n containers:\n - image:us-docker.pkg.dev/cloudrun/container/hello\n ports:\n - name: http1\n containerPort: 8080\n resources:\n limits:\n cpu: 1000m\n memory: 256Mi \n</pre>\n `,\n },\n\n {\n key: 'cloudrun.serverGroup.detail',\n value:\n ' (Optional) <b>Detail</b> is a string of free-form alphanumeric characters and hyphens to describe any other variables.',\n },\n {\n key: 'cloudrun.serverGroup.configFiles',\n value: `<p> The contents of a Cloud Run Service yaml </p>`,\n },\n {\n key: 'cloudrun.loadBalancer.allocations',\n value: 'An allocation is the percent of traffic directed to a server group.',\n },\n {\n key: 'cloudrun.manifest.source',\n value: `\n <p>Where the manifest file content is read from.</p>\n <p>\n <b>text:</b> The manifest is supplied statically to the pipeline from the below text-box.\n </p>\n <p>\n <b>artifact:</b> The manifest is read from an artifact supplied/created upstream. The expected artifact must be referenced here, and will be bound at runtime.\n </p>`,\n },\n {\n key: 'cloudrun.manifest.expectedArtifact',\n value:\n 'The artifact that is to be applied to the Cloud Run account for this stage. The artifact should represent a valid Cloud Run manifest.',\n },\n {\n key: 'cloudrun.manifest.skipExpressionEvaluation',\n value:\n '<p>Skip SpEL expression evaluation of the manifest artifact in this stage. Can be paired with the \"Evaluate SpEL expressions in overrides at bake time\" option in the Bake Manifest stage when baking a third-party manifest artifact with expressions not meant for Spinnaker to evaluate as SpEL.</p>',\n },\n {\n key: 'cloudrun.manifest.requiredArtifactsToBind',\n value:\n 'These artifacts must be present in the context for this stage to successfully complete. Artifacts specified will be <a href=\"https://www.spinnaker.io/reference/artifacts/in-cloudrun-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n },\n {\n key: 'cloudrun.manifest.account',\n value: `\n <p>A Spinnaker account corresponds to a physical Cloud Run cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","import type { IController, IQService } from 'angular';\nimport { module } from 'angular';\nimport { flattenDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { InstanceReader, RecentHistoryService } from '@spinnaker/core';\nimport type { ICloudrunInstance } from '../../common/domain';\n\ninterface InstanceFromStateParams {\n instanceId: string;\n}\n\ninterface InstanceManager {\n account: string;\n region: string;\n category: string; // e.g., serverGroup, loadBalancer.\n name: string; // Parent resource name, not instance name.\n instances: ICloudrunInstance[];\n}\n\nclass CloudrunInstanceDetailsController implements IController {\n public state = { loading: true };\n public instance: ICloudrunInstance;\n public instanceIdNotFound: string;\n public upToolTip = \"A Cloud Run instance is 'Up' if a load balancer is directing traffic to its server group.\";\n public outOfServiceToolTip = `\n A Cloud Run instance is 'Out Of Service' if no load balancers are directing traffic to its server group.`;\n\n public static $inject = ['$q', 'app', 'instance'];\n\n constructor(private $q: IQService, private app: Application, instance: InstanceFromStateParams) {\n this.app\n .ready()\n .then(() => this.retrieveInstance(instance))\n .then((instanceDetails) => {\n this.instance = instanceDetails;\n this.state.loading = false;\n })\n .catch(() => {\n this.instanceIdNotFound = instance.instanceId;\n this.state.loading = false;\n });\n }\n\n private retrieveInstance(instance: InstanceFromStateParams): PromiseLike<ICloudrunInstance> {\n const instanceLocatorPredicate = (dataSource: InstanceManager) => {\n return dataSource.instances.some((possibleMatch) => possibleMatch.id === instance.instanceId);\n };\n\n const dataSources: InstanceManager[] = flattenDeep([\n this.app.getDataSource('serverGroups').data,\n this.app.getDataSource('loadBalancers').data,\n this.app.getDataSource('loadBalancers').data.map((loadBalancer: ILoadBalancer) => loadBalancer.serverGroups),\n ]);\n\n const instanceManager = dataSources.find(instanceLocatorPredicate);\n\n if (instanceManager) {\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return InstanceReader.getInstanceDetails(\n instanceManager.account,\n instanceManager.region,\n instance.instanceId,\n ).then((instanceDetails: ICloudrunInstance) => {\n instanceDetails.account = instanceManager.account;\n instanceDetails.region = instanceManager.region;\n return instanceDetails;\n });\n } else {\n return this.$q.reject();\n }\n }\n}\n\nexport const CLOUDRUN_INSTANCE_DETAILS_CTRL = 'spinnaker.cloudrun.instanceDetails.controller';\nmodule(CLOUDRUN_INSTANCE_DETAILS_CTRL, []).controller('cloudrunInstanceDetailsCtrl', CloudrunInstanceDetailsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunAllocationConfigurationRowComponent: IComponentOptions = {\n bindings: {\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n template: `\n <div class=\"form-group\">\n <div class=\"row\">\n <div class=\"col-md-7\">\n <ui-select ng-model=\"$ctrl.allocationDescription.revisionName\"\n on-select=\"$ctrl.onAllocationChange()\"\n class=\"form-control input-sm\">\n <ui-select-match placeholder=\"Select...\">\n {{$select.selected}}\n </ui-select-match>\n <ui-select-choices repeat=\"serverGroup as serverGroup in $ctrl.getServerGroupOptions() | filter: $select.search\">\n <div ng-bind-html=\"serverGroup | highlight: $select.search\"></div>\n </ui-select-choices>\n </ui-select>\n </div>\n <div class=\"col-md-3\">\n <div class=\"input-group input-group-sm\">\n <input type=\"number\"\n ng-model=\"$ctrl.allocationDescription.percent\"\n required\n class=\"form-control input-sm\"\n min=\"0\"\n ng-change=\"$ctrl.onAllocationChange()\"\n max=\"100\"/>\n <span class=\"input-group-addon\">%</span>\n </div>\n </div>\n <div class=\"col-md-2\">\n <a class=\"btn btn-link sm-label\" ng-click=\"$ctrl.removeAllocation()\">\n <span class=\"glyphicon glyphicon-trash\"></span>\n </a>\n </div>\n </div>\n </div>\n `,\n controller: CloudrunAllocationConfigurationRowCtrl,\n};\n\nexport const CLOUDRUN_ALLOCATION_CONFIGURATION_ROW = 'spinnaker.cloudrun.allocationConfigurationRow.component';\n\nmodule(CLOUDRUN_ALLOCATION_CONFIGURATION_ROW, []).component(\n 'cloudrunAllocationConfigurationRow',\n cloudrunAllocationConfigurationRowComponent,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport { difference } from 'lodash';\n\nimport type { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunLoadBalancerSettingsController implements IController {\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public serverGroupOptions: string[];\n public forPipelineConfig: boolean;\n\n public $onInit(): void {\n this.updateServerGroupOptions();\n }\n\n public addAllocation(): void {\n const remainingServerGroups = this.serverGroupsWithoutAllocation();\n if (remainingServerGroups.length) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n revisionName: remainingServerGroups[0],\n percent: 0,\n });\n this.updateServerGroupOptions();\n } else if (this.forPipelineConfig) {\n this.loadBalancer.splitDescription.allocationDescriptions.push({\n percent: 0,\n revisionName: '',\n });\n }\n }\n\n public removeAllocation(index: number): void {\n this.loadBalancer.splitDescription.allocationDescriptions.splice(index, 1);\n this.updateServerGroupOptions();\n }\n\n public allocationIsInvalid(): boolean {\n return (\n this.loadBalancer.splitDescription.allocationDescriptions.reduce(\n (sum, allocationDescription) => sum + allocationDescription.percent,\n 0,\n ) !== 100\n );\n }\n\n public updateServerGroupOptions(): void {\n this.serverGroupOptions = this.serverGroupsWithoutAllocation();\n }\n\n public showAddButton(): boolean {\n if (this.forPipelineConfig) {\n return true;\n } else {\n return this.serverGroupsWithoutAllocation().length > 0;\n }\n }\n\n public initializeAsTextInput(serverGroupName: string): boolean {\n if (this.forPipelineConfig) {\n return !this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name).includes(serverGroupName);\n } else {\n return false;\n }\n }\n\n private serverGroupsWithoutAllocation(): string[] {\n const serverGroupsWithAllocation = this.loadBalancer.splitDescription.allocationDescriptions.map(\n (description) => description.revisionName,\n );\n const allServerGroups = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n return difference(allServerGroups, serverGroupsWithAllocation);\n }\n}\n\nconst cloudrunLoadBalancerSettingsComponent: ng.IComponentOptions = {\n bindings: { loadBalancer: '=', forPipelineConfig: '<', application: '<' },\n controller: CloudrunLoadBalancerSettingsController,\n templateUrl: require('./basicSettings.component.html'),\n};\n\nexport const CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS = 'spinnaker.cloudrun.loadBalancerSettings.component';\n\nmodule(CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS, []).component(\n 'cloudrunLoadBalancerBasicSettings',\n cloudrunLoadBalancerSettingsComponent,\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport { uniq } from 'lodash';\n\nimport { StageConstants } from '@spinnaker/core';\n\nimport type { ICloudrunAllocationDescription } from '../../loadBalancerTransformer';\n\nclass CloudrunStageAllocationLabelCtrl implements IController {\n public inputViewValue: string;\n private allocationDescription: ICloudrunAllocationDescription;\n\n private static mapTargetCoordinateToLabel(targetCoordinate: string): string {\n const target = StageConstants.TARGET_LIST.find((t) => t.val === targetCoordinate);\n if (target) {\n return target.label;\n } else {\n return null;\n }\n }\n\n public $doCheck(): void {\n this.setInputViewValue();\n }\n\n private setInputViewValue(): void {\n if (this.allocationDescription.cluster && this.allocationDescription.target) {\n const targetLabel = CloudrunStageAllocationLabelCtrl.mapTargetCoordinateToLabel(\n this.allocationDescription.target,\n );\n this.inputViewValue = `${targetLabel} (${this.allocationDescription.cluster})`;\n } else {\n this.inputViewValue = null;\n }\n }\n}\n\nconst cloudrunStageAllocationLabel: IComponentOptions = {\n bindings: { allocationDescription: '<' },\n controller: CloudrunStageAllocationLabelCtrl,\n template: `<input ng-model=\"$ctrl.inputViewValue\" type=\"text\" class=\"form-control input-sm\" readonly/>`,\n};\n\nclass CloudrunStageAllocationConfigurationRowCtrl implements IController {\n public allocationDescription: ICloudrunAllocationDescription;\n public serverGroupOptions: string[];\n public targets = StageConstants.TARGET_LIST;\n public clusterList: string[];\n public onAllocationChange: Function;\n private name: string;\n\n public $onInit() {\n this.allocationDescription.cluster = this.name;\n }\n\n public getServerGroupOptions(): string[] {\n if (this.allocationDescription.revisionName) {\n return uniq(this.serverGroupOptions.concat(this.allocationDescription.revisionName));\n } else {\n return this.serverGroupOptions;\n }\n }\n}\n\nconst cloudrunStageAllocationConfigurationRow: IComponentOptions = {\n bindings: {\n application: '<',\n region: '@',\n account: '@',\n name: '@',\n allocationDescription: '<',\n removeAllocation: '&',\n serverGroupOptions: '<',\n onAllocationChange: '&',\n },\n controller: CloudrunStageAllocationConfigurationRowCtrl,\n templateUrl: require('./stageAllocationConfigurationRow.component.html'),\n};\n\nexport const CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW =\n 'spinnaker.cloudrun.stageAllocationConfigurationRow.component';\nmodule(CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW, [])\n .component('cloudrunStageAllocationConfigurationRow', cloudrunStageAllocationConfigurationRow)\n .component('cloudrunStageAllocationLabel', cloudrunStageAllocationLabel);\n","import { module } from 'angular';\nimport { camelCase, chain, cloneDeep, filter, get, has, reduce } from 'lodash';\n\nimport type {\n Application,\n IInstance,\n IInstanceCounts,\n ILoadBalancer,\n ILoadBalancerUpsertCommand,\n IServerGroup,\n} from '@spinnaker/core';\n//import type { ICloudrunLoadBalancer, ICloudrunTrafficSplit, ShardBy } from '../common/domain/index';\nimport type { ICloudrunLoadBalancer, ICloudrunTrafficSplit } from '../common/domain/index';\n\nexport interface ICloudrunAllocationDescription {\n revisionName?: string;\n target?: string;\n cluster?: string;\n percent: number;\n}\n\nexport interface ICloudrunTrafficSplitDescription {\n allocationDescriptions: ICloudrunAllocationDescription[];\n}\n\nexport class CloudrunLoadBalancerUpsertDescription implements ILoadBalancerUpsertCommand, ICloudrunLoadBalancer {\n public credentials: string;\n public account: string;\n public loadBalancerName: string;\n public name: string;\n public splitDescription: ICloudrunTrafficSplitDescription;\n public split?: ICloudrunTrafficSplit;\n public migrateTraffic: boolean;\n public region: string;\n public cloudProvider: string;\n public serverGroups?: any[];\n\n public static convertTrafficSplitToTrafficSplitDescription(\n split: ICloudrunTrafficSplit,\n ): ICloudrunTrafficSplitDescription {\n const allocationDescriptions = reduce(\n split.trafficTargets,\n (acc: any, trafficTarget: any) => {\n const { revisionName, percent } = trafficTarget;\n return acc.concat({ percent, revisionName });\n },\n [],\n );\n return { allocationDescriptions };\n }\n\n constructor(loadBalancer: ICloudrunLoadBalancer) {\n this.credentials = loadBalancer.account || loadBalancer.credentials;\n this.account = this.credentials;\n this.cloudProvider = loadBalancer.cloudProvider;\n this.loadBalancerName = loadBalancer.name;\n this.name = loadBalancer.name;\n this.region = loadBalancer.region;\n this.migrateTraffic = loadBalancer.migrateTraffic || false;\n this.serverGroups = loadBalancer.serverGroups;\n }\n\n public mapAllocationsToDecimals() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n description.percent = description.percent / 100;\n });\n }\n\n public mapAllocationsToPercentages() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n // An allocation percent has at most one decimal place.\n description.percent = Math.round(description.percent);\n });\n }\n}\n\nexport class CloudrunLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n public normalizeLoadBalancer(loadBalancer: ILoadBalancer): PromiseLike<ILoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n loadBalancer.instances = [];\n loadBalancer.serverGroups.forEach((serverGroup) => {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = (serverGroup.detachedInstances as any).map((id: string) => ({ id }));\n }\n serverGroup.instances = serverGroup.instances\n .concat(serverGroup.detachedInstances || [])\n .map((instance: any) => this.transformInstance(instance, loadBalancer));\n });\n\n const activeServerGroups = filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.instances = chain(activeServerGroups).map('instances').flatten().value() as IInstance[];\n return this.$q.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(\n loadBalancer: ICloudrunLoadBalancer,\n application: Application,\n ): PromiseLike<ICloudrunLoadBalancer> {\n return application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n const upToDateLoadBalancer = application\n .getDataSource('loadBalancers')\n .data.find((candidate: ILoadBalancer) => {\n return (\n candidate.name === loadBalancer.name &&\n (candidate.account === loadBalancer.account || candidate.account === loadBalancer.credentials)\n );\n });\n\n if (upToDateLoadBalancer) {\n loadBalancer.serverGroups = cloneDeep(upToDateLoadBalancer.serverGroups);\n }\n return loadBalancer;\n });\n }\n\n public convertLoadBalancerToUpsertDescription(\n loadBalancer: ICloudrunLoadBalancer,\n ): CloudrunLoadBalancerUpsertDescription {\n return new CloudrunLoadBalancerUpsertDescription(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts: IInstanceCounts = chain(serverGroups)\n .map('instances')\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n if (has(instance, 'health.state')) {\n acc[camelCase(instance.health.state)]++;\n }\n return acc;\n },\n { up: 0, down: 0, outOfService: 0, succeeded: 0, failed: 0, starting: 0, unknown: 0 },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups).map('detachedInstances').flatten().value().length;\n return instanceCounts;\n }\n\n private transformInstance(instance: any, loadBalancer: ILoadBalancer) {\n instance.provider = loadBalancer.type;\n instance.account = loadBalancer.account;\n instance.region = loadBalancer.region;\n instance.loadBalancers = [loadBalancer.name];\n const health = instance.health || {};\n instance.healthState = get(instance, 'health.state') || 'OutOfService';\n instance.health = [health];\n\n return instance as IInstance;\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_TRANSFORMER = 'spinnaker.cloudrun.loadBalancer.transformer.service';\n\nmodule(CLOUDRUN_LOAD_BALANCER_TRANSFORMER, []).service(\n 'cloudrunLoadBalancerTransformer',\n CloudrunLoadBalancerTransformer,\n);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application } from '@spinnaker/core';\nimport { LoadBalancerWriter, TaskMonitor } from '@spinnaker/core';\n\nimport type { CloudrunLoadBalancerTransformer, ICloudrunTrafficSplitDescription } from '../../loadBalancerTransformer';\nimport { CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nimport './wizard.less';\n\nclass CloudrunLoadBalancerWizardController implements IController {\n public state = { loading: true };\n public loadBalancer: CloudrunLoadBalancerUpsertDescription;\n public heading: string;\n public submitButtonLabel: string;\n public taskMonitor: TaskMonitor;\n\n public static $inject = [\n '$scope',\n '$state',\n '$uibModalInstance',\n 'application',\n 'loadBalancer',\n 'isNew',\n 'forPipelineConfig',\n 'cloudrunLoadBalancerTransformer',\n 'wizardSubFormValidation',\n ];\n constructor(\n public $scope: ng.IScope,\n private $state: StateService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n loadBalancer: CloudrunLoadBalancerUpsertDescription,\n public isNew: boolean,\n private forPipelineConfig: boolean,\n private cloudrunLoadBalancerTransformer: CloudrunLoadBalancerTransformer,\n private wizardSubFormValidation: any,\n ) {\n this.submitButtonLabel = this.forPipelineConfig ? 'Done' : 'Update';\n\n if (this.isNew) {\n this.heading = 'Create New Load Balancer';\n } else {\n this.heading = `Edit ${[\n loadBalancer.name,\n loadBalancer.region,\n loadBalancer.account || loadBalancer.credentials,\n ].join(':')}`;\n this.cloudrunLoadBalancerTransformer\n .convertLoadBalancerForEditing(loadBalancer, application)\n .then((convertedLoadBalancer) => {\n this.loadBalancer = this.cloudrunLoadBalancerTransformer.convertLoadBalancerToUpsertDescription(\n convertedLoadBalancer,\n );\n if (loadBalancer.split && !this.loadBalancer.splitDescription) {\n this.loadBalancer.splitDescription = CloudrunLoadBalancerUpsertDescription.convertTrafficSplitToTrafficSplitDescription(\n loadBalancer.split,\n );\n } else {\n this.loadBalancer.splitDescription = loadBalancer.splitDescription;\n }\n this.loadBalancer.mapAllocationsToPercentages();\n this.setTaskMonitor();\n this.initializeFormValidation();\n this.state.loading = false;\n });\n }\n }\n\n public submit(): any {\n const description = cloneDeep(this.loadBalancer);\n description.mapAllocationsToPercentages();\n delete description.serverGroups;\n\n if (this.forPipelineConfig) {\n return this.$uibModalInstance.close(description);\n } else {\n return this.taskMonitor.submit(() => {\n return LoadBalancerWriter.upsertLoadBalancer(description, this.application, 'Update');\n });\n }\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public showSubmitButton(): boolean {\n return this.wizardSubFormValidation.subFormsAreValid();\n }\n\n private setTaskMonitor(): void {\n this.taskMonitor = new TaskMonitor({\n application: this.application,\n title: 'Updating your load balancer',\n modalInstance: this.$uibModalInstance,\n onTaskComplete: () => this.onTaskComplete(),\n });\n }\n\n private initializeFormValidation(): void {\n this.wizardSubFormValidation.config({ form: 'form', scope: this.$scope }).register({\n page: 'basic-settings',\n subForm: 'basicSettingsForm',\n validators: [\n {\n watchString: 'ctrl.loadBalancer.splitDescription',\n validator: (splitDescription: ICloudrunTrafficSplitDescription): boolean => {\n return (\n splitDescription.allocationDescriptions.reduce((sum, description) => sum + description.percent, 0) === 100\n );\n },\n watchDeep: true,\n },\n ],\n });\n }\n\n private onTaskComplete(): void {\n this.application.getDataSource('loadBalancers').refresh();\n this.application.getDataSource('loadBalancers').onNextRefresh(this.$scope, () => this.onApplicationRefresh());\n }\n\n private onApplicationRefresh(): void {\n // If the user has already closed the modal, do not navigate to the new details view\n if ((this.$scope as any).$$destroyed) {\n // $$destroyed is not in the ng.IScope interface\n return;\n }\n\n this.$uibModalInstance.dismiss();\n const newStateParams = {\n name: this.loadBalancer.name,\n accountId: this.loadBalancer.credentials,\n region: this.loadBalancer.region,\n provider: 'cloudrun',\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\nexport const CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL = 'spinnaker.cloudrun.loadBalancer.wizard.controller';\n\nmodule(CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL, []).controller(\n 'cloudrunLoadBalancerWizardCtrl',\n CloudrunLoadBalancerWizardController,\n);\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer, ILoadBalancerDeleteCommand } from '@spinnaker/core';\nimport { ConfirmationModalService, LoadBalancerWriter } from '@spinnaker/core';\nimport type { ICloudrunLoadBalancer } from '../../common/domain/index';\n\ninterface ILoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunLoadBalancerDetailsController implements IController {\n public state = { loading: true };\n private loadBalancerFromParams: ILoadBalancerFromStateParams;\n public loadBalancer: ICloudrunLoadBalancer;\n\n public static $inject = ['$uibModal', '$state', '$scope', 'loadBalancer', 'app'];\n constructor(\n private $uibModal: IModalService,\n private $state: StateService,\n private $scope: IScope,\n loadBalancer: ILoadBalancerFromStateParams,\n private app: Application,\n ) {\n this.loadBalancerFromParams = loadBalancer;\n this.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n // edit loadbalancer to change traffic\n\n public editLoadBalancer(): void {\n this.$uibModal.open({\n templateUrl: require('../configure/wizard/wizard.html'),\n controller: 'cloudrunLoadBalancerWizardCtrl as ctrl',\n size: 'lg',\n resolve: {\n application: () => this.app,\n loadBalancer: () => cloneDeep(this.loadBalancer),\n isNew: () => false,\n forPipelineConfig: () => false,\n },\n });\n }\n\n private extractLoadBalancer(): void {\n this.loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {\n return test.name === this.loadBalancerFromParams.name && test.account === this.loadBalancerFromParams.accountId;\n }) as ICloudrunLoadBalancer;\n\n if (this.loadBalancer) {\n this.state.loading = false;\n this.app.getDataSource('loadBalancers').onRefresh(this.$scope, () => this.extractLoadBalancer());\n } else {\n this.autoClose();\n }\n }\n\n public deleteLoadBalancer(): void {\n const taskMonitor = {\n application: this.app,\n title: 'Deleting ' + this.loadBalancer.name,\n };\n\n const submitMethod = () => {\n const loadBalancer: ILoadBalancerDeleteCommand = {\n cloudProvider: this.loadBalancer.cloudProvider,\n loadBalancerName: this.loadBalancer.name,\n credentials: this.loadBalancer.account,\n };\n return LoadBalancerWriter.deleteLoadBalancer(loadBalancer, this.app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really delete ' + this.loadBalancer.name + '?',\n buttonText: 'Delete ' + this.loadBalancer.name,\n body: this.getConfirmationModalBodyHtml(),\n account: this.loadBalancer.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n });\n }\n\n public canDeleteLoadBalancer(): boolean {\n return this.loadBalancer.name !== 'default';\n }\n\n private getConfirmationModalBodyHtml(): string {\n const serverGroupNames = this.loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n const hasAny = serverGroupNames ? serverGroupNames.length > 0 : false;\n const hasMoreThanOne = serverGroupNames ? serverGroupNames.length > 1 : false;\n\n // HTML accepted by the confirmationModalService is static (i.e., not managed by angular).\n if (hasAny) {\n if (hasMoreThanOne) {\n const listOfServerGroupNames = serverGroupNames.map((name) => `<li>${name}</li>`).join('');\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy the following server groups:\n <ul>\n ${listOfServerGroupNames}\n </ul>\n </p>\n </div>\n `;\n } else {\n return `<div class=\"alert alert-warning\">\n <p>\n Deleting <b>${this.loadBalancer.name}</b> will destroy <b>${serverGroupNames[0]}</b>.\n </p>\n </div>\n `;\n }\n } else {\n return null;\n }\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.cloudrun.loadBalancerDetails.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL, []).controller(\n 'cloudrunLoadBalancerDetailsCtrl',\n CloudrunLoadBalancerDetailsController,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService, IModalServiceInstance } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry } from '@spinnaker/core';\n\nclass CloudrunLoadBalancerChoiceModalCtrl implements IController {\n public state = { loading: true };\n public loadBalancers: ILoadBalancer[];\n public selectedLoadBalancer: ILoadBalancer;\n\n public static $inject = ['$uibModal', '$uibModalInstance', 'application'];\n constructor(\n private $uibModal: IModalService,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.initialize();\n }\n\n public submit(): void {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n const updatedLoadBalancerPromise = this.$uibModal.open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.application,\n loadBalancer: () => cloneDeep(this.selectedLoadBalancer),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n }).result;\n\n this.$uibModalInstance.close(updatedLoadBalancerPromise);\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n private initialize(): void {\n this.application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n this.loadBalancers = (this.application.loadBalancers.data as ILoadBalancer[]).filter(\n (candidate) => candidate.cloudProvider === 'cloudrun',\n );\n\n if (this.loadBalancers.length) {\n this.selectedLoadBalancer = this.loadBalancers[0];\n }\n this.state.loading = false;\n });\n }\n}\n\nexport const CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL = 'spinnaker.Cloudrun.loadBalancerChoiceModal.controller';\nmodule(CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL, []).controller(\n 'cloudrunLoadBalancerChoiceModelCtrl',\n CloudrunLoadBalancerChoiceModalCtrl,\n);\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { cloneDeep } from 'lodash';\n\nimport type { ILoadBalancer } from '@spinnaker/core';\nimport { CloudProviderRegistry, Registry } from '@spinnaker/core';\n\nimport { CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL } from './loadBalancerChoice.modal.controller';\n\nclass CloudrunEditLoadBalancerStageCtrl implements IController {\n public static $inject = ['$scope', '$uibModal'];\n constructor(public $scope: any, private $uibModal: IModalService) {\n $scope.stage.loadBalancers = $scope.stage.loadBalancers || [];\n $scope.stage.cloudProvider = 'cloudrun';\n }\n\n public addLoadBalancer(): void {\n this.$uibModal\n .open({\n templateUrl: require('./loadBalancerChoice.modal.html'),\n controller: `cloudrunLoadBalancerChoiceModelCtrl as ctrl`,\n resolve: {\n application: () => this.$scope.application,\n },\n })\n .result.then((newLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers.push(newLoadBalancer);\n })\n .catch(() => {});\n }\n\n public editLoadBalancer(index: number) {\n const config = CloudProviderRegistry.getValue('cloudrun', 'loadBalancer');\n this.$uibModal\n .open({\n templateUrl: config.createLoadBalancerTemplateUrl,\n controller: `${config.createLoadBalancerController} as ctrl`,\n size: 'lg',\n resolve: {\n application: () => this.$scope.application,\n loadBalancer: () => cloneDeep(this.$scope.stage.loadBalancers[index]),\n isNew: () => false,\n forPipelineConfig: () => true,\n },\n })\n .result.then((updatedLoadBalancer: ILoadBalancer) => {\n this.$scope.stage.loadBalancers[index] = updatedLoadBalancer;\n })\n .catch(() => {});\n }\n\n public removeLoadBalancer(index: number): void {\n this.$scope.stage.loadBalancers.splice(index, 1);\n }\n}\n\nexport const CLOUDRUN_EDIT_LOAD_BALANCER_STAGE = 'spinnaker.cloudrun.pipeline.stage.editLoadBalancerStage';\nmodule(CLOUDRUN_EDIT_LOAD_BALANCER_STAGE, [CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Edit Load Balancer (Cloud Run)',\n description: 'Edits a load balancer',\n key: 'upsertCloudrunLoadBalancers',\n cloudProvider: 'cloudrun',\n templateUrl: require('./editLoadBalancerStage.html'),\n executionDetailsUrl: require('./editLoadBalancerExecutionDetails.html'),\n executionConfigSections: ['editLoadBalancerConfig', 'taskStatus'],\n controller: 'cloudrunEditLoadBalancerStageCtrl',\n controllerAs: 'editLoadBalancerStageCtrl',\n validators: [],\n });\n })\n .controller('cloudrunEditLoadBalancerStageCtrl', CloudrunEditLoadBalancerStageCtrl);\n","import { module } from 'angular';\n\nimport { CLOUDRUN_EDIT_LOAD_BALANCER_STAGE } from './stages/editLoadBalancer/cloudrunEditLoadBalancerStage';\n\nexport const CLOUDRUN_PIPELINE_MODULE = 'spinnaker.cloudrun.pipeline.module';\nmodule(CLOUDRUN_PIPELINE_MODULE, [CLOUDRUN_EDIT_LOAD_BALANCER_STAGE]);\n","import React from 'react';\n\nimport type { IArtifact, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';\nimport { ArtifactTypePatterns, StageArtifactSelector } from '@spinnaker/core';\n\nexport interface IManifestBindArtifact {\n expectedArtifactId?: string;\n artifact?: IArtifact;\n}\n\nexport interface IManifestBindArtifactsSelectorProps {\n pipeline: IPipeline;\n stage: IStage;\n bindings?: IManifestBindArtifact[];\n onChangeBindings: (_: IManifestBindArtifact[]) => void;\n}\n\nexport class ManifestBindArtifactsSelector extends React.Component<IManifestBindArtifactsSelectorProps> {\n private onChangeBinding = (index: number, binding: IManifestBindArtifact) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings[index] = binding;\n this.props.onChangeBindings(bindings);\n };\n\n private onRemoveBinding = (index: number) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings.splice(index, 1);\n this.props.onChangeBindings(bindings);\n };\n\n public render() {\n const { stage, pipeline, bindings } = this.props;\n\n const renderSelect = (i: number, binding?: IManifestBindArtifact) => {\n const key = (!binding && 'new') || binding.expectedArtifactId || (binding.artifact && binding.artifact.id);\n return (\n <div className=\"row\" key={key}>\n <div className=\"col-md-10\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n expectedArtifactId={binding && binding.expectedArtifactId}\n artifact={!!binding && binding.artifact}\n onArtifactEdited={(artifact: IArtifact) => this.onChangeBinding(i, { artifact: artifact })}\n onExpectedArtifactSelected={(expectedArtifact: IExpectedArtifact) =>\n this.onChangeBinding(i, { expectedArtifactId: expectedArtifact.id })\n }\n excludedArtifactIds={bindings.map((b) => b.expectedArtifactId)}\n excludedArtifactTypePatterns={[ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE]}\n />\n </div>\n {binding && (\n <div className=\"col-md-2\">\n <a className=\"glyphicon glyphicon-trash\" onClick={() => this.onRemoveBinding(i)} />\n </div>\n )}\n </div>\n );\n };\n const renderSelectEditable = (binding: IManifestBindArtifact, i: number) => renderSelect(i, binding);\n\n return (\n <>\n {bindings.map(renderSelectEditable)}\n {renderSelect(bindings.length)}\n </>\n );\n }\n}\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IAccount } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField } from '@spinnaker/core';\n\nimport type { ICloudrunManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n}\n\nexport function ManifestBasicSettings({ accounts, onAccountSelect, selectedAccount }: IManifestBasicSettingsProps) {\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Account <HelpField id=\"cloudrun.manifest.account\" />\n </div>\n <div className=\"col-md-8\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<ICloudrunManifestCommandData>;\n}\n\nexport class WizardManifestBasicSettings extends React.Component<IWizardManifestBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n public render() {\n const { formik } = this.props;\n return (\n <ManifestBasicSettings\n accounts={formik.values.metadata.backingData.accounts}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command.account}\n />\n );\n }\n}\n","import React from 'react';\n\nexport interface IServerGroupNamePreviewProps {\n application: string;\n stack: string;\n details: string;\n}\n\nexport class ServerGroupNamePreview extends React.Component<IServerGroupNamePreviewProps> {\n public render() {\n const application = this.props.application ? this.props.application : '';\n const stack = this.props.stack ? `-${this.props.stack}` : '';\n\n const details = this.props.details ? `-${this.props.details}` : '';\n return (\n <pre style={{ textAlign: 'center' }}>\n <p> Your server group will be in the cluster:</p>\n <p>\n <b>\n {application}\n {stack}\n {details}\n </b>\n </p>\n </pre>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\nimport { ServerGroupNamePreview } from './serverGroupNamePreview';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n application: string;\n stack: string;\n details: string;\n}\n\nexport class DeployStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const stage = this.props.formik.values;\n const manifests: any[] = get(props.formik.values, 'manifests');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(manifests) && isTextManifest ? yamlDocumentsToString(manifests) : '',\n application: this.props.application.name,\n stack: get(stage, 'stack'),\n details: get(stage, 'details'),\n };\n }\n\n private getSourceOptions = (): Array<Option<string>> => {\n return map([ManifestSource.TEXT, ManifestSource.ARTIFACT], (option) => ({\n label: capitalize(option),\n value: option,\n }));\n };\n\n private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('manifests', manifests);\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.formik.setFieldValue('manifestArtifactId', expectedArtifactId);\n this.props.formik.setFieldValue('manifestArtifact', null);\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.formik.setFieldValue('manifestArtifactId', null);\n this.props.formik.setFieldValue('manifestArtifact', artifact);\n };\n\n private getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.formik.values;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.formik.setFieldValue(\n 'requiredArtifactIds',\n bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n );\n this.props.formik.setFieldValue(\n 'requiredArtifacts',\n bindings.filter((b) => b.artifact),\n );\n };\n\n public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n accounts={this.props.accounts}\n onAccountSelect={(accountName) => this.props.formik.setFieldValue('account', accountName)}\n selectedAccount={stage.account}\n />\n <StageConfigField label=\"Application\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={this.props.application.name}\n onChange={(event) => this.props.formik.setFieldValue('application', event.target.value)}\n disabled\n />\n </StageConfigField>\n <StageConfigField label=\"Stack\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.stack}\n onChange={(event) => this.props.formik.setFieldValue('stack', event.target.value)}\n />\n </StageConfigField>\n <StageConfigField label=\"Details\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.details}\n onChange={(event) => this.props.formik.setFieldValue('details', event.target.value)}\n />\n </StageConfigField>\n <ServerGroupNamePreview\n application={this.props.application.name}\n stack={stage.stack}\n details={stage.details}\n ></ServerGroupNamePreview>\n\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"cloudrun.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.formik.setFieldValue('source', e.target.value)}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <StageConfigField label=\"Manifest\">\n <YamlEditor onChange={this.handleRawManifestChange} value={this.state.rawManifest} />\n </StageConfigField>\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"cloudrun.manifest.expectedArtifact\"\n label=\"Manifest Artifact\"\n onArtifactEdited={this.onManifestArtifactEdited}\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onManifestArtifactSelected(artifact.id)}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n <StageConfigField label=\"Expression Evaluation\" helpKey=\"cloudrun.manifest.skipExpressionEvaluation\">\n <CheckboxInput\n checked={stage.skipExpressionEvaluation === true}\n onChange={(e: any) => this.props.formik.setFieldValue('skipExpressionEvaluation', e.target.checked)}\n text=\"Skip SpEL expression evaluation\"\n />\n </StageConfigField>\n </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"cloudrun.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n </div>\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type { IAccountDetails, IStage, IStageConfigProps } from '@spinnaker/core';\nimport { AccountService, FormikStageConfig } from '@spinnaker/core';\n\nimport { DeployStageForm } from './DeployStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployStageConfig extends React.Component<IStageConfigProps, IDeployManifestStageConfigState> {\n private stage: IStage;\n private destroy$ = new Subject();\n\n public constructor(props: IStageConfigProps) {\n super(props);\n this.state = {\n accounts: [],\n };\n const { stage: initialStageConfig } = props;\n const stage = cloneDeep(initialStageConfig);\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n if (!stage.skipExpressionEvaluation) {\n stage.skipExpressionEvaluation = false;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'cloudrun';\n }\n if (!stage.moniker) {\n stage.moniker = {};\n }\n if (!stage.moniker.app) {\n stage.moniker.app = props.application.name;\n }\n // Intentionally initializing the stage config only once in the constructor\n // The stage config is then completely owned within FormikStageConfig's Formik state\n this.stage = stage;\n }\n\n public componentDidMount() {\n this.fetchAccounts();\n }\n\n private fetchAccounts = (): void => {\n observableFrom(AccountService.getAllAccountDetailsForProvider('cloudrun'))\n .pipe(takeUntil(this.destroy$))\n .subscribe((accounts: IAccountDetails[]) => {\n this.setState({ accounts });\n });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <DeployStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\n}\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyRedBlack: IDeploymentStrategy = {\n label: 'Red/Black',\n description: 'Disables <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'redblack',\n};\n","import { get, isEmpty } from 'lodash';\n\nimport type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { strategyRedBlack } from '../../../rolloutStrategy/redblack.strategy';\n\nconst MAX_VERSION_HISTORY_ANNOTATION = 'strategy.spinnaker.io/max-version-history';\n\nexport const deployValidators = (): IValidatorConfig[] => {\n return [\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'source', fieldLabel: 'Source' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IStage) => {\n const enabled = get(stage, 'trafficManagement.enabled', false);\n const services = get(stage, 'trafficManagement.options.services', []);\n if (enabled && isEmpty(services)) {\n return `Select at least one <strong>Service</strong> to enable Spinnaker-managed rollout strategy options.`;\n }\n if (enabled && stage.source === ManifestSource.TEXT) {\n const manifests = get(stage, 'manifests', []);\n const replicaSetManifests = manifests.filter((m) => m.kind === 'ReplicaSet');\n const strategy = get(stage, 'trafficManagement.options.strategy');\n const maxVersionHistory = parseInt(\n get(replicaSetManifests, [0, 'metadata', 'annotations', MAX_VERSION_HISTORY_ANNOTATION]),\n 10,\n );\n if (strategy === strategyRedBlack.key && maxVersionHistory < 2) {\n return `The max version history specified in your manifest conflicts with the behavior of the Red/Black rollout strategy. Please update your <strong>${MAX_VERSION_HISTORY_ANNOTATION}</strong> annotation to a value greater than or equal to 2.`;\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import React from 'react';\nimport type { IManifest } from '@spinnaker/core';\n\ninterface IStatusClasses {\n [key: string]: string;\n}\n\nconst STATUS_PILLS: IStatusClasses = {\n available: 'success',\n stable: 'success',\n paused: 'warn',\n failed: 'danger',\n};\n\nexport interface IDeployManifestStatusProps {\n manifest: IManifest;\n}\n\nexport class DeployManifestStatusPills extends React.Component<IDeployManifestStatusProps> {\n public render() {\n const { manifest } = this.props;\n if (manifest == null || manifest.status == null) {\n return null;\n }\n return Object.keys(manifest.status).map((statusKey, i) => {\n const statusDescription = manifest.status[statusKey];\n const statusClass = STATUS_PILLS[statusKey] || '';\n const isStable = statusDescription.state;\n const isUnstableWithMessage = !isStable && statusDescription.message;\n return (\n <span key={i}>\n {isStable && (\n <span title={statusDescription.message} className={`pill ${statusClass}`}>\n {statusKey}\n </span>\n )}\n {isUnstableWithMessage && (\n <span title={statusDescription.message} className=\"pill warn\">\n {statusKey}\n </span>\n )}\n <span> </span>\n </span>\n );\n });\n }\n}\n","import { get, trim } from 'lodash';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { AccountService, ReactInjector } from '@spinnaker/core';\n\nconst UNMAPPED_K8S_RESOURCE_STATE_KEY = 'cloudrunResource';\n\nexport interface IManifestDetailsProps {\n manifest: IManifest;\n linkName: string;\n accountId: string;\n}\n\nexport interface IManifestDetailsState {\n url: string;\n}\n\nexport class ManifestDetailsLink extends React.Component<IManifestDetailsProps, IManifestDetailsState> {\n private spinnakerKindStateMap: { [k: string]: string } = {\n // keys from clouddriver's CloudrunSpinnakerKindMap\n serverGroupManagers: 'serverGroupManager',\n serverGroups: 'serverGroup',\n };\n\n constructor(props: IManifestDetailsProps) {\n super(props);\n this.state = {\n url: '',\n };\n this.loadUrl();\n }\n\n private canOpen(): boolean {\n return !!this.props.manifest.manifest && !!this.state.url;\n }\n\n private spinnakerKindFromCloudrunKind(kind: string, kindMap: { [k: string]: string }) {\n const foundKind = Object.keys(kindMap).find((k) => k.toLowerCase() === kind.toLowerCase());\n return kindMap[foundKind];\n }\n\n private resourceRegion(): string {\n return trim(\n get(this.props, ['manifest', 'manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n }\n\n private getStateParams(stateKey: string): any {\n const kind = this.props.manifest.manifest.kind.toLowerCase();\n const name = this.props.manifest.manifest.metadata.name;\n const region = this.resourceRegion();\n const params: { [k: string]: string } = {\n accountId: this.props.accountId,\n provider: 'cloudrun',\n region,\n reg: region, // Filters the list of clusters on the Clusters screen to those in the same namespace\n [stateKey]: `${kind} ${name}`,\n };\n if (!params.region && kind === 'namespace' && stateKey === UNMAPPED_K8S_RESOURCE_STATE_KEY) {\n params.region = name;\n }\n if (!params.region || params.region === '') {\n params.region = '_';\n }\n return params;\n }\n\n private loadUrl() {\n const kind: string = get(this.props, ['manifest', 'manifest', 'kind'], '');\n const { accountId } = this.props;\n AccountService.getAccountDetails(accountId).then((account) => {\n const spinnakerKind = this.spinnakerKindFromCloudrunKind(kind, account.spinnakerKindMap);\n const stateKey = this.spinnakerKindStateMap[spinnakerKind] || UNMAPPED_K8S_RESOURCE_STATE_KEY;\n const params = this.getStateParams(stateKey);\n const url = ReactInjector.$state.href(`home.applications.application.insight.clusters.${stateKey}`, params);\n this.setState({ url });\n });\n }\n\n public render() {\n if (this.canOpen()) {\n return (\n <a href={this.state.url} className=\"clickable\">\n {this.props.linkName}\n </a>\n );\n } else {\n return null;\n }\n }\n}\n","import { get, trim } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest, IManifestEvent } from '@spinnaker/core';\nimport { JobEventBasedPodNameProvider, JobManifestPodLogs, relativeTime } from '@spinnaker/core';\n\nexport interface IManifestEventsProps {\n manifest: IManifest;\n}\n\nexport class ManifestEvents extends React.Component<IManifestEventsProps> {\n private pillStyle(e: IManifestEvent): string {\n if (e.type === 'Warning') {\n return 'alert';\n } else if (e.type === 'Normal') {\n return 'success';\n } else {\n return '';\n }\n }\n\n public render() {\n if (!this.props.manifest) {\n return null;\n }\n if (this.props.manifest && (!this.props.manifest.events || this.props.manifest.events.length === 0)) {\n return <div>No recent events found - Cloud Run does not store events for long.</div>;\n }\n const { events } = this.props.manifest;\n const namespace = trim(\n get(this.props.manifest, ['manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n return events.map((e, i) => {\n const firstTimestamp = get(e, 'firstTimestamp', '');\n const lastTimestamp = get(e, 'lastTimestamp', '');\n let firstEpochMilliseconds = 0;\n let lastEpochMilliseconds = 0;\n if (firstTimestamp) {\n firstEpochMilliseconds = DateTime.fromISO(firstTimestamp).toMillis();\n }\n if (lastTimestamp) {\n lastEpochMilliseconds = DateTime.fromISO(lastTimestamp).toMillis();\n }\n return (\n <div key={get(e, ['metadata', 'uid'], String(i))} className=\"info\">\n <div className=\"horizontal\">\n {e.count && (\n <div className={`pill ${this.pillStyle(e)}`}>\n {e.count} × <b>{e.reason}</b>\n </div>\n )}\n </div>\n {(e.firstTimestamp || e.lastTimestamp) && (\n <div>\n {e.firstTimestamp === e.lastTimestamp && (\n <div>\n <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n )}\n {e.firstTimestamp !== e.lastTimestamp && (\n <div>\n <div>\n First Occurrence: <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n <div>\n Last Occurrence: <i>{relativeTime(lastEpochMilliseconds)}</i>\n </div>\n </div>\n )}\n </div>\n )}\n <div>{e.message}</div>\n <div>\n <JobManifestPodLogs\n account={this.props.manifest.account}\n location={namespace}\n podNamesProviders={[new JobEventBasedPodNameProvider(this.props.manifest, e)]}\n linkName=\"Console Output (Raw)\"\n />\n </div>\n {i !== events.length - 1 && <br />}\n </div>\n );\n });\n }\n}\n","import { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { CopyToClipboard, ManifestYaml } from '@spinnaker/core';\n\nimport { DeployManifestStatusPills } from './DeployStatusPills';\nimport { ManifestDetailsLink } from './ManifestDetailsLink';\nimport { ManifestEvents } from './ManifestEvents';\n\nimport './ManifestStatus.less';\n\nexport interface IManifestStatusProps {\n account: string;\n manifest: IManifest;\n}\n\nexport function ManifestStatus({ account, manifest }: IManifestStatusProps) {\n return (\n <>\n <dl className=\"manifest-status\" key=\"manifest-status\">\n <dt>{manifest.manifest.kind}</dt>\n <dd>\n <CopyToClipboard\n displayText={true}\n text={manifest.manifest.metadata.name}\n toolTip={`Copy ${manifest.manifest.metadata.name}`}\n />\n \n <DeployManifestStatusPills manifest={manifest} />\n </dd>\n </dl>\n <div className=\"manifest-support-links\" key=\"manifest-support-links\">\n <ManifestYaml\n linkName=\"YAML\"\n manifestText={dump(manifest.manifest)}\n modalTitle={manifest.manifest.metadata.name}\n />\n <ManifestDetailsLink linkName=\"Details\" manifest={manifest} accountId={account} />\n </div>\n <div className=\"manifest-events pad-left\" key=\"manifest-events\">\n <ManifestEvents manifest={manifest} />\n </div>\n </>\n );\n}\n","import type { Application, IManifest } from '@spinnaker/core';\nimport { ManifestReader } from '@spinnaker/core';\n\nexport interface IStageManifest {\n kind: string;\n apiVersion: string;\n metadata: {\n namespace: string;\n name: string;\n };\n}\n\nexport interface IManifestParams {\n account: string;\n location: string;\n name: string;\n}\n\nexport type IManifestCallback = (manifest: IManifest) => void;\n\nexport class CloudrunManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n CloudrunManifestService.updateManifest(params, fn);\n return app.onRefresh(null, () => CloudrunManifestService.updateManifest(params, fn));\n }\n\n private static updateManifest(params: IManifestParams, fn: IManifestCallback) {\n ManifestReader.getManifest(params.account, params.location, params.name).then((manifest) => fn(manifest));\n }\n\n public static manifestIdentifier(manifest: IStageManifest) {\n const kind = manifest.kind.toLowerCase();\n // manifest.metadata.namespace doesn't exist if it's a namespace being deployed\n const namespace = (manifest.metadata.namespace || '_').toLowerCase();\n const name = manifest.metadata.name.toLowerCase();\n const apiVersion = (manifest.apiVersion || '_').toLowerCase();\n // assuming this identifier is opaque and not parsed anywhere. Including the\n // apiVersion will prevent collisions with CRD kinds without having any visible\n // effect elsewhere\n return `${namespace} ${kind} ${apiVersion} ${name}`;\n }\n\n public static stageManifestToManifestParams(manifest: IStageManifest, account: string): IManifestParams {\n return {\n account,\n name: CloudrunManifestService.scopedKind(manifest) + ' ' + manifest.metadata.name,\n location: manifest.metadata.namespace == null ? '_' : manifest.metadata.namespace,\n };\n }\n\n private static apiGroup(manifest: IStageManifest): string {\n const parts = (manifest.apiVersion || '_').split('/');\n if (parts.length < 2) {\n return '';\n }\n return parts[0];\n }\n\n private static isCRDGroup(manifest: IStageManifest): boolean {\n return !CloudrunManifestService.BUILT_IN_GROUPS.includes(CloudrunManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (CloudrunManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + CloudrunManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n private static readonly BUILT_IN_GROUPS = [\n '',\n 'core',\n 'batch',\n 'apps',\n 'extensions',\n 'storage.k8s.io',\n 'apiextensions.k8s.io',\n 'apiregistration.k8s.io',\n 'policy',\n 'scheduling.k8s.io',\n 'settings.k8s.io',\n 'authorization.k8s.io',\n 'authentication.k8s.io',\n 'rbac.authorization.k8s.io',\n 'certifcates.k8s.io',\n 'networking.k8s.io',\n ];\n}\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IManifest } from '@spinnaker/core';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport { ManifestStatus } from './ManifestStatus';\nimport type { IStageManifest } from '../../../../manifest/manifest.service';\nimport { CloudrunManifestService } from '../../../../manifest/manifest.service';\n\nexport interface IManifestSubscription {\n id: string;\n unsubscribe: () => void;\n manifest: IManifest;\n}\n\nexport interface IDeployStatusState {\n subscriptions: IManifestSubscription[];\n manifestIds: string[];\n}\n\nexport class DeployStatus extends React.Component<IExecutionDetailsSectionProps, IDeployStatusState> {\n public static title = 'deployStatus';\n\n constructor(props: IExecutionDetailsSectionProps) {\n super(props);\n this.state = { subscriptions: [], manifestIds: [] };\n }\n\n public componentDidMount() {\n this.componentDidUpdate(this.props, this.state);\n }\n\n public componentWillUnmount() {\n this.unsubscribeAll();\n }\n\n public componentDidUpdate(_prevProps: IExecutionDetailsSectionProps, prevState: IDeployStatusState) {\n const manifests: IStageManifest[] = get(this.props.stage, ['context', 'outputs.manifests'], []).filter((m) => !!m);\n const manifestIds = manifests.map((m) => CloudrunManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = CloudrunManifestService.manifestIdentifier(manifest);\n return {\n id,\n unsubscribe: this.subscribeToManifestUpdates(id, manifest),\n manifest: this.stageManifestToIManifest(manifest, this.props.stage.context.account),\n };\n });\n this.setState({ subscriptions, manifestIds });\n }\n }\n\n private subscribeToManifestUpdates(id: string, manifest: IStageManifest): () => void {\n const params = CloudrunManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return CloudrunManifestService.subscribe(this.props.application, params, (updated: IManifest) => {\n const idx = this.state.subscriptions.findIndex((sub) => sub.id === id);\n if (idx !== -1) {\n const subscription = { ...this.state.subscriptions[idx], manifest: updated };\n const subscriptions = [...this.state.subscriptions];\n subscriptions[idx] = subscription;\n this.setState({ subscriptions });\n }\n });\n }\n\n private unsubscribeAll() {\n this.state.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n }\n\n private stageManifestToIManifest(manifest: IStageManifest, account: string): IManifest {\n return {\n name: get(manifest, 'metadata.name', ''),\n moniker: null,\n account,\n cloudProvider: 'cloudrun',\n location: get(manifest, 'metadata.namespace', ''),\n manifest: manifest,\n status: {},\n artifacts: [],\n events: [],\n };\n }\n\n public render() {\n const { name: sectionName, current: currentSection, stage } = this.props;\n const manifests: IManifest[] = this.state.subscriptions.filter((sub) => !!sub.manifest).map((sub) => sub.manifest);\n return (\n <ExecutionDetailsSection name={sectionName} current={currentSection}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {manifests && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n {manifests.map((manifest) => {\n const uid =\n manifest.manifest.metadata.uid || CloudrunManifestService.manifestIdentifier(manifest.manifest);\n return <ManifestStatus key={uid} manifest={manifest} account={stage.context.account} />;\n })}\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n }\n}\n","import type { IStage } from '@spinnaker/core';\nimport {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { DeployStageConfig } from './DeployStageConfig';\nimport { deployValidators } from './deploy.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Cloud Run)',\n description: 'Deploy a Cloud Run manifest yaml/json file.',\n key: 'deployCloudrunManifest',\n cloudProvider: 'cloudrun',\n component: DeployStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployValidators(),\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface ICloudrunProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n };\n}\n\nexport const CloudrunProviderSettings: ICloudrunProviderSettings = (SETTINGS.providers\n .cloudrun as ICloudrunProviderSettings) || { defaults: {} };\nif (CloudrunProviderSettings) {\n CloudrunProviderSettings.resetToOriginal = SETTINGS.resetProvider('cloudrun');\n}\n","import { module } from 'angular';\nimport { cloneDeep } from 'lodash';\nimport { $q } from 'ngimport';\n\nimport type {\n Application,\n IAccountDetails,\n IExpectedArtifact,\n IMoniker,\n IPipeline,\n IServerGroupCommand,\n IServerGroupCommandViewState,\n IStage,\n} from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { CloudrunProviderSettings } from '../../cloudrun.settings';\nimport type { CloudrunDeployDescription } from '../serverGroupTransformer.service';\n\nexport enum ServerGroupSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n\nexport interface ICloudrunServerGroupCommandData {\n command: ICloudrunServerGroupCommand;\n metadata: ICloudrunServerGroupCommandMetadata;\n stack: string;\n freeFormDetails: string;\n configFiles: string[];\n}\n\nexport interface ICloudrunServerGroupCommand extends Omit<IServerGroupCommand, 'source' | 'application'> {\n application?: string;\n stack?: string;\n detail?: string;\n account: string;\n configFiles: string[];\n freeFormDetails: string;\n region: string;\n regions: [];\n isNew?: boolean;\n cloudProvider: string;\n provider: string;\n selectedProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: ICloudrunServerGroupSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ServerGroupSource;\n versioned?: boolean;\n gitCredentialType?: string;\n viewState: IServerGroupCommandViewState;\n mode: string;\n credentials: string;\n sourceType: string;\n configArtifacts: any[];\n interestingHealthProviderNames: [];\n fromArtifact: boolean;\n}\n\nexport interface IViewState {\n mode: string;\n submitButtonLabel: string;\n disableStrategySelection: boolean;\n stage?: IStage;\n pipeline?: IPipeline;\n}\n\nexport interface ICloudrunServerGroupCommandMetadata {\n backingData: any;\n}\n\nexport interface ICloudrunServerGroupSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nconst getSubmitButtonLabel = (mode: string): string => {\n switch (mode) {\n case 'createPipeline':\n return 'Add';\n case 'editPipeline':\n return 'Done';\n default:\n return 'Create';\n }\n};\n\nexport class CloudrunV2ServerGroupCommandBuilder {\n // new add servergroup\n public buildNewServerGroupCommand(app: Application): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'create');\n }\n\n // add servergroup from deploy stage of pipeline\n public buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline) {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommandForPipeline(_stage, pipeline);\n }\n\n // edit servergroup from deploy stage of pipeline\n // add servergroup from deploy stage of pipeline\n public buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ) {\n return CloudrunServerGroupCommandBuilder.buildServerGroupCommandFromPipeline(app, cluster, _stage, pipeline);\n }\n}\n\nexport class CloudrunServerGroupCommandBuilder {\n public static $inject = ['$q'];\n public static ServerGroupCommandIsValid(command: ICloudrunServerGroupCommand): boolean {\n if (!command.moniker) {\n return false;\n }\n\n if (!command.moniker.app) {\n return false;\n }\n\n return true;\n }\n\n public static copyAndCleanCommand(input: ICloudrunServerGroupCommand): ICloudrunServerGroupCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n // deploy stage : construct servergroup command\n public static buildNewServerGroupCommandForPipeline(stage: IStage, pipeline: IPipeline): any {\n const command: any = this.buildNewServerGroupCommand(\n { name: pipeline.application } as Application,\n 'cloudrun',\n 'createPipeline',\n );\n command.viewState = {\n ...command.viewState,\n pipeline,\n requiresTemplateSelection: true,\n stage,\n };\n return command;\n }\n\n private static getExpectedArtifacts(pipeline: IPipeline): IExpectedArtifact[] {\n return pipeline.expectedArtifacts || [];\n }\n\n public static buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'editPipeline').then(\n (command: ICloudrunServerGroupCommandData) => {\n command = {\n ...command,\n ...cluster,\n\n backingData: {\n ...command.metadata.backingData.backingData,\n\n expectedArtifacts: CloudrunServerGroupCommandBuilder.getExpectedArtifacts(pipeline),\n },\n credentials: cluster.account || command.metadata.backingData.credentials,\n viewState: {\n ...command.metadata.backingData.viewState,\n stage: _stage,\n pipeline,\n },\n } as ICloudrunServerGroupCommandData;\n return command;\n },\n );\n }\n\n public static getCredentials(accounts: IAccountDetails[]): string {\n const accountNames: string[] = (accounts || []).map((account) => account.name);\n const defaultCredentials: string = CloudrunProviderSettings.defaults.account;\n\n return accountNames.includes(defaultCredentials) ? defaultCredentials : accountNames[0];\n }\n\n public static getRegion(accounts: any[], credentials: string): string {\n const account = accounts.find((_account) => _account.name === credentials);\n return account ? account.region : null;\n }\n\n // new servergroup command\n public static buildNewServerGroupCommand(\n app: Application,\n sourceAccount: string,\n mode: string,\n ): PromiseLike<ICloudrunServerGroupCommandData> {\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('cloudrun'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n return $q.all(dataToFetch).then((backingData: { accounts: IAccountDetails[] }) => {\n const { accounts } = backingData;\n\n const account = accounts.some((a) => a.name === sourceAccount)\n ? accounts.find((a) => a.name === sourceAccount).name\n : accounts.length\n ? accounts[0].name\n : null;\n const viewState: IViewState = {\n mode,\n submitButtonLabel: getSubmitButtonLabel(mode),\n disableStrategySelection: mode === 'create',\n };\n const credentials = account ? account : this.getCredentials(accounts);\n const region = this.getRegion(backingData.accounts, credentials);\n const cloudProvider = 'cloudrun';\n\n return {\n command: {\n application: app.name,\n configFiles: [''],\n cloudProvider,\n selectedProvider: cloudProvider,\n provider: cloudProvider,\n region,\n credentials,\n gitCredentialType: 'NONE',\n manifest: null,\n sourceType: 'git',\n configArtifacts: [],\n interestingHealthProviderNames: [],\n fromArtifact: false,\n account,\n viewState,\n },\n metadata: {\n backingData,\n },\n } as ICloudrunServerGroupCommandData;\n });\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.cloudrun.serverGroup.commandBuilder.service';\n\nmodule(CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER, []).service(\n 'cloudrunV2ServerGroupCommandBuilder',\n CloudrunV2ServerGroupCommandBuilder,\n);\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { Application, IAccount, IServerGroup } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField, NameUtils, ReactInjector, ServerGroupNamePreview } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n formik: IWizardServerGroupBasicSettingsProps['formik'];\n onEnterStack: (stack: string) => void;\n detailsChanged: (detail: string) => void;\n app: Application;\n}\n\nexport interface IServerGroupBasicSettingsState {\n namePreview: string;\n createsNewCluster: boolean;\n latestServerGroup: IServerGroup;\n}\n\nexport function ServerGroupBasicSettings({\n accounts,\n onAccountSelect,\n selectedAccount,\n formik,\n onEnterStack,\n detailsChanged,\n app,\n}: IServerGroupBasicSettingsProps) {\n const { values } = formik;\n const { stack = '', freeFormDetails } = values;\n\n const namePreview = NameUtils.getClusterName(app.name, stack, freeFormDetails);\n const createsNewCluster = !app.clusters.find((c) => c.name === namePreview);\n const inCluster = (app.serverGroups.data as IServerGroup[])\n .filter((serverGroup) => {\n return (\n serverGroup.cluster === namePreview &&\n serverGroup.account === values.command.credentials &&\n serverGroup.region === values.command.region\n );\n })\n .sort((a, b) => a.createdTime - b.createdTime);\n const latestServerGroup = inCluster.length ? inCluster.pop() : null;\n\n const navigateToLatestServerGroup = () => {\n const { values } = formik;\n const params = {\n provider: values.command.selectedProvider,\n accountId: latestServerGroup.account,\n region: latestServerGroup.region,\n serverGroup: latestServerGroup.name,\n };\n\n const { $state } = ReactInjector;\n if ($state.is('home.applications.application.insight.clusters')) {\n $state.go('.serverGroup', params);\n } else {\n $state.go('^.serverGroup', params);\n }\n };\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Stack <HelpField id=\"cloudrun.serverGroup.stack\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={stack}\n onChange={(e) => onEnterStack(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Detail <HelpField id=\"cloudrun.serverGroup.detail\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={freeFormDetails}\n onChange={(e) => detailsChanged(e.target.value)}\n />\n </div>\n </div>\n {!values.command.viewState.hideClusterNamePreview && (\n <ServerGroupNamePreview\n createsNewCluster={createsNewCluster}\n latestServerGroupName={latestServerGroup?.name}\n mode={values.command.viewState.mode}\n namePreview={namePreview}\n navigateToLatestServerGroup={navigateToLatestServerGroup}\n />\n )}\n </div>\n );\n}\n\nexport interface IWizardServerGroupBasicSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n app: Application;\n}\n\nexport class WizardServerGroupBasicSettings extends React.Component<IWizardServerGroupBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n private stackChanged = (stack: string): void => {\n const { setFieldValue, values } = this.props.formik;\n values.command.stack = stack;\n setFieldValue('stack', stack);\n };\n\n private freeFormDetailsChanged = (freeFormDetails: string) => {\n const { setFieldValue, values } = this.props.formik;\n values.command.freeFormDetails = freeFormDetails;\n setFieldValue('freeFormDetails', freeFormDetails);\n };\n\n public render() {\n const { formik, app } = this.props;\n return (\n <ServerGroupBasicSettings\n accounts={formik.values.metadata?.backingData?.accounts || []}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command?.account || ''}\n onEnterStack={this.stackChanged}\n formik={formik}\n detailsChanged={this.freeFormDetailsChanged}\n app={app}\n />\n );\n }\n}\n","import type { FormikProps } from 'formik';\nimport React, { useState } from 'react';\n\nimport { HelpField, TextAreaInput } from '@spinnaker/core';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupConfigFilesSettingsProps {\n configFiles: string[];\n onEnterConfig: (file: string[]) => void;\n}\ntype configFiles = IServerGroupConfigFilesSettingsProps['configFiles'];\n\nexport function ServerGroupConfigFilesSettings({ configFiles, onEnterConfig }: IServerGroupConfigFilesSettingsProps) {\n const [configValues, setConfigValues] = useState<configFiles>(configFiles);\n\n function mapTabToSpaces(event: any, i: number) {\n if (event.which === 9) {\n event.preventDefault();\n const cursorPosition = event.target.selectionStart;\n const inputValue = event.target.value;\n event.target.value = `${inputValue.substring(0, cursorPosition)} ${inputValue.substring(cursorPosition)}`;\n event.target.selectionStart += 2;\n }\n const newConfigValues = [...configValues];\n newConfigValues[i] = event.target.value;\n setConfigValues(newConfigValues);\n onEnterConfig(newConfigValues);\n }\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n {configValues.map((configFile, index) => (\n <>\n <div className=\"col-md-3 sm-label-right\">\n Service Yaml\n <HelpField id=\"cloudrun.serverGroup.configFiles\" />{' '}\n </div>\n <div className=\"col-md-8\" key={index}>\n <TextAreaInput\n name={'text' + index}\n value={configFile}\n rows={10}\n onChange={(e) => mapTabToSpaces(e, index)}\n />\n </div>\n </>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface IWizardServerGroupConfigFilesSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n}\n\nexport class WizardServerGroupConfigFilesSettings extends React.Component<IWizardServerGroupConfigFilesSettingsProps> {\n private configUpdated = (configFiles: string[]): void => {\n const { formik } = this.props;\n formik.values.command.configFiles = configFiles;\n formik.setFieldValue('configFiles', configFiles);\n };\n\n // yaml config files input from server group wizard\n public render() {\n const { formik } = this.props;\n return (\n <ServerGroupConfigFilesSettings\n configFiles={formik.values.configFiles || formik.values.command.configFiles}\n onEnterConfig={this.configUpdated}\n />\n );\n }\n}\n","import React from 'react';\nimport type { Application, IModalComponentProps, IStage } from '@spinnaker/core';\n//import type { IModalInstanceService } from 'angular-ui-bootstrap';\nimport { noop, ReactInjector, ReactModal, TaskMonitor, WizardModal, WizardPage } from '@spinnaker/core';\nimport { WizardServerGroupBasicSettings } from './BasicSettings';\nimport { WizardServerGroupConfigFilesSettings } from './ConfigFiles';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\nimport { CloudrunServerGroupCommandBuilder } from '../serverGroupCommandBuilder.service';\n\nexport interface ICloudrunServerGroupModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: ICloudrunServerGroupCommandData;\n isNew?: boolean;\n}\n\nexport interface ICloudrunServerGroupModalState {\n command: ICloudrunServerGroupCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ServerGroupWizard extends React.Component<ICloudrunServerGroupModalProps, ICloudrunServerGroupModalState> {\n public static defaultProps: Partial<ICloudrunServerGroupModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private _isUnmounted = false;\n\n /* private serverGroupWriter: ServerGroupWriter; */\n public static show(props: ICloudrunServerGroupModalProps): Promise<ICloudrunServerGroupCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ServerGroupWizard, props, modalProps);\n }\n\n constructor(props: ICloudrunServerGroupModalProps) {\n super(props);\n if (!props.command) {\n CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(props.application, 'cloudrun', 'create').then(\n (command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n },\n );\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as ICloudrunServerGroupCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${\n props.command.command.viewState.submitButtonLabel === 'Create' ? 'Creating' : 'Updating'\n } your Server Group`,\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n private onTaskComplete = () => {\n this.props.application.serverGroups.refresh();\n this.props.application.serverGroups.onNextRefresh(null, this.onApplicationRefresh);\n };\n\n protected onApplicationRefresh = (): void => {\n if (this._isUnmounted) {\n return;\n }\n\n const { command } = this.props;\n const { taskMonitor } = this.state;\n const cloneStage = taskMonitor.task.execution.stages.find((stage: IStage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][command.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: command.command.credentials,\n region: command.command.region,\n provider: 'cloudrun',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (ReactInjector.$state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if (ReactInjector.$state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n ReactInjector.$state.go(transitionTo, newStateParams);\n }\n }\n };\n\n private submit = (c: ICloudrunServerGroupCommandData): void => {\n const command: any = CloudrunServerGroupCommandBuilder.copyAndCleanCommand(c.command);\n const forPipelineConfig = command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline';\n if (forPipelineConfig) {\n this.props.closeModal && this.props.closeModal(command);\n } else {\n //command.viewState.mode = 'create';\n const submitMethod = () => ReactInjector.serverGroupWriter.cloneServerGroup(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n return null;\n }\n };\n public render() {\n const { dismissModal, application } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n const labelButton = this.state.command.command.viewState.submitButtonLabel;\n\n return (\n <WizardModal<ICloudrunServerGroupCommandData>\n heading={`${labelButton === 'Add' || labelButton === 'Create' ? 'Create New' : 'Update'} Server Group`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={labelButton}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => (\n <WizardServerGroupBasicSettings ref={innerRef} formik={formik} app={application} />\n )}\n />\n\n <WizardPage\n label=\"Service Yaml\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardServerGroupConfigFilesSettings ref={innerRef} formik={formik} />}\n />\n </>\n )}\n />\n );\n }\n}\n","export class CloudrunHealth {\n public static PLATFORM = 'Cloud Run Service';\n}\n","import type { IController, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { Application, ILoadBalancer, IServerGroup, ServerGroupWriter } from '@spinnaker/core';\nimport { ConfirmationModalService, SERVER_GROUP_WRITER, ServerGroupReader } from '@spinnaker/core';\nimport { CloudrunHealth } from '../../common/cloudrunHealth';\nimport type { ICloudrunServerGroup } from '../../interfaces';\n\ninterface IServerGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass CloudrunServerGroupDetailsController implements IController {\n public state = { loading: true };\n public serverGroup: ICloudrunServerGroup;\n\n public static $inject = ['$state', '$scope', 'serverGroup', 'app', 'serverGroupWriter'];\n constructor(\n private $state: any,\n private $scope: IScope,\n serverGroup: IServerGroupFromStateParams,\n public app: Application,\n private serverGroupWriter: ServerGroupWriter,\n ) {\n this.extractServerGroup(serverGroup)\n .then(() => {\n if (!this.$scope.$$destroyed) {\n this.app.getDataSource('serverGroups').onRefresh(this.$scope, () => this.extractServerGroup(serverGroup));\n }\n })\n .catch(() => this.autoClose());\n }\n\n // destroy existing server group\n public canDestroyServerGroup(): boolean {\n if (this.serverGroup) {\n const isCurrentRevision = this.serverGroup.tags.isLatest;\n if (isCurrentRevision) {\n return false;\n } else if (this.serverGroup.disabled) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n public destroyServerGroup(): void {\n const stateParams = {\n name: this.serverGroup.name,\n accountId: this.serverGroup.account,\n region: this.serverGroup.region,\n };\n\n const taskMonitor = {\n application: this.app,\n title: 'Destroying ' + this.serverGroup.name,\n onTaskComplete: () => {\n if (this.$state.includes('**.serverGroup', stateParams)) {\n this.$state.go('^');\n }\n },\n };\n\n const submitMethod = (params: any) => this.serverGroupWriter.destroyServerGroup(this.serverGroup, this.app, params);\n\n const confirmationModalParams = {\n header: 'Really destroy ' + this.serverGroup.name + '?',\n buttonText: 'Destroy ' + this.serverGroup.name,\n account: this.serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: this.app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: CloudrunHealth.PLATFORM,\n\n interestingHealthProviderNames: [] as string[],\n };\n\n if (this.app.attributes.platformHealthOnlyShowOverride && this.app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = [CloudrunHealth.PLATFORM];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n }\n\n private autoClose(): void {\n if (this.$scope.$$destroyed) {\n return;\n } else {\n this.$state.params.allowModalToStayOpen = true;\n this.$state.go('^', null, { location: 'replace' });\n }\n }\n\n private extractServerGroup({ name, accountId, region }: IServerGroupFromStateParams): PromiseLike<void> {\n return ServerGroupReader.getServerGroup(this.app.name, accountId, region, name).then(\n (serverGroupDetails: IServerGroup) => {\n let fromApp = this.app.getDataSource('serverGroups').data.find((toCheck: IServerGroup) => {\n return toCheck.name === name && toCheck.account === accountId && toCheck.region === region;\n });\n\n if (!fromApp) {\n this.app.getDataSource('loadBalancers').data.some((loadBalancer: ILoadBalancer) => {\n if (loadBalancer.account === accountId) {\n return loadBalancer.serverGroups.some((toCheck: IServerGroup) => {\n let result = false;\n if (toCheck.name === name) {\n fromApp = toCheck;\n result = true;\n }\n return result;\n });\n } else {\n return false;\n }\n });\n }\n\n this.serverGroup = { ...serverGroupDetails, ...fromApp };\n this.state.loading = false;\n },\n );\n }\n}\nexport const CLOUDRUN_SERVER_GROUP_DETAILS_CTRL = 'spinnaker.cloudrun.serverGroup.details.controller';\n\nmodule(CLOUDRUN_SERVER_GROUP_DETAILS_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'cloudrunV2ServerGroupDetailsCtrl',\n CloudrunServerGroupDetailsController,\n);\n","import { module } from 'angular';\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommand } from '../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport class CloudrunV2ServerGroupTransformer {\n public static $inject = ['$q'];\n constructor(private $q: ng.IQService) {}\n\n public normalizeServerGroup(serverGroup: IServerGroup): PromiseLike<IServerGroup> {\n return this.$q.resolve(serverGroup);\n }\n\n public convertServerGroupCommandToDeployConfiguration(command: ICloudrunServerGroupCommand): any {\n return new CloudrunDeployDescription(command);\n }\n}\n\nexport class CloudrunDeployDescription {\n public cloudProvider = 'cloudrun';\n public provider = 'cloudrun';\n public credentials: string;\n public account: string;\n public application: string;\n public stack?: string;\n public freeFormDetails?: string;\n public configFiles: string[];\n public region: string;\n public strategy?: string;\n public type?: string;\n public fromArtifact: boolean;\n public configArtifacts: string[];\n public strategyApplication?: string;\n public strategyPipeline?: string;\n public gitCredentialType: string;\n public interestingHealthProviderNames: string[];\n public sourceType: string;\n\n constructor(command: ICloudrunServerGroupCommand) {\n this.credentials = command.credentials;\n this.account = command.credentials;\n this.application = command.application;\n this.stack = command.stack;\n this.freeFormDetails = command.freeFormDetails;\n this.region = command.region;\n this.strategy = command.strategy;\n this.type = command.type;\n this.fromArtifact = command.fromArtifact;\n this.gitCredentialType = command.gitCredentialType;\n this.configFiles = command.configFiles;\n this.sourceType = command.sourceType;\n this.interestingHealthProviderNames = command.interestingHealthProviderNames || [];\n this.configArtifacts = [];\n }\n}\n\nexport const CLOUDRUN_SERVER_GROUP_TRANSFORMER = 'spinnaker.cloudrun.serverGroup.transformer.service';\nmodule(CLOUDRUN_SERVER_GROUP_TRANSFORMER, []).service(\n 'cloudrunV2ServerGroupTransformer',\n CloudrunV2ServerGroupTransformer,\n);\n","import { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { CLOUDRUN_COMPONENT_URL_DETAILS } from './common/componentUrlDetails.component';\nimport { CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE } from './common/loadBalancerMessage.component';\nimport './help/cloudrun.help';\nimport { CLOUDRUN_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';\nimport { CLOUDRUN_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/allocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS } from './loadBalancer/configure/wizard/basicSettings.component';\nimport { CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW } from './loadBalancer/configure/wizard/stageAllocationConfigurationRow.component';\nimport { CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL } from './loadBalancer/configure/wizard/wizard.controller';\nimport { CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL } from './loadBalancer/details/details.controller';\nimport { CLOUDRUN_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/loadBalancerTransformer';\nimport logo from './logo/cloudrun.logo.png';\nimport { CLOUDRUN_PIPELINE_MODULE } from './pipeline/pipeline.module';\nimport './pipeline/stages/deployManifest/deployStage';\nimport { CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ServerGroupWizard } from './serverGroup/configure/wizard/serverGroupWizard';\nimport { CLOUDRUN_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';\nimport { CLOUDRUN_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroupTransformer.service';\n\nimport './logo/cloudrun.logo.less';\n\nexport const CLOUDRUN_MODULE = 'spinnaker.cloudrun';\n\nconst requires = [\n CLOUDRUN_COMPONENT_URL_DETAILS,\n CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER,\n CLOUDRUN_SERVER_GROUP_DETAILS_CTRL,\n CLOUDRUN_SERVER_GROUP_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_TRANSFORMER,\n CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL,\n CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL,\n CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE,\n CLOUDRUN_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS,\n CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW,\n CLOUDRUN_PIPELINE_MODULE,\n CLOUDRUN_INSTANCE_DETAILS_CTRL,\n];\n\nmodule(CLOUDRUN_MODULE, requires).config(() => {\n CloudProviderRegistry.registerProvider('cloudrun', {\n name: 'cloudrun',\n logo: {\n path: logo,\n },\n\n instance: {\n detailsTemplateUrl: require('./instance/details/details.html'),\n detailsController: 'cloudrunInstanceDetailsCtrl',\n },\n serverGroup: {\n CloneServerGroupModal: ServerGroupWizard,\n commandBuilder: 'cloudrunV2ServerGroupCommandBuilder',\n detailsController: 'cloudrunV2ServerGroupDetailsCtrl',\n detailsTemplateUrl: require('./serverGroup/details/details.html'),\n transformer: 'cloudrunV2ServerGroupTransformer',\n skipUpstreamStageCheck: true,\n },\n\n loadBalancer: {\n transformer: 'cloudrunLoadBalancerTransformer',\n createLoadBalancerTemplateUrl: require('./loadBalancer/configure/wizard/wizard.html'),\n createLoadBalancerController: 'cloudrunLoadBalancerWizardCtrl',\n detailsTemplateUrl: require('./loadBalancer/details/details.html'),\n detailsController: 'cloudrunLoadBalancerDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('cloudrun', ['custom', 'redblack', 'rollingpush', 'rollingredblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAFAUlEQVRYR82YfUwcRRjGn5m7veO4rZI2aKuk1kRNjQ012rRANB53YNpYtFHS1Aj9ktaPtGINpPWgKQ0sVNvUNGirgYBJSTSA1H6ltpTrVYtUS2u1aRS/LSRFEmqBPcC7vR2zixwc7N4tJ02c5P64zMwzv332fd+ZWYL/USNGWFL3MpvVJy4xMlZzTJA/7y0hw9HmR4VxlokVIGQzwOzRxCL0D4DgA4+bL4ykERHGKfiqAJb3HyAmTCXVniL7Bj09XRhXqZjBKJqnD2REicjIbNnOn9bS1YVxlvuOgrHl0w0DQo553PYswzAuQcxhwMFpB/lXkAC5LUV83UT9Sc44SpjZxPnaGLDoFsK0BwP2VG8JkcavMQnGWSYWgGD3rQIJ6TIUeor5PbowjrcGk6gktwFI0oKZk0Bw/SYLdSXNpOi6IcfK3SWbaap3a3zXqECYM85ycTcYCvTUX3JZ0NMn41D7iLt5Dgv6hhgavgrEBkSwZ3ztCcE4ynyLKGGKK2Y95ZT7TBBWxuHzH4LY2TSMBUkU+1bbcOn3IPZ95o/FJUlmJNVbbG9X0350YacgKtmTE+kRORNQs9GGO2+nyKsawrVeGe+vt+HyH0E88yiHmrP+WFyq8xTxuSEYV2n/ckbpUSNeFzxlxbKFZuxv9uPUFQkrUzgkz6U4/o2E7MUcbvgY3j01NZeILGe1bL/tmOpMernYTBgyjMBkLjBj29NWfNEhofKkH/MSKXatikPO/kEwBmQv4bA02YyD5wKGXWIEp8+4+UziFPrzAFplBEQZM4snqH8tHjcHGTZWD6nTKtfYUHvWr8aO0u6fTbHpSSt+6ZFR5THqkryBOAXfEYBplmc9wPfW2jD/Loqi+mH81C1jzeMWzEvU3lnmJFDUtfpx+GJYfdOSPkHSBbGHAIlGnRlN6efTOPU1KL+HkkzY8aw1okTLVQk1Xj+6+8bq1MQJJL1MrCYEL04FpjrPhnvvGHNm3RMWNai1mlIkFeBzHRL8QWBgSAeGkAbiKhWXMooTRmFmzSCo3xweMwfW29RYmthOfiepIP3jAAJBhP0PVV8Zy1QFpyDWAlhrBEhJ31cyLKFsevBuip3PxYVN7eyV8XFbABd+HQnoiU2Sgb7BMIc+9BTx61QYhyA+TAGl+oaragjtfSEOC+8xqXXG+72E3Mc4ZD3ChUYeuRRAw/kA/o4Sr0EZakYCGJaBVG8Rf3msApcPVoDJ26K50+K2QxF6tXYIf/mYuh0oG+hvPTLqWgO40qnthq5DQ2SXxx3/ptI/tjeViLMpp7ozTw8o7QETSrOVvUlSq2zyXBOKV1jRdCGgvpapNkrR+WcvW+wt4bvDYNTYKRNfB8E7eqJK5f365yC+vTby9EoWffmjhI7rsR0jgjLb2rSFfzsUxBMXdgnKKY+laAFZzQAfF/V2Y8ggAlysz7eHnSYnKbuEgVUM5CM9xekCCshs9adb+LBztuZjOgXfIYCt0AXiAN4au0MM9Hhjvm3SzUNT0VE64KCUnInkdxwH2GME8vtZ5uHCyXcn/XuT4DsAsJenG4gBNY35ds3tRxfGUd4/nzKqpHpCJCCbhSDeYihmAbB+2cTSPtk046rWjMh37dKBElCyI9pSRoEYUNGYb3fr6UWNQqcKRAuifYWItxDYdBwihIgyY5WRQCYVPT1io99nZvKc5jnCxKytDW+QkWNhhBbVmWgC09n/Dw0j4+SJOXQTAAAAAElFTkSuQmCC\""],"names":["cloudrunComponentUrlDetailsComponent","bindings","component","template","CLOUDRUN_COMPONENT_URL_DETAILS","module","CLOUDRUN_LOAD_BALANCER_CREATE_MESSAGE","showCreateMessage","columnOffset","columns","templateUrl","key","value","forEach","entry","HelpContentsRegistry","register","CloudrunInstanceDetailsController","constructor","$q","app","instance","this","state","loading","upToolTip","outOfServiceToolTip","ready","then","retrieveInstance","instanceDetails","catch","instanceIdNotFound","instanceId","instanceManager","flattenDeep","getDataSource","data","map","loadBalancer","serverGroups","find","dataSource","instances","some","possibleMatch","id","recentHistoryExtraData","region","account","category","serverGroup","name","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","reject","$inject","CLOUDRUN_INSTANCE_DETAILS_CTRL","controller","cloudrunAllocationConfigurationRowComponent","allocationDescription","removeAllocation","serverGroupOptions","onAllocationChange","getServerGroupOptions","revisionName","uniq","concat","CLOUDRUN_ALLOCATION_CONFIGURATION_ROW","cloudrunLoadBalancerSettingsComponent","forPipelineConfig","application","$onInit","updateServerGroupOptions","addAllocation","remainingServerGroups","serverGroupsWithoutAllocation","length","splitDescription","allocationDescriptions","push","percent","index","splice","allocationIsInvalid","reduce","sum","showAddButton","initializeAsTextInput","serverGroupName","includes","serverGroupsWithAllocation","description","allServerGroups","difference","CLOUDRUN_LOAD_BALANCER_BASIC_SETTINGS","CloudrunStageAllocationLabelCtrl","mapTargetCoordinateToLabel","targetCoordinate","target","StageConstants","TARGET_LIST","t","val","label","$doCheck","setInputViewValue","cluster","targetLabel","inputViewValue","cloudrunStageAllocationLabel","cloudrunStageAllocationConfigurationRow","targets","CLOUDRUN_STAGE_ALLOCATION_CONFIGURATION_ROW","CloudrunLoadBalancerUpsertDescription","convertTrafficSplitToTrafficSplitDescription","split","trafficTargets","acc","trafficTarget","credentials","cloudProvider","loadBalancerName","migrateTraffic","mapAllocationsToDecimals","mapAllocationsToPercentages","Math","round","CloudrunLoadBalancerTransformer","normalizeLoadBalancer","provider","type","instanceCounts","buildInstanceCounts","detachedInstances","transformInstance","activeServerGroups","filter","isDisabled","chain","flatten","resolve","convertLoadBalancerForEditing","upToDateLoadBalancer","candidate","cloneDeep","convertLoadBalancerToUpsertDescription","has","camelCase","health","up","down","outOfService","succeeded","failed","starting","unknown","loadBalancers","healthState","get","CLOUDRUN_LOAD_BALANCER_TRANSFORMER","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","service","CloudrunLoadBalancerWizardController","$scope","$state","$uibModalInstance","isNew","cloudrunLoadBalancerTransformer","wizardSubFormValidation","submitButtonLabel","heading","join","convertedLoadBalancer","setTaskMonitor","initializeFormValidation","submit","close","taskMonitor","LoadBalancerWriter","upsertLoadBalancer","cancel","dismiss","showSubmitButton","subFormsAreValid","TaskMonitor","title","modalInstance","onTaskComplete","config","form","scope","page","subForm","validators","watchString","validator","watchDeep","refresh","onNextRefresh","onApplicationRefresh","$$destroyed","newStateParams","accountId","go","CLOUDRUN_LOAD_BALANCER_WIZARD_CTRL","CloudrunLoadBalancerDetailsController","$uibModal","loadBalancerFromParams","extractLoadBalancer","editLoadBalancer","open","size","test","onRefresh","autoClose","deleteLoadBalancer","ConfirmationModalService","confirm","header","buttonText","body","getConfirmationModalBodyHtml","taskMonitorConfig","submitMethod","canDeleteLoadBalancer","serverGroupNames","hasAny","hasMoreThanOne","listOfServerGroupNames","params","allowModalToStayOpen","location","CLOUDRUN_LOAD_BALANCER_DETAILS_CTRL","CloudrunLoadBalancerChoiceModalCtrl","initialize","CloudProviderRegistry","getValue","updatedLoadBalancerPromise","createLoadBalancerTemplateUrl","createLoadBalancerController","selectedLoadBalancer","result","CLOUDRUN_LOAD_BALANCER_CHOICE_MODAL_CTRL","CloudrunEditLoadBalancerStageCtrl","stage","addLoadBalancer","newLoadBalancer","updatedLoadBalancer","removeLoadBalancer","CLOUDRUN_EDIT_LOAD_BALANCER_STAGE","Registry","pipeline","registerStage","executionDetailsUrl","executionConfigSections","controllerAs","CLOUDRUN_PIPELINE_MODULE","ManifestBindArtifactsSelector","React","Component","super","arguments","onChangeBinding","binding","props","slice","onChangeBindings","onRemoveBinding","render","renderSelect","i","expectedArtifactId","artifact","className","StageArtifactSelector","onArtifactEdited","onExpectedArtifactSelected","expectedArtifact","excludedArtifactIds","b","excludedArtifactTypePatterns","ArtifactTypePatterns","FRONT50_PIPELINE_TEMPLATE","onClick","Fragment","ManifestSource","ManifestBasicSettings","accounts","onAccountSelect","selectedAccount","HelpField","AccountSelectInput","onChange","evt","readOnly","ServerGroupNamePreview","stack","details","textAlign","DeployStageForm","excludedManifestArtifactTypes","MAVEN_FILE","getSourceOptions","TEXT","ARTIFACT","option","capitalize","handleRawManifestChange","rawManifest","manifests","setState","formik","setFieldValue","onManifestArtifactSelected","onManifestArtifactEdited","getRequiredArtifacts","requiredArtifactIds","requiredArtifacts","values","onRequiredArtifactsChanged","isTextManifest","isEmpty","yamlDocumentsToString","accountName","StageConfigField","event","disabled","helpKey","RadioButtonInput","options","e","source","YamlEditor","StageArtifactSelectorDelegate","manifestArtifact","manifestArtifactId","CheckboxInput","checked","skipExpressionEvaluation","text","DeployStageConfig","destroy$","Subject","fetchAccounts","observableFrom","AccountService","getAllAccountDetailsForProvider","pipe","takeUntil","subscribe","initialStageConfig","moniker","componentDidMount","componentWillUnmount","next","FormikStageConfig","updateStage","strategyRedBlack","MAX_VERSION_HISTORY_ANNOTATION","STATUS_PILLS","available","stable","paused","DeployManifestStatusPills","manifest","status","Object","keys","statusKey","statusDescription","statusClass","isStable","isUnstableWithMessage","message","UNMAPPED_K8S_RESOURCE_STATE_KEY","ManifestDetailsLink","spinnakerKindStateMap","serverGroupManagers","url","loadUrl","canOpen","spinnakerKindFromCloudrunKind","kind","kindMap","k","toLowerCase","resourceRegion","trim","getStateParams","stateKey","metadata","reg","getAccountDetails","spinnakerKind","spinnakerKindMap","ReactInjector","href","linkName","ManifestEvents","pillStyle","events","namespace","firstTimestamp","lastTimestamp","firstEpochMilliseconds","lastEpochMilliseconds","DateTime","fromISO","toMillis","String","count","reason","relativeTime","JobManifestPodLogs","podNamesProviders","JobEventBasedPodNameProvider","ManifestStatus","CopyToClipboard","displayText","toolTip","ManifestYaml","manifestText","dump","modalTitle","_CloudrunManifestService","fn","updateManifest","ManifestReader","getManifest","manifestIdentifier","apiVersion","stageManifestToManifestParams","scopedKind","apiGroup","parts","isCRDGroup","BUILT_IN_GROUPS","CloudrunManifestService","DeployStatus","subscriptions","manifestIds","componentDidUpdate","unsubscribeAll","_prevProps","prevState","m","sort","unsubscribe","subscribeToManifestUpdates","stageManifestToIManifest","context","updated","idx","findIndex","sub","subscription","artifacts","sectionName","current","currentSection","ExecutionDetailsSection","StageFailureMessage","failureMessage","uid","executionDetailsSections","ExecutionDetailsTasks","ExecutionArtifactTab","producesArtifacts","supportsCustomTimeout","fieldName","fieldLabel","validate","_pipeline","enabled","services","replicaSetManifests","strategy","maxVersionHistory","parseInt","accountExtractor","configAccountExtractor","artifactExtractor","ExpectedArtifactService","accumulateArtifacts","artifactRemover","ArtifactReferenceService","removeArtifactFromFields","CloudrunProviderSettings","SETTINGS","providers","cloudrun","defaults","resetToOriginal","resetProvider","ServerGroupSource","getSubmitButtonLabel","mode","CloudrunV2ServerGroupCommandBuilder","buildNewServerGroupCommand","CloudrunServerGroupCommandBuilder","buildNewServerGroupCommandForPipeline","_stage","buildServerGroupCommandFromPipeline","_CloudrunServerGroupCommandBuilder","ServerGroupCommandIsValid","command","copyAndCleanCommand","input","viewState","requiresTemplateSelection","getExpectedArtifacts","expectedArtifacts","backingData","getCredentials","accountNames","defaultCredentials","getRegion","_account","sourceAccount","dataToFetch","artifactAccounts","getArtifactAccounts","all","a","disableStrategySelection","configFiles","selectedProvider","gitCredentialType","sourceType","configArtifacts","interestingHealthProviderNames","fromArtifact","CLOUDRUN_SERVER_GROUP_COMMAND_BUILDER","ServerGroupBasicSettings","onEnterStack","detailsChanged","freeFormDetails","namePreview","NameUtils","getClusterName","createsNewCluster","clusters","c","inCluster","createdTime","latestServerGroup","pop","hideClusterNamePreview","latestServerGroupName","navigateToLatestServerGroup","is","WizardServerGroupBasicSettings","accountUpdated","stackChanged","freeFormDetailsChanged","_a","_b","_c","ServerGroupConfigFilesSettings","onEnterConfig","configValues","setConfigValues","useState","configFile","TextAreaInput","rows","which","preventDefault","cursorPosition","selectionStart","inputValue","substring","newConfigValues","mapTabToSpaces","WizardServerGroupConfigFilesSettings","configUpdated","_ServerGroupWizard","_isUnmounted","cloneStage","task","execution","stages","newServerGroupName","transitionTo","serverGroupWriter","cloneServerGroup","closeModal","assign","loaded","modalInstanceEmulation","dismissModal","show","ReactModal","dialogClassName","labelButton","WizardModal","initialValues","nextIdx","wizard","WizardPage","order","innerRef","defaultProps","noop","ServerGroupWizard","CloudrunHealth","PLATFORM","CloudrunServerGroupDetailsController","extractServerGroup","canDestroyServerGroup","tags","isLatest","destroyServerGroup","stateParams","confirmationModalParams","askForReason","platformHealthOnlyShowOverride","attributes","platformHealthType","platformHealthOnly","ServerGroupReader","getServerGroup","serverGroupDetails","fromApp","toCheck","CLOUDRUN_SERVER_GROUP_DETAILS_CTRL","SERVER_GROUP_WRITER","CloudrunV2ServerGroupTransformer","normalizeServerGroup","convertServerGroupCommandToDeployConfiguration","CloudrunDeployDescription","CLOUDRUN_SERVER_GROUP_TRANSFORMER","CLOUDRUN_MODULE","registerProvider","logo","path","detailsTemplateUrl","detailsController","CloneServerGroupModal","commandBuilder","transformer","skipUpstreamStageCheck","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[8]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/help/cloudrun.help.ts","../src/instance/details/CloudrunInstanceDetails.tsx","../src/common/LoadBalancerMessage.tsx","../src/loadBalancer/loadBalancerTransformer.ts","../src/loadBalancer/configure/wizard/CloudrunLoadBalancerModal.tsx","../src/loadBalancer/details/CloudrunLoadBalancerActions.tsx","../src/common/ComponentUrlDetails.tsx","../src/loadBalancer/details/sections.tsx","../src/loadBalancer/details/useCloudrunLoadBalancerDetails.ts","../src/pipeline/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/manifest/ManifestSource.ts","../src/manifest/wizard/BasicSettings.tsx","../src/pipeline/stages/deployManifest/serverGroupNamePreview.tsx","../src/pipeline/stages/deployManifest/DeployStageForm.tsx","../src/pipeline/stages/deployManifest/DeployStageConfig.tsx","../src/rolloutStrategy/redblack.strategy.ts","../src/pipeline/stages/deployManifest/deploy.validator.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipeline/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/pipeline/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipeline/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerExecutionDetails.tsx","../src/pipeline/stages/deployManifest/deployStage.ts","../src/pipeline/stages/editLoadBalancer/CloudrunEditLoadBalancerStageConfig.tsx","../src/pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage.ts","../src/cloudrun.settings.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.ts","../src/serverGroup/configure/wizard/BasicSettings.tsx","../src/serverGroup/configure/wizard/ConfigFiles.tsx","../src/serverGroup/configure/wizard/serverGroupWizard.tsx","../src/common/cloudrunHealth.ts","../src/serverGroup/details/CloudrunServerGroupActions.tsx","../src/serverGroup/details/cloudrunServerGroupDetailsGetter.ts","../src/serverGroup/details/sections.tsx","../src/serverGroup/serverGroupTransformer.service.ts","../src/cloudrun.module.ts","../src/logo/cloudrun.logo.png"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents = [\n {\n key: 'cloudrun.serverGroup.stack',\n value:\n '(Optional) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n },\n\n {\n key: 'cloudrun.serverGroup.file',\n value: `<pre>\n apiVersion: serving.knative.dev/v1\n kind: Service\n metadata:\n name: spinappcloud1\n namespace: '135005621049'\n labels:\n cloud.googleapis.com/location: us-central1\n annotations:\n run.googleapis.com/client-name: cloud-console\n serving.knative.dev/creator: kiran@opsmx.io\n serving.knative.dev/lastModifier: kiran@opsmx.io\n client.knative.dev/user-image: us-docker.pkg.dev/cloudrun/container/hello\n run.googleapis.com/ingress-status: all\n spec:\n template:\n metagoogleapis.com/ingress: all\n run.data:\n name: spinappcloud1\n annotations:\n run.googleapis.com/client-name: cloud-console\n autoscaling.knative.dev/minScale: '1'\n autoscaling.knative.dev/maxScale: '3'\n spec:\n containerConcurrency: 80\n timeoutSeconds: 200\n serviceAccountName:spinnaker-cloudrun-account@my-orbit-project-71824.iam.gserviceaccount.com\n containers:\n - image:us-docker.pkg.dev/cloudrun/container/hello\n ports:\n - name: http1\n containerPort: 8080\n resources:\n limits:\n cpu: 1000m\n memory: 256Mi \n</pre>\n `,\n },\n\n {\n key: 'cloudrun.serverGroup.detail',\n value:\n ' (Optional) <b>Detail</b> is a string of free-form alphanumeric characters and hyphens to describe any other variables.',\n },\n {\n key: 'cloudrun.serverGroup.configFiles',\n value: `<p> The contents of a Cloud Run Service yaml </p>`,\n },\n {\n key: 'cloudrun.loadBalancer.allocations',\n value: 'An allocation is the percent of traffic directed to a server group.',\n },\n {\n key: 'cloudrun.manifest.source',\n value: `\n <p>Where the manifest file content is read from.</p>\n <p>\n <b>text:</b> The manifest is supplied statically to the pipeline from the below text-box.\n </p>\n <p>\n <b>artifact:</b> The manifest is read from an artifact supplied/created upstream. The expected artifact must be referenced here, and will be bound at runtime.\n </p>`,\n },\n {\n key: 'cloudrun.manifest.expectedArtifact',\n value:\n 'The artifact that is to be applied to the Cloud Run account for this stage. The artifact should represent a valid Cloud Run manifest.',\n },\n {\n key: 'cloudrun.manifest.skipExpressionEvaluation',\n value:\n '<p>Skip SpEL expression evaluation of the manifest artifact in this stage. Can be paired with the \"Evaluate SpEL expressions in overrides at bake time\" option in the Bake Manifest stage when baking a third-party manifest artifact with expressions not meant for Spinnaker to evaluate as SpEL.</p>',\n },\n {\n key: 'cloudrun.manifest.requiredArtifactsToBind',\n value:\n 'These artifacts must be present in the context for this stage to successfully complete. Artifacts specified will be <a href=\"https://www.spinnaker.io/reference/artifacts/in-cloudrun-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n },\n {\n key: 'cloudrun.manifest.account',\n value: `\n <p>A Spinnaker account corresponds to a physical Cloud Run cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n },\n];\n\nhelpContents.forEach((entry) => HelpContentsRegistry.register(entry.key, entry.value));\n","import { UISref } from '@uirouter/react';\nimport { flattenDeep } from 'lodash';\nimport React from 'react';\n\nimport type { Application, ILoadBalancer } from '@spinnaker/core';\nimport {\n AccountTag,\n CollapsibleSection,\n InstanceReader,\n RecentHistoryService,\n Spinner,\n timestamp,\n} from '@spinnaker/core';\n\nimport type { ICloudrunInstance } from '../../common/domain';\n\ninterface ICloudrunInstanceDetailsProps {\n app: Application;\n instance: {\n instanceId: string;\n };\n}\n\ninterface InstanceManager {\n account: string;\n region: string;\n category: string;\n name: string;\n instances: ICloudrunInstance[];\n}\n\ninterface ICloudrunInstanceDetailsState {\n loading: boolean;\n instance?: ICloudrunInstance;\n instanceIdNotFound?: string;\n}\n\nexport class CloudrunInstanceDetails extends React.Component<\n ICloudrunInstanceDetailsProps,\n ICloudrunInstanceDetailsState\n> {\n public state: ICloudrunInstanceDetailsState = { loading: true };\n private isUnmounted = false;\n\n public componentDidMount(): void {\n this.props.app\n .ready()\n .then(() => this.retrieveInstance())\n .then((instance) => !this.isUnmounted && this.setState({ instance, loading: false }))\n .catch(\n () =>\n !this.isUnmounted && this.setState({ instanceIdNotFound: this.props.instance.instanceId, loading: false }),\n );\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n }\n\n private retrieveInstance(): Promise<ICloudrunInstance> {\n const { app, instance } = this.props;\n const dataSources: InstanceManager[] = flattenDeep([\n app.getDataSource('serverGroups').data,\n app.getDataSource('loadBalancers').data,\n app.getDataSource('loadBalancers').data.map((loadBalancer: ILoadBalancer) => loadBalancer.serverGroups),\n ]);\n const instanceManager = dataSources.find((dataSource) =>\n dataSource.instances.some((possibleMatch) => possibleMatch.id === instance.instanceId),\n );\n\n if (!instanceManager) {\n return Promise.reject();\n }\n\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return InstanceReader.getInstanceDetails(instanceManager.account, instanceManager.region, instance.instanceId).then(\n (instanceDetails: ICloudrunInstance) => ({\n ...instanceDetails,\n account: instanceManager.account,\n region: instanceManager.region,\n }),\n );\n }\n\n public render() {\n const { loading, instance, instanceIdNotFound } = this.state;\n const upToolTip = \"A Cloud Run instance is 'Up' if a load balancer is directing traffic to its server group.\";\n const outOfServiceToolTip =\n \"A Cloud Run instance is 'Out Of Service' if no load balancers are directing traffic to its server group.\";\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"header-text horizontal middle\">\n <h3 className=\"horizontal middle space-between flex-1\">{instance ? instance.name : instanceIdNotFound}</h3>\n </div>\n {loading && <Spinner size=\"small\" />}\n </div>\n {!loading && instance && (\n <div className=\"content\">\n <CollapsibleSection heading=\"Instance Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Launched</dt>\n <dd>{instance.launchTime && timestamp(instance.launchTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={instance.account} />\n </dd>\n {instance.serverGroup && <dt>Server Group</dt>}\n {instance.serverGroup && (\n <dd>\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: instance.region,\n accountId: instance.account,\n serverGroup: instance.serverGroup,\n provider: 'cloudrun',\n }}\n >\n <a>{instance.serverGroup}</a>\n </UISref>\n </dd>\n )}\n <dt>Region</dt>\n <dd>{instance.region}</dd>\n {instance.vmZoneName && <dt>Zone</dt>}\n {instance.vmZoneName && <dd>{instance.vmZoneName}</dd>}\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Status\" defaultExpanded={true}>\n <dl>\n <dt>Load Balancer</dt>\n <dd>\n <span className=\"pull-left\" title={instance.healthState === 'Up' ? upToolTip : outOfServiceToolTip}>\n <span className={`glyphicon glyphicon-${instance.healthState}-triangle`} />{' '}\n {instance.loadBalancers?.[0]}\n </span>\n </dd>\n </dl>\n </CollapsibleSection>\n </div>\n )}\n {!loading && !instance && (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Instance not found.</h3>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n","import React from 'react';\n\nexport function LoadBalancerMessage({ showCreateMessage = false }: { showCreateMessage?: boolean }) {\n return (\n <div className=\"row\">\n <div className=\"col-md-offset-1 col-md-10\">\n <div className=\"well\">\n <p>\n {showCreateMessage && <span>Spinnaker cannot create a load balancer for Cloud Run. </span>}A Spinnaker load\n balancer maps to an Cloud Run Service, which will be created automatically alongside a Revision. Once\n created, the Service can be edited as a Load Balancer.\n </p>\n </div>\n </div>\n </div>\n );\n}\n","import { camelCase, chain, cloneDeep, filter, get, has, reduce } from 'lodash';\n\nimport type {\n Application,\n IInstance,\n IInstanceCounts,\n ILoadBalancer,\n ILoadBalancerUpsertCommand,\n IServerGroup,\n} from '@spinnaker/core';\n//import type { ICloudrunLoadBalancer, ICloudrunTrafficSplit, ShardBy } from '../common/domain/index';\nimport type { ICloudrunLoadBalancer, ICloudrunTrafficSplit } from '../common/domain/index';\n\nexport interface ICloudrunAllocationDescription {\n revisionName?: string;\n target?: string;\n cluster?: string;\n percent: number;\n}\n\nexport interface ICloudrunTrafficSplitDescription {\n allocationDescriptions: ICloudrunAllocationDescription[];\n}\n\nexport class CloudrunLoadBalancerUpsertDescription implements ILoadBalancerUpsertCommand, ICloudrunLoadBalancer {\n public credentials: string;\n public account: string;\n public loadBalancerName: string;\n public name: string;\n public splitDescription: ICloudrunTrafficSplitDescription;\n public split?: ICloudrunTrafficSplit;\n public migrateTraffic: boolean;\n public region: string;\n public cloudProvider: string;\n public serverGroups?: any[];\n\n public static convertTrafficSplitToTrafficSplitDescription(\n split: ICloudrunTrafficSplit,\n ): ICloudrunTrafficSplitDescription {\n const allocationDescriptions = reduce(\n split.trafficTargets,\n (acc: any, trafficTarget: any) => {\n const { revisionName, percent } = trafficTarget;\n return acc.concat({ percent, revisionName });\n },\n [],\n );\n return { allocationDescriptions };\n }\n\n constructor(loadBalancer: ICloudrunLoadBalancer) {\n this.credentials = loadBalancer.account || loadBalancer.credentials;\n this.account = this.credentials;\n this.cloudProvider = loadBalancer.cloudProvider;\n this.loadBalancerName = loadBalancer.name;\n this.name = loadBalancer.name;\n this.region = loadBalancer.region;\n this.migrateTraffic = loadBalancer.migrateTraffic || false;\n this.serverGroups = loadBalancer.serverGroups;\n }\n\n public mapAllocationsToDecimals() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n description.percent = description.percent / 100;\n });\n }\n\n public mapAllocationsToPercentages() {\n this.splitDescription.allocationDescriptions.forEach((description) => {\n // An allocation percent has at most one decimal place.\n description.percent = Math.round(description.percent);\n });\n }\n}\n\nexport class CloudrunLoadBalancerTransformer {\n public normalizeLoadBalancer(loadBalancer: ILoadBalancer): Promise<ILoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n loadBalancer.instances = [];\n loadBalancer.serverGroups.forEach((serverGroup) => {\n serverGroup.account = loadBalancer.account;\n serverGroup.region = loadBalancer.region;\n\n if (serverGroup.detachedInstances) {\n serverGroup.detachedInstances = (serverGroup.detachedInstances as any).map((id: string) => ({ id }));\n }\n serverGroup.instances = serverGroup.instances\n .concat(serverGroup.detachedInstances || [])\n .map((instance: any) => this.transformInstance(instance, loadBalancer));\n });\n\n const activeServerGroups = filter(loadBalancer.serverGroups, { isDisabled: false });\n loadBalancer.instances = chain(activeServerGroups).map('instances').flatten().value() as IInstance[];\n return Promise.resolve(loadBalancer);\n }\n\n public convertLoadBalancerForEditing(\n loadBalancer: ICloudrunLoadBalancer,\n application: Application,\n ): Promise<ICloudrunLoadBalancer> {\n return application\n .getDataSource('loadBalancers')\n .ready()\n .then(() => {\n const upToDateLoadBalancer = application\n .getDataSource('loadBalancers')\n .data.find((candidate: ILoadBalancer) => {\n return (\n candidate.name === loadBalancer.name &&\n (candidate.account === loadBalancer.account || candidate.account === loadBalancer.credentials)\n );\n });\n\n if (upToDateLoadBalancer) {\n loadBalancer.serverGroups = cloneDeep(upToDateLoadBalancer.serverGroups);\n }\n return loadBalancer;\n });\n }\n\n public convertLoadBalancerToUpsertDescription(\n loadBalancer: ICloudrunLoadBalancer,\n ): CloudrunLoadBalancerUpsertDescription {\n return new CloudrunLoadBalancerUpsertDescription(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts: IInstanceCounts = chain(serverGroups)\n .map('instances')\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n if (has(instance, 'health.state')) {\n acc[camelCase(instance.health.state)]++;\n }\n return acc;\n },\n { up: 0, down: 0, outOfService: 0, succeeded: 0, failed: 0, starting: 0, unknown: 0 },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups).map('detachedInstances').flatten().value().length;\n return instanceCounts;\n }\n\n private transformInstance(instance: any, loadBalancer: ILoadBalancer) {\n instance.provider = loadBalancer.type;\n instance.account = loadBalancer.account;\n instance.region = loadBalancer.region;\n instance.loadBalancers = [loadBalancer.name];\n const health = instance.health || {};\n instance.healthState = get(instance, 'health.state') || 'OutOfService';\n instance.health = [health];\n\n return instance as IInstance;\n }\n}\n","import { cloneDeep, difference, uniq } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancerModalProps, IRouterInjectedProps } from '@spinnaker/core';\nimport { HelpField, LoadBalancerWriter, ReactModal, StageConstants, TaskMonitor, withRouter } from '@spinnaker/core';\n\nimport { LoadBalancerMessage } from '../../../common/LoadBalancerMessage';\nimport type { ICloudrunLoadBalancer } from '../../../common/domain';\nimport type { ICloudrunAllocationDescription, ICloudrunTrafficSplitDescription } from '../../loadBalancerTransformer';\nimport { CloudrunLoadBalancerTransformer, CloudrunLoadBalancerUpsertDescription } from '../../loadBalancerTransformer';\n\nexport interface ICloudrunLoadBalancerModalState {\n loading: boolean;\n loadBalancer?: CloudrunLoadBalancerUpsertDescription;\n taskMonitor: TaskMonitor;\n}\n\nexport interface ICloudrunLoadBalancerModalProps extends ILoadBalancerModalProps {\n isNew?: boolean;\n}\n\nfunction allocationTotalIsValid(splitDescription: ICloudrunTrafficSplitDescription): boolean {\n return (\n splitDescription.allocationDescriptions.reduce((sum, description) => sum + Number(description.percent), 0) === 100\n );\n}\n\nexport class CloudrunLoadBalancerModalComponent extends React.Component<\n ICloudrunLoadBalancerModalProps & IRouterInjectedProps,\n ICloudrunLoadBalancerModalState\n> {\n public static show(props: ICloudrunLoadBalancerModalProps): Promise<CloudrunLoadBalancerUpsertDescription> {\n return ReactModal.show(CloudrunLoadBalancerModal, props, { dialogClassName: 'wizard-modal modal-lg' });\n }\n\n private transformer = new CloudrunLoadBalancerTransformer();\n private isUnmounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n\n constructor(props: ICloudrunLoadBalancerModalProps & IRouterInjectedProps) {\n super(props);\n this.state = {\n loading: !props.isNew,\n taskMonitor: new TaskMonitor({\n application: props.app,\n title: 'Updating your load balancer',\n onDismiss: () => props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n public componentDidMount(): void {\n const { app, isNew, loadBalancer } = this.props;\n if (isNew) {\n return;\n }\n this.transformer\n .convertLoadBalancerForEditing(loadBalancer as ICloudrunLoadBalancer, app)\n .then((convertedLoadBalancer) => {\n if (this.isUnmounted) {\n return;\n }\n const command = this.transformer.convertLoadBalancerToUpsertDescription(\n convertedLoadBalancer as ICloudrunLoadBalancer,\n );\n if ((loadBalancer as ICloudrunLoadBalancer).split && !command.splitDescription) {\n command.splitDescription = CloudrunLoadBalancerUpsertDescription.convertTrafficSplitToTrafficSplitDescription(\n (loadBalancer as ICloudrunLoadBalancer).split,\n );\n } else {\n command.splitDescription = (loadBalancer as any).splitDescription;\n }\n command.mapAllocationsToPercentages();\n this.setState({ loadBalancer: command, loading: false });\n })\n .catch(() => {\n if (!this.isUnmounted) {\n this.props.dismissModal();\n }\n });\n }\n\n public componentWillUnmount(): void {\n this.isUnmounted = true;\n this.clearApplicationRefreshSubscription();\n }\n\n private onTaskComplete = (): void => {\n this.clearApplicationRefreshSubscription();\n this.applicationRefreshUnsubscribe = this.props.app.loadBalancers.onNextRefresh(this.onApplicationRefresh);\n this.props.app.loadBalancers.refresh();\n };\n\n private onApplicationRefresh = (): void => {\n this.clearApplicationRefreshSubscription();\n if (this.isUnmounted) {\n return;\n }\n const { loadBalancer } = this.state;\n this.props.dismissModal();\n const newStateParams = {\n name: loadBalancer.name,\n accountId: loadBalancer.credentials,\n region: loadBalancer.region,\n provider: 'cloudrun',\n };\n if (!this.props.stateService.includes('**.loadBalancerDetails')) {\n this.props.stateService.go('.loadBalancerDetails', newStateParams);\n } else {\n this.props.stateService.go('^.loadBalancerDetails', newStateParams);\n }\n };\n\n private clearApplicationRefreshSubscription = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n };\n\n private submit = (): void => {\n const description = cloneDeep(this.state.loadBalancer);\n description.mapAllocationsToPercentages();\n delete description.serverGroups;\n\n if (this.props.forPipelineConfig) {\n this.props.closeModal(description);\n } else {\n this.state.taskMonitor.submit(() => LoadBalancerWriter.upsertLoadBalancer(description, this.props.app, 'Update'));\n }\n };\n\n private updateLoadBalancer = (loadBalancer: CloudrunLoadBalancerUpsertDescription): void => {\n this.setState({ loadBalancer });\n };\n\n public render() {\n const { dismissModal, forPipelineConfig, isNew, loadBalancer: sourceLoadBalancer } = this.props;\n const { loading, loadBalancer, taskMonitor } = this.state;\n const heading = isNew\n ? 'Create New Load Balancer'\n : `Edit ${[\n sourceLoadBalancer.name,\n sourceLoadBalancer.region,\n sourceLoadBalancer.account || sourceLoadBalancer.credentials,\n ].join(':')}`;\n const submitButtonLabel = forPipelineConfig ? 'Done' : 'Update';\n const canSubmit = loadBalancer?.splitDescription && allocationTotalIsValid(loadBalancer.splitDescription);\n\n return (\n <form name=\"form\">\n <div className=\"modal-header\">\n <button type=\"button\" className=\"close\" onClick={dismissModal}>\n <span>×</span>\n </button>\n <h4 className=\"modal-title\">{heading}</h4>\n </div>\n <div className=\"modal-body\">\n {loading && !isNew && (\n <div style={{ height: 200 }} className=\"horizontal center middle\">\n Loading...\n </div>\n )}\n {isNew && <LoadBalancerMessage showCreateMessage={true} />}\n {!loading && !isNew && loadBalancer && (\n <CloudrunLoadBalancerBasicSettings\n loadBalancer={loadBalancer}\n forPipelineConfig={forPipelineConfig}\n onChange={this.updateLoadBalancer}\n />\n )}\n </div>\n <div className=\"modal-footer\">\n <button type=\"button\" className=\"btn btn-default\" onClick={dismissModal}>\n Cancel\n </button>\n {!isNew && canSubmit && (\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n disabled={taskMonitor.submitting || loading}\n onClick={this.submit}\n >\n {submitButtonLabel}\n </button>\n )}\n </div>\n </form>\n );\n }\n}\n\nexport const CloudrunLoadBalancerModal = Object.assign(withRouter(CloudrunLoadBalancerModalComponent), {\n show: CloudrunLoadBalancerModalComponent.show,\n});\n\ninterface ICloudrunLoadBalancerBasicSettingsProps {\n loadBalancer: CloudrunLoadBalancerUpsertDescription;\n forPipelineConfig: boolean;\n onChange: (loadBalancer: CloudrunLoadBalancerUpsertDescription) => void;\n}\n\nclass CloudrunLoadBalancerBasicSettings extends React.Component<ICloudrunLoadBalancerBasicSettingsProps> {\n private serverGroupsWithoutAllocation(loadBalancer = this.props.loadBalancer): string[] {\n const serverGroupsWithAllocation = loadBalancer.splitDescription.allocationDescriptions.map(\n (description) => description.revisionName,\n );\n const allServerGroups = loadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n return difference(allServerGroups, serverGroupsWithAllocation);\n }\n\n private changeLoadBalancer(mutator: (loadBalancer: CloudrunLoadBalancerUpsertDescription) => void): void {\n const loadBalancer = cloneDeep(this.props.loadBalancer);\n mutator(loadBalancer);\n this.props.onChange(loadBalancer);\n }\n\n private addAllocation = (): void => {\n this.changeLoadBalancer((loadBalancer) => {\n const remainingServerGroups = this.serverGroupsWithoutAllocation(loadBalancer);\n loadBalancer.splitDescription.allocationDescriptions.push({\n revisionName: remainingServerGroups[0] || '',\n percent: 0,\n });\n });\n };\n\n private removeAllocation = (index: number): void => {\n this.changeLoadBalancer((loadBalancer) => loadBalancer.splitDescription.allocationDescriptions.splice(index, 1));\n };\n\n private updateAllocation = (index: number, changes: Partial<ICloudrunAllocationDescription>): void => {\n this.changeLoadBalancer((loadBalancer) => {\n loadBalancer.splitDescription.allocationDescriptions[index] = {\n ...loadBalancer.splitDescription.allocationDescriptions[index],\n ...changes,\n };\n });\n };\n\n public render() {\n const { forPipelineConfig, loadBalancer } = this.props;\n const serverGroupOptions = this.serverGroupsWithoutAllocation();\n const showAddButton = forPipelineConfig || serverGroupOptions.length > 0;\n const allocationIsInvalid = !allocationTotalIsValid(loadBalancer.splitDescription);\n\n return (\n <div className=\"row\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Allocations <HelpField id=\"cloudrun.loadBalancer.allocations\" />\n </div>\n <div className=\"col-md-9\">\n {loadBalancer.splitDescription.allocationDescriptions.map((description, index) => (\n <CloudrunAllocationConfigurationRow\n key={index}\n allocationDescription={description}\n loadBalancer={loadBalancer}\n forPipelineConfig={forPipelineConfig}\n serverGroupOptions={serverGroupOptions}\n onChange={(changes) => this.updateAllocation(index, changes)}\n onRemove={() => this.removeAllocation(index)}\n />\n ))}\n {showAddButton && (\n <button type=\"button\" className=\"add-new col-md-11\" onClick={this.addAllocation}>\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add allocation\n </button>\n )}\n </div>\n </div>\n {allocationIsInvalid && (\n <div className=\"form-group\">\n <div className=\"col-md-12 text-center\">\n <p className=\"alert alert-warning\">Allocations must sum to 100%.</p>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\ninterface ICloudrunAllocationConfigurationRowProps {\n allocationDescription: ICloudrunAllocationDescription;\n loadBalancer: CloudrunLoadBalancerUpsertDescription;\n forPipelineConfig: boolean;\n serverGroupOptions: string[];\n onChange: (changes: Partial<ICloudrunAllocationDescription>) => void;\n onRemove: () => void;\n}\n\nfunction CloudrunAllocationConfigurationRow({\n allocationDescription,\n forPipelineConfig,\n loadBalancer,\n onChange,\n onRemove,\n serverGroupOptions,\n}: ICloudrunAllocationConfigurationRowProps) {\n const options = allocationDescription.revisionName\n ? uniq(serverGroupOptions.concat(allocationDescription.revisionName))\n : serverGroupOptions;\n const target = StageConstants.TARGET_LIST.find(\n (targetOption: any) => targetOption.val === allocationDescription.target,\n );\n const targetLabel = target ? target.label : '';\n\n return (\n <>\n <div className=\"form-group\">\n <div className=\"row\">\n <div className=\"col-md-7\">\n {forPipelineConfig ? (\n <input\n value={\n allocationDescription.cluster && allocationDescription.target\n ? `${targetLabel} (${allocationDescription.cluster})`\n : ''\n }\n type=\"text\"\n className=\"form-control input-sm\"\n readOnly={true}\n />\n ) : (\n <select\n value={allocationDescription.revisionName || ''}\n className=\"form-control input-sm\"\n onChange={(event) => onChange({ revisionName: event.target.value })}\n >\n {options.map((serverGroup) => (\n <option key={serverGroup} value={serverGroup}>\n {serverGroup}\n </option>\n ))}\n </select>\n )}\n </div>\n <div className=\"col-md-3\">\n <div className=\"input-group input-group-sm\">\n <input\n type=\"number\"\n value={allocationDescription.percent}\n required={true}\n className=\"form-control input-sm\"\n min={0}\n max={100}\n onChange={(event) => onChange({ percent: Number(event.target.value) })}\n />\n <span className=\"input-group-addon\">%</span>\n </div>\n </div>\n <div className=\"col-md-2\">\n <button type=\"button\" className=\"btn btn-link sm-label\" onClick={onRemove}>\n <span className=\"glyphicon glyphicon-trash\" />\n </button>\n </div>\n </div>\n </div>\n {forPipelineConfig && (\n <div className=\"form-group\">\n <div className=\"well col-md-11\" style={{ paddingTop: 5, paddingBottom: 10 }}>\n <div className=\"row\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Cluster</div>\n <div className=\"col-md-7\" style={{ marginBottom: 10 }}>\n <input\n value={allocationDescription.cluster || loadBalancer.name}\n type=\"text\"\n className=\"form-control input-sm\"\n readOnly={true}\n />\n </div>\n <div className=\"col-md-3 sm-label-right\">Target</div>\n <div className=\"col-md-7\">\n <select\n value={allocationDescription.target || ''}\n className=\"form-control input-sm\"\n onChange={(event) => onChange({ target: event.target.value, cluster: loadBalancer.name })}\n >\n <option value=\"\">Select...</option>\n {StageConstants.TARGET_LIST.map((targetOption: any) => (\n <option key={targetOption.val} value={targetOption.val}>\n {targetOption.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n","import React from 'react';\nimport { Dropdown, MenuItem } from 'react-bootstrap';\n\nimport type { ILoadBalancerActionsProps, ILoadBalancerDeleteCommand } from '@spinnaker/core';\nimport { ConfirmationModalService, LoadBalancerWriter } from '@spinnaker/core';\n\nimport type { ICloudrunLoadBalancer } from '../../common/domain';\nimport { CloudrunLoadBalancerModal } from '../configure/wizard/CloudrunLoadBalancerModal';\n\nexport function CloudrunLoadBalancerActions({ app, loadBalancer }: ILoadBalancerActionsProps) {\n const cloudrunLoadBalancer = loadBalancer as ICloudrunLoadBalancer;\n const canDeleteLoadBalancer = cloudrunLoadBalancer.name !== 'default';\n\n const editLoadBalancer = () => {\n CloudrunLoadBalancerModal.show({ app, loadBalancer: cloudrunLoadBalancer, isNew: false, forPipelineConfig: false });\n };\n const getConfirmationModalBodyHtml = (): string => {\n const serverGroupNames = cloudrunLoadBalancer.serverGroups.map((serverGroup) => serverGroup.name);\n if (!serverGroupNames?.length) {\n return null;\n }\n if (serverGroupNames.length > 1) {\n const listOfServerGroupNames = serverGroupNames.map((name) => `<li>${name}</li>`).join('');\n return `<div class=\"alert alert-warning\"><p>Deleting <b>${cloudrunLoadBalancer.name}</b> will destroy the following server groups:<ul>${listOfServerGroupNames}</ul></p></div>`;\n }\n return `<div class=\"alert alert-warning\"><p>Deleting <b>${cloudrunLoadBalancer.name}</b> will destroy <b>${serverGroupNames[0]}</b>.</p></div>`;\n };\n const deleteLoadBalancer = () => {\n const submitMethod = () => {\n const command: ILoadBalancerDeleteCommand = {\n cloudProvider: cloudrunLoadBalancer.cloudProvider,\n loadBalancerName: cloudrunLoadBalancer.name,\n credentials: cloudrunLoadBalancer.account,\n };\n return LoadBalancerWriter.deleteLoadBalancer(command, app);\n };\n\n ConfirmationModalService.confirm({\n header: `Really delete ${cloudrunLoadBalancer.name}?`,\n buttonText: `Delete ${cloudrunLoadBalancer.name}`,\n body: getConfirmationModalBodyHtml(),\n account: cloudrunLoadBalancer.account,\n taskMonitorConfig: {\n application: app,\n title: `Deleting ${cloudrunLoadBalancer.name}`,\n },\n submitMethod,\n });\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"cloudrun-load-balancer-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Load Balancer Actions</Dropdown.Toggle>\n <Dropdown.Menu>\n <MenuItem onClick={editLoadBalancer}>Edit Load Balancer</MenuItem>\n {canDeleteLoadBalancer ? (\n <MenuItem onClick={deleteLoadBalancer}>Delete Load Balancer</MenuItem>\n ) : (\n <MenuItem disabled={true} title=\"You cannot delete a default service.\">\n Delete Load Balancer\n </MenuItem>\n )}\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import React from 'react';\n\nimport { CopyToClipboard } from '@spinnaker/core';\n\nexport function ComponentUrlDetails({ component }: { component: { url?: string; httpsUrl?: string } }) {\n if (!component?.url) {\n return null;\n }\n\n return (\n <>\n <dt>HTTPS</dt>\n <dd className=\"small\">\n <a href={component.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {component.url}\n </a>\n <CopyToClipboard\n className=\"copy-to-clipboard copy-to-clipboard-sm\"\n toolTip=\"Copy URL to clipboard\"\n text={component.httpsUrl || component.url}\n />\n </dd>\n </>\n );\n}\n","import { UISref } from '@uirouter/react';\nimport React from 'react';\n\nimport type { ILoadBalancerDetailsSectionProps } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, HealthCounts } from '@spinnaker/core';\n\nimport { ComponentUrlDetails } from '../../common/ComponentUrlDetails';\nimport type { ICloudrunLoadBalancer } from '../../common/domain';\n\nexport function compareCloudrunLoadBalancerServerGroups(a: any, b: any): number {\n if (a.isDisabled !== b.isDisabled) {\n return a.isDisabled ? 1 : -1;\n }\n return b.name.localeCompare(a.name);\n}\n\nexport function CloudrunLoadBalancerDetailsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const cloudrunLoadBalancer = loadBalancer as ICloudrunLoadBalancer;\n return (\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>In</dt>\n <dd>\n <AccountTag account={cloudrunLoadBalancer.account} />\n </dd>\n <dt>Region</dt>\n <dd>{cloudrunLoadBalancer.region}</dd>\n {!!cloudrunLoadBalancer.serverGroups.length && <dt>Server Groups</dt>}\n {!!cloudrunLoadBalancer.serverGroups.length && (\n <dd>\n <ul>\n {cloudrunLoadBalancer.serverGroups\n .slice()\n .sort(compareCloudrunLoadBalancerServerGroups)\n .map((serverGroup) => (\n <li key={serverGroup.name}>\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: serverGroup.region,\n accountId: serverGroup.account,\n serverGroup: serverGroup.name,\n provider: 'cloudrun',\n }}\n >\n <a>{serverGroup.name}</a>\n </UISref>\n </li>\n ))}\n </ul>\n </dd>\n )}\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function CloudrunLoadBalancerStatusSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Status\" defaultExpanded={true}>\n <HealthCounts className=\"pull-left\" container={loadBalancer.instanceCounts} />\n </CollapsibleSection>\n );\n}\n\nexport function CloudrunLoadBalancerTrafficSplitSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n const cloudrunLoadBalancer = loadBalancer as ICloudrunLoadBalancer;\n return (\n <CollapsibleSection heading=\"Traffic Split\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <ul>\n {cloudrunLoadBalancer.split?.trafficTargets?.map((trafficTarget) => (\n <li key={trafficTarget.revisionName}>\n {trafficTarget.revisionName}:<span className=\"pull-right\">{trafficTarget.percent}</span>\n </li>\n ))}\n </ul>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function CloudrunLoadBalancerDnsSection({ loadBalancer }: ILoadBalancerDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"DNS\" defaultExpanded={true}>\n <dl className=\"dl-narrow\">\n <ComponentUrlDetails component={loadBalancer as any} />\n </dl>\n </CollapsibleSection>\n );\n}\n","import { useMemo } from 'react';\n\nimport { useDataSource } from '@spinnaker/core';\nimport type { IUseDetailsHookProps, UseDetailsHook, UseDetailsResult } from '@spinnaker/core';\n\nimport type { ICloudrunLoadBalancer } from '../../common/domain';\n\nexport const useCloudrunLoadBalancerDetails: UseDetailsHook<ICloudrunLoadBalancer> = ({\n app,\n loadBalancerParams,\n autoClose,\n}: IUseDetailsHookProps): UseDetailsResult<ICloudrunLoadBalancer> => {\n const dataSource = app.getDataSource('loadBalancers');\n const { data: loadBalancers, loaded, error, refresh } = useDataSource<ICloudrunLoadBalancer[]>(dataSource);\n const data = useMemo(() => {\n if (!loaded || error) {\n return undefined;\n }\n\n const loadBalancer = findCloudrunLoadBalancer(loadBalancers, loadBalancerParams);\n if (!loadBalancer) {\n autoClose();\n return undefined;\n }\n\n return loadBalancer;\n }, [\n loaded,\n error,\n loadBalancers,\n loadBalancerParams.name,\n loadBalancerParams.accountId,\n loadBalancerParams.region,\n autoClose,\n ]);\n\n return {\n data,\n loading: !loaded,\n error: error || null,\n refetch: async () => refresh(),\n };\n};\n\nexport function findCloudrunLoadBalancer(\n loadBalancers: ICloudrunLoadBalancer[],\n loadBalancerParams: IUseDetailsHookProps['loadBalancerParams'],\n) {\n return loadBalancers.find((candidate) => {\n return (\n candidate.name === loadBalancerParams.name &&\n candidate.account === loadBalancerParams.accountId &&\n candidate.region === loadBalancerParams.region\n );\n });\n}\n","import React from 'react';\n\nimport type { IArtifact, IExpectedArtifact, IPipeline, IStage } from '@spinnaker/core';\nimport { ArtifactTypePatterns, StageArtifactSelector } from '@spinnaker/core';\n\nexport interface IManifestBindArtifact {\n expectedArtifactId?: string;\n artifact?: IArtifact;\n}\n\nexport interface IManifestBindArtifactsSelectorProps {\n pipeline: IPipeline;\n stage: IStage;\n bindings?: IManifestBindArtifact[];\n onChangeBindings: (_: IManifestBindArtifact[]) => void;\n}\n\nexport class ManifestBindArtifactsSelector extends React.Component<IManifestBindArtifactsSelectorProps> {\n private onChangeBinding = (index: number, binding: IManifestBindArtifact) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings[index] = binding;\n this.props.onChangeBindings(bindings);\n };\n\n private onRemoveBinding = (index: number) => {\n const bindings = (this.props.bindings || []).slice(0);\n bindings.splice(index, 1);\n this.props.onChangeBindings(bindings);\n };\n\n public render() {\n const { stage, pipeline, bindings } = this.props;\n\n const renderSelect = (i: number, binding?: IManifestBindArtifact) => {\n const key = (!binding && 'new') || binding.expectedArtifactId || (binding.artifact && binding.artifact.id);\n return (\n <div className=\"row\" key={key}>\n <div className=\"col-md-10\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n expectedArtifactId={binding && binding.expectedArtifactId}\n artifact={!!binding && binding.artifact}\n onArtifactEdited={(artifact: IArtifact) => this.onChangeBinding(i, { artifact: artifact })}\n onExpectedArtifactSelected={(expectedArtifact: IExpectedArtifact) =>\n this.onChangeBinding(i, { expectedArtifactId: expectedArtifact.id })\n }\n excludedArtifactIds={bindings.map((b) => b.expectedArtifactId)}\n excludedArtifactTypePatterns={[ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE]}\n />\n </div>\n {binding && (\n <div className=\"col-md-2\">\n <a className=\"glyphicon glyphicon-trash\" onClick={() => this.onRemoveBinding(i)} />\n </div>\n )}\n </div>\n );\n };\n const renderSelectEditable = (binding: IManifestBindArtifact, i: number) => renderSelect(i, binding);\n\n return (\n <>\n {bindings.map(renderSelectEditable)}\n {renderSelect(bindings.length)}\n </>\n );\n }\n}\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IAccount } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField } from '@spinnaker/core';\n\nimport type { ICloudrunManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n}\n\nexport function ManifestBasicSettings({ accounts, onAccountSelect, selectedAccount }: IManifestBasicSettingsProps) {\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Account <HelpField id=\"cloudrun.manifest.account\" />\n </div>\n <div className=\"col-md-8\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<ICloudrunManifestCommandData>;\n}\n\nexport class WizardManifestBasicSettings extends React.Component<IWizardManifestBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n public render() {\n const { formik } = this.props;\n return (\n <ManifestBasicSettings\n accounts={formik.values.metadata.backingData.accounts}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command.account}\n />\n );\n }\n}\n","import React from 'react';\n\nexport interface IServerGroupNamePreviewProps {\n application: string;\n stack: string;\n details: string;\n}\n\nexport class ServerGroupNamePreview extends React.Component<IServerGroupNamePreviewProps> {\n public render() {\n const application = this.props.application ? this.props.application : '';\n const stack = this.props.stack ? `-${this.props.stack}` : '';\n\n const details = this.props.details ? `-${this.props.details}` : '';\n return (\n <pre style={{ textAlign: 'center' }}>\n <p> Your server group will be in the cluster:</p>\n <p>\n <b>\n {application}\n {stack}\n {details}\n </b>\n </p>\n </pre>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IAccountDetails, IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\nimport { ServerGroupNamePreview } from './serverGroupNamePreview';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n application: string;\n stack: string;\n details: string;\n}\n\nexport class DeployStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const stage = this.props.formik.values;\n const manifests: any[] = get(props.formik.values, 'manifests');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(manifests) && isTextManifest ? yamlDocumentsToString(manifests) : '',\n application: this.props.application.name,\n stack: get(stage, 'stack'),\n details: get(stage, 'details'),\n };\n }\n\n private getSourceOptions = (): Array<Option<string>> => {\n return map([ManifestSource.TEXT, ManifestSource.ARTIFACT], (option) => ({\n label: capitalize(option),\n value: option,\n }));\n };\n\n private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('manifests', manifests);\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.formik.setFieldValue('manifestArtifactId', expectedArtifactId);\n this.props.formik.setFieldValue('manifestArtifact', null);\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.formik.setFieldValue('manifestArtifactId', null);\n this.props.formik.setFieldValue('manifestArtifact', artifact);\n };\n\n private getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.formik.values;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.formik.setFieldValue(\n 'requiredArtifactIds',\n bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n );\n this.props.formik.setFieldValue(\n 'requiredArtifacts',\n bindings.filter((b) => b.artifact),\n );\n };\n\n public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n accounts={this.props.accounts}\n onAccountSelect={(accountName) => this.props.formik.setFieldValue('account', accountName)}\n selectedAccount={stage.account}\n />\n <StageConfigField label=\"Application\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={this.props.application.name}\n onChange={(event) => this.props.formik.setFieldValue('application', event.target.value)}\n disabled\n />\n </StageConfigField>\n <StageConfigField label=\"Stack\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.stack}\n onChange={(event) => this.props.formik.setFieldValue('stack', event.target.value)}\n />\n </StageConfigField>\n <StageConfigField label=\"Details\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.details}\n onChange={(event) => this.props.formik.setFieldValue('details', event.target.value)}\n />\n </StageConfigField>\n <ServerGroupNamePreview\n application={this.props.application.name}\n stack={stage.stack}\n details={stage.details}\n ></ServerGroupNamePreview>\n\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"cloudrun.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.formik.setFieldValue('source', e.target.value)}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <StageConfigField label=\"Manifest\">\n <YamlEditor onChange={this.handleRawManifestChange} value={this.state.rawManifest} />\n </StageConfigField>\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"cloudrun.manifest.expectedArtifact\"\n label=\"Manifest Artifact\"\n onArtifactEdited={this.onManifestArtifactEdited}\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onManifestArtifactSelected(artifact.id)}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n <StageConfigField label=\"Expression Evaluation\" helpKey=\"cloudrun.manifest.skipExpressionEvaluation\">\n <CheckboxInput\n checked={stage.skipExpressionEvaluation === true}\n onChange={(e: any) => this.props.formik.setFieldValue('skipExpressionEvaluation', e.target.checked)}\n text=\"Skip SpEL expression evaluation\"\n />\n </StageConfigField>\n </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"cloudrun.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n </div>\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type { IAccountDetails, IStage, IStageConfigProps } from '@spinnaker/core';\nimport { AccountService, FormikStageConfig } from '@spinnaker/core';\n\nimport { DeployStageForm } from './DeployStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployStageConfig extends React.Component<IStageConfigProps, IDeployManifestStageConfigState> {\n private stage: IStage;\n private destroy$ = new Subject();\n\n public constructor(props: IStageConfigProps) {\n super(props);\n this.state = {\n accounts: [],\n };\n const { stage: initialStageConfig } = props;\n const stage = cloneDeep(initialStageConfig);\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n if (!stage.skipExpressionEvaluation) {\n stage.skipExpressionEvaluation = false;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'cloudrun';\n }\n if (!stage.moniker) {\n stage.moniker = {};\n }\n if (!stage.moniker.app) {\n stage.moniker.app = props.application.name;\n }\n // Intentionally initializing the stage config only once in the constructor\n // The stage config is then completely owned within FormikStageConfig's Formik state\n this.stage = stage;\n }\n\n public componentDidMount() {\n this.fetchAccounts();\n }\n\n private fetchAccounts = (): void => {\n observableFrom(AccountService.getAllAccountDetailsForProvider('cloudrun'))\n .pipe(takeUntil(this.destroy$))\n .subscribe((accounts: IAccountDetails[]) => {\n this.setState({ accounts });\n });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <DeployStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\n}\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyRedBlack: IDeploymentStrategy = {\n label: 'Red/Black',\n description: 'Disables <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'redblack',\n};\n","import { get, isEmpty } from 'lodash';\n\nimport type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { strategyRedBlack } from '../../../rolloutStrategy/redblack.strategy';\n\nconst MAX_VERSION_HISTORY_ANNOTATION = 'strategy.spinnaker.io/max-version-history';\n\nexport const deployValidators = (): IValidatorConfig[] => {\n return [\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'source', fieldLabel: 'Source' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IStage) => {\n const enabled = get(stage, 'trafficManagement.enabled', false);\n const services = get(stage, 'trafficManagement.options.services', []);\n if (enabled && isEmpty(services)) {\n return `Select at least one <strong>Service</strong> to enable Spinnaker-managed rollout strategy options.`;\n }\n if (enabled && stage.source === ManifestSource.TEXT) {\n const manifests = get(stage, 'manifests', []);\n const replicaSetManifests = manifests.filter((m) => m.kind === 'ReplicaSet');\n const strategy = get(stage, 'trafficManagement.options.strategy');\n const maxVersionHistory = parseInt(\n get(replicaSetManifests, [0, 'metadata', 'annotations', MAX_VERSION_HISTORY_ANNOTATION]),\n 10,\n );\n if (strategy === strategyRedBlack.key && maxVersionHistory < 2) {\n return `The max version history specified in your manifest conflicts with the behavior of the Red/Black rollout strategy. Please update your <strong>${MAX_VERSION_HISTORY_ANNOTATION}</strong> annotation to a value greater than or equal to 2.`;\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import React from 'react';\nimport type { IManifest } from '@spinnaker/core';\n\ninterface IStatusClasses {\n [key: string]: string;\n}\n\nconst STATUS_PILLS: IStatusClasses = {\n available: 'success',\n stable: 'success',\n paused: 'warn',\n failed: 'danger',\n};\n\nexport interface IDeployManifestStatusProps {\n manifest: IManifest;\n}\n\nexport class DeployManifestStatusPills extends React.Component<IDeployManifestStatusProps> {\n public render() {\n const { manifest } = this.props;\n if (manifest == null || manifest.status == null) {\n return null;\n }\n return Object.keys(manifest.status).map((statusKey, i) => {\n const statusDescription = manifest.status[statusKey];\n const statusClass = STATUS_PILLS[statusKey] || '';\n const isStable = statusDescription.state;\n const isUnstableWithMessage = !isStable && statusDescription.message;\n return (\n <span key={i}>\n {isStable && (\n <span title={statusDescription.message} className={`pill ${statusClass}`}>\n {statusKey}\n </span>\n )}\n {isUnstableWithMessage && (\n <span title={statusDescription.message} className=\"pill warn\">\n {statusKey}\n </span>\n )}\n <span> </span>\n </span>\n );\n });\n }\n}\n","import { get, trim } from 'lodash';\nimport React from 'react';\n\nimport type { IManifest, IRouterInjectedProps } from '@spinnaker/core';\nimport { AccountService, withRouter } from '@spinnaker/core';\n\nconst UNMAPPED_K8S_RESOURCE_STATE_KEY = 'cloudrunResource';\n\nexport interface IManifestDetailsProps {\n manifest: IManifest;\n linkName: string;\n accountId: string;\n}\n\nexport interface IManifestDetailsState {\n url: string;\n}\n\nexport class ManifestDetailsLinkComponent extends React.Component<\n IManifestDetailsProps & IRouterInjectedProps,\n IManifestDetailsState\n> {\n private spinnakerKindStateMap: { [k: string]: string } = {\n // keys from clouddriver's CloudrunSpinnakerKindMap\n serverGroupManagers: 'serverGroupManager',\n serverGroups: 'serverGroup',\n };\n\n constructor(props: IManifestDetailsProps & IRouterInjectedProps) {\n super(props);\n this.state = {\n url: '',\n };\n this.loadUrl();\n }\n\n private canOpen(): boolean {\n return !!this.props.manifest.manifest && !!this.state.url;\n }\n\n private spinnakerKindFromCloudrunKind(kind: string, kindMap: { [k: string]: string }) {\n const foundKind = Object.keys(kindMap).find((k) => k.toLowerCase() === kind.toLowerCase());\n return kindMap[foundKind];\n }\n\n private resourceRegion(): string {\n return trim(\n get(this.props, ['manifest', 'manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n }\n\n private getStateParams(stateKey: string): any {\n const kind = this.props.manifest.manifest.kind.toLowerCase();\n const name = this.props.manifest.manifest.metadata.name;\n const region = this.resourceRegion();\n const params: { [k: string]: string } = {\n accountId: this.props.accountId,\n provider: 'cloudrun',\n region,\n reg: region, // Filters the list of clusters on the Clusters screen to those in the same namespace\n [stateKey]: `${kind} ${name}`,\n };\n if (!params.region && kind === 'namespace' && stateKey === UNMAPPED_K8S_RESOURCE_STATE_KEY) {\n params.region = name;\n }\n if (!params.region || params.region === '') {\n params.region = '_';\n }\n return params;\n }\n\n private loadUrl() {\n const kind: string = get(this.props, ['manifest', 'manifest', 'kind'], '');\n const { accountId } = this.props;\n AccountService.getAccountDetails(accountId).then((account) => {\n const spinnakerKind = this.spinnakerKindFromCloudrunKind(kind, account.spinnakerKindMap);\n const stateKey = this.spinnakerKindStateMap[spinnakerKind] || UNMAPPED_K8S_RESOURCE_STATE_KEY;\n const params = this.getStateParams(stateKey);\n const url = this.props.stateService.href(`home.applications.application.insight.clusters.${stateKey}`, params);\n this.setState({ url });\n });\n }\n\n public render() {\n if (this.canOpen()) {\n return (\n <a href={this.state.url} className=\"clickable\">\n {this.props.linkName}\n </a>\n );\n } else {\n return null;\n }\n }\n}\n\nexport const ManifestDetailsLink = withRouter(ManifestDetailsLinkComponent);\n","import { get, trim } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest, IManifestEvent } from '@spinnaker/core';\nimport { JobEventBasedPodNameProvider, JobManifestPodLogs, relativeTime } from '@spinnaker/core';\n\nexport interface IManifestEventsProps {\n manifest: IManifest;\n}\n\nexport class ManifestEvents extends React.Component<IManifestEventsProps> {\n private pillStyle(e: IManifestEvent): string {\n if (e.type === 'Warning') {\n return 'alert';\n } else if (e.type === 'Normal') {\n return 'success';\n } else {\n return '';\n }\n }\n\n public render() {\n if (!this.props.manifest) {\n return null;\n }\n if (this.props.manifest && (!this.props.manifest.events || this.props.manifest.events.length === 0)) {\n return <div>No recent events found - Cloud Run does not store events for long.</div>;\n }\n const { events } = this.props.manifest;\n const namespace = trim(\n get(this.props.manifest, ['manifest', 'metadata', 'annotations', 'artifact.spinnaker.io/location'], ''),\n );\n return events.map((e, i) => {\n const firstTimestamp = get(e, 'firstTimestamp', '');\n const lastTimestamp = get(e, 'lastTimestamp', '');\n let firstEpochMilliseconds = 0;\n let lastEpochMilliseconds = 0;\n if (firstTimestamp) {\n firstEpochMilliseconds = DateTime.fromISO(firstTimestamp).toMillis();\n }\n if (lastTimestamp) {\n lastEpochMilliseconds = DateTime.fromISO(lastTimestamp).toMillis();\n }\n return (\n <div key={get(e, ['metadata', 'uid'], String(i))} className=\"info\">\n <div className=\"horizontal\">\n {e.count && (\n <div className={`pill ${this.pillStyle(e)}`}>\n {e.count} × <b>{e.reason}</b>\n </div>\n )}\n </div>\n {(e.firstTimestamp || e.lastTimestamp) && (\n <div>\n {e.firstTimestamp === e.lastTimestamp && (\n <div>\n <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n )}\n {e.firstTimestamp !== e.lastTimestamp && (\n <div>\n <div>\n First Occurrence: <i>{relativeTime(firstEpochMilliseconds)}</i>\n </div>\n <div>\n Last Occurrence: <i>{relativeTime(lastEpochMilliseconds)}</i>\n </div>\n </div>\n )}\n </div>\n )}\n <div>{e.message}</div>\n <div>\n <JobManifestPodLogs\n account={this.props.manifest.account}\n location={namespace}\n podNamesProviders={[new JobEventBasedPodNameProvider(this.props.manifest, e)]}\n linkName=\"Console Output (Raw)\"\n />\n </div>\n {i !== events.length - 1 && <br />}\n </div>\n );\n });\n }\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { CopyToClipboard, ManifestYaml } from '@spinnaker/core';\n\nimport { DeployManifestStatusPills } from './DeployStatusPills';\nimport { ManifestDetailsLink } from './ManifestDetailsLink';\nimport { ManifestEvents } from './ManifestEvents';\n\nimport './ManifestStatus.less';\n\nexport interface IManifestStatusProps {\n account: string;\n manifest: IManifest;\n}\n\nexport function ManifestStatus({ account, manifest }: IManifestStatusProps) {\n return (\n <>\n <dl className=\"manifest-status\" key=\"manifest-status\">\n <dt>{manifest.manifest.kind}</dt>\n <dd>\n <CopyToClipboard\n displayText={true}\n text={manifest.manifest.metadata.name}\n toolTip={`Copy ${manifest.manifest.metadata.name}`}\n />\n \n <DeployManifestStatusPills manifest={manifest} />\n </dd>\n </dl>\n <div className=\"manifest-support-links\" key=\"manifest-support-links\">\n <ManifestYaml\n linkName=\"YAML\"\n manifestText={dump(manifest.manifest)}\n modalTitle={manifest.manifest.metadata.name}\n />\n <ManifestDetailsLink linkName=\"Details\" manifest={manifest} accountId={account} />\n </div>\n <div className=\"manifest-events pad-left\" key=\"manifest-events\">\n <ManifestEvents manifest={manifest} />\n </div>\n </>\n );\n}\n","import type { Application, IManifest } from '@spinnaker/core';\nimport { ManifestReader } from '@spinnaker/core';\n\nexport interface IStageManifest {\n kind: string;\n apiVersion: string;\n metadata: {\n namespace: string;\n name: string;\n };\n}\n\n// A manifest that the artifact-store entity storage feature has replaced with a\n// reference, rather than expanding it back into a real manifest before deck ever\n// sees it (e.g. gate isn't configured to expand these on read).\nexport interface IStoredManifestReference {\n type: string;\n reference: string;\n}\n\nexport function isStoredManifestReference(manifest: unknown): manifest is IStoredManifestReference {\n return (\n !!manifest &&\n typeof manifest === 'object' &&\n (manifest as IStoredManifestReference).type === 'remote/map/base64' &&\n typeof (manifest as IStoredManifestReference).reference === 'string'\n );\n}\n\nexport interface IManifestParams {\n account: string;\n location: string;\n name: string;\n}\n\nexport type IManifestCallback = (manifest: IManifest) => void;\n\nexport class CloudrunManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n CloudrunManifestService.updateManifest(params, fn);\n return app.onRefresh(() => CloudrunManifestService.updateManifest(params, fn));\n }\n\n private static updateManifest(params: IManifestParams, fn: IManifestCallback) {\n ManifestReader.getManifest(params.account, params.location, params.name).then((manifest) => fn(manifest));\n }\n\n public static manifestIdentifier(manifest: IStageManifest) {\n const kind = manifest.kind.toLowerCase();\n // manifest.metadata.namespace doesn't exist if it's a namespace being deployed\n const namespace = (manifest.metadata.namespace || '_').toLowerCase();\n const name = manifest.metadata.name.toLowerCase();\n const apiVersion = (manifest.apiVersion || '_').toLowerCase();\n // assuming this identifier is opaque and not parsed anywhere. Including the\n // apiVersion will prevent collisions with CRD kinds without having any visible\n // effect elsewhere\n return `${namespace} ${kind} ${apiVersion} ${name}`;\n }\n\n public static stageManifestToManifestParams(manifest: IStageManifest, account: string): IManifestParams {\n return {\n account,\n name: CloudrunManifestService.scopedKind(manifest) + ' ' + manifest.metadata.name,\n location: manifest.metadata.namespace == null ? '_' : manifest.metadata.namespace,\n };\n }\n\n private static apiGroup(manifest: IStageManifest): string {\n const parts = (manifest.apiVersion || '_').split('/');\n if (parts.length < 2) {\n return '';\n }\n return parts[0];\n }\n\n private static isCRDGroup(manifest: IStageManifest): boolean {\n return !CloudrunManifestService.BUILT_IN_GROUPS.includes(CloudrunManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (CloudrunManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + CloudrunManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n private static readonly BUILT_IN_GROUPS = [\n '',\n 'core',\n 'batch',\n 'apps',\n 'extensions',\n 'storage.k8s.io',\n 'apiextensions.k8s.io',\n 'apiregistration.k8s.io',\n 'policy',\n 'scheduling.k8s.io',\n 'settings.k8s.io',\n 'authorization.k8s.io',\n 'authentication.k8s.io',\n 'rbac.authorization.k8s.io',\n 'certifcates.k8s.io',\n 'networking.k8s.io',\n ];\n}\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IManifest } from '@spinnaker/core';\nimport { ExecutionDetailsSection, ManifestYaml, StageFailureMessage } from '@spinnaker/core';\n\nimport { ManifestStatus } from './ManifestStatus';\nimport type { IStageManifest, IStoredManifestReference } from '../../../../manifest/manifest.service';\nimport { CloudrunManifestService, isStoredManifestReference } from '../../../../manifest/manifest.service';\n\nexport interface IManifestSubscription {\n id: string;\n unsubscribe: () => void;\n manifest: IManifest;\n}\n\nexport interface IDeployStatusState {\n subscriptions: IManifestSubscription[];\n manifestIds: string[];\n}\n\nexport class DeployStatus extends React.Component<IExecutionDetailsSectionProps, IDeployStatusState> {\n public static title = 'deployStatus';\n\n constructor(props: IExecutionDetailsSectionProps) {\n super(props);\n this.state = { subscriptions: [], manifestIds: [] };\n }\n\n public componentDidMount() {\n this.componentDidUpdate(this.props, this.state);\n }\n\n public componentWillUnmount() {\n this.unsubscribeAll();\n }\n\n public componentDidUpdate(_prevProps: IExecutionDetailsSectionProps, prevState: IDeployStatusState) {\n const manifests: IStageManifest[] = get(this.props.stage, ['context', 'outputs.manifests'], [])\n .filter((m) => !!m)\n .filter((m) => !isStoredManifestReference(m));\n const manifestIds = manifests.map((m) => CloudrunManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = CloudrunManifestService.manifestIdentifier(manifest);\n return {\n id,\n unsubscribe: this.subscribeToManifestUpdates(id, manifest),\n manifest: this.stageManifestToIManifest(manifest, this.props.stage.context.account),\n };\n });\n this.setState({ subscriptions, manifestIds });\n }\n }\n\n private subscribeToManifestUpdates(id: string, manifest: IStageManifest): () => void {\n const params = CloudrunManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return CloudrunManifestService.subscribe(this.props.application, params, (updated: IManifest) => {\n const idx = this.state.subscriptions.findIndex((sub) => sub.id === id);\n if (idx !== -1) {\n const subscription = { ...this.state.subscriptions[idx], manifest: updated };\n const subscriptions = [...this.state.subscriptions];\n subscriptions[idx] = subscription;\n this.setState({ subscriptions });\n }\n });\n }\n\n private unsubscribeAll() {\n this.state.subscriptions.forEach(({ unsubscribe }) => unsubscribe());\n }\n\n // Manifests the artifact-store entity storage feature replaced with a reference instead\n // of expanding them before deck saw them. We can't determine their kind/name/namespace\n // (and so can't subscribe to live status for them) without fetching the content, so we\n // let the user load them on demand instead, same as a baked manifest's YAML.\n private get storedManifestRefs(): IStoredManifestReference[] {\n return get(this.props.stage, ['context', 'outputs.manifests'], [])\n .filter((m: unknown) => !!m)\n .filter(isStoredManifestReference);\n }\n\n private stageManifestToIManifest(manifest: IStageManifest, account: string): IManifest {\n return {\n name: get(manifest, 'metadata.name', ''),\n moniker: null,\n account,\n cloudProvider: 'cloudrun',\n location: get(manifest, 'metadata.namespace', ''),\n manifest: manifest,\n status: {},\n artifacts: [],\n events: [],\n };\n }\n\n public render() {\n const { name: sectionName, current: currentSection, stage } = this.props;\n const manifests: IManifest[] = this.state.subscriptions.filter((sub) => !!sub.manifest).map((sub) => sub.manifest);\n return (\n <ExecutionDetailsSection name={sectionName} current={currentSection}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n {manifests && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n {manifests.map((manifest) => {\n const uid =\n manifest.manifest.metadata.uid || CloudrunManifestService.manifestIdentifier(manifest.manifest);\n return <ManifestStatus key={uid} manifest={manifest} account={stage.context.account} />;\n })}\n </div>\n </div>\n </div>\n )}\n {!!this.storedManifestRefs.length && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"well alert alert-info\">\n {this.storedManifestRefs.map((ref, i) => (\n <div key={i}>\n <ManifestYaml\n linkName=\"Load Manifest Details\"\n modalTitle=\"Manifest\"\n manifestUri={ref.reference.replace(/^ref?:\\/\\//, '')}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n </ExecutionDetailsSection>\n );\n }\n}\n","import React from 'react';\n\nimport type { IExecutionDetailsSectionProps, ILoadBalancer } from '@spinnaker/core';\nimport { AccountTag, ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport type { ICloudrunAllocationDescription } from '../../../loadBalancer/loadBalancerTransformer';\n\nexport function CloudrunEditLoadBalancerExecutionDetails(props: IExecutionDetailsSectionProps) {\n const { current, name, stage } = props;\n const loadBalancers = ((stage.context || {}).loadBalancers || []) as ILoadBalancer[];\n\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <div className=\"row\">\n <div className=\"col-md-12\">\n <table className=\"table table-condensed\">\n <thead>\n <tr>\n <th>Account</th>\n <th>Name</th>\n <th>Region</th>\n <th>Allocations</th>\n </tr>\n </thead>\n <tbody>\n {loadBalancers.map((loadBalancer) => (\n <tr key={getLoadBalancerCompositeKey(loadBalancer)}>\n <td>\n <AccountTag account={loadBalancer.credentials || loadBalancer.account} />\n </td>\n <td>{loadBalancer.name}</td>\n <td>{loadBalancer.region}</td>\n <td>{renderAllocations((loadBalancer as any).splitDescription?.allocationDescriptions)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n </ExecutionDetailsSection>\n );\n}\n\nCloudrunEditLoadBalancerExecutionDetails.title = 'editLoadBalancerConfig';\n\nexport function getLoadBalancerCompositeKey(loadBalancer: Partial<ILoadBalancer>): string {\n return [\n loadBalancer.name || '',\n loadBalancer.credentials || loadBalancer.account || '',\n loadBalancer.region || '',\n ].join(':');\n}\n\nfunction renderAllocations(allocationDescriptions: ICloudrunAllocationDescription[] = []): React.ReactNode {\n if (!allocationDescriptions.length) {\n return null;\n }\n\n return (\n <ul className=\"list-unstyled no-margin\">\n {allocationDescriptions.map((allocation, index) => (\n <li key={`${allocation.revisionName || allocation.target || allocation.cluster || 'allocation'}:${index}`}>\n {allocation.revisionName || allocation.target || allocation.cluster || 'Allocation'}:{' '}\n <span>{allocation.percent}%</span>\n </li>\n ))}\n </ul>\n );\n}\n","import type { IStage } from '@spinnaker/core';\nimport {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { DeployStageConfig } from './DeployStageConfig';\nimport { deployValidators } from './deploy.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Cloud Run)',\n description: 'Deploy a Cloud Run manifest yaml/json file.',\n key: 'deployCloudrunManifest',\n cloudProvider: 'cloudrun',\n component: DeployStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployValidators(),\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import { cloneDeep } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancer, IStageConfigProps } from '@spinnaker/core';\nimport { AccountTag, ReactModal } from '@spinnaker/core';\n\nimport { getLoadBalancerCompositeKey } from './CloudrunEditLoadBalancerExecutionDetails';\nimport { LoadBalancerMessage } from '../../../common/LoadBalancerMessage';\nimport { CloudrunLoadBalancerModal } from '../../../loadBalancer/configure/wizard/CloudrunLoadBalancerModal';\n\nexport class CloudrunEditLoadBalancerStageConfig extends React.Component<IStageConfigProps> {\n public componentDidMount(): void {\n this.props.updateStage({\n loadBalancers: this.props.stage.loadBalancers || [],\n cloudProvider: 'cloudrun',\n });\n }\n\n private addLoadBalancer = (): void => {\n CloudrunLoadBalancerChoiceModal.show({ application: this.props.application })\n .then((newLoadBalancer) => {\n this.props.updateStage({ loadBalancers: [...(this.props.stage.loadBalancers || []), newLoadBalancer] });\n })\n .catch(() => undefined);\n };\n\n private editLoadBalancer = (index: number): void => {\n CloudrunLoadBalancerModal.show({\n app: this.props.application,\n loadBalancer: cloneDeep(this.props.stage.loadBalancers[index]),\n isNew: false,\n forPipelineConfig: true,\n })\n .then((updatedLoadBalancer) => {\n const loadBalancers = [...this.props.stage.loadBalancers];\n loadBalancers[index] = updatedLoadBalancer;\n this.props.updateStage({ loadBalancers });\n })\n .catch(() => undefined);\n };\n\n private removeLoadBalancer = (index: number): void => {\n const loadBalancers = [...this.props.stage.loadBalancers];\n loadBalancers.splice(index, 1);\n this.props.updateStage({ loadBalancers });\n };\n\n public render() {\n const { pipeline, stage } = this.props;\n if (pipeline.strategy) {\n return null;\n }\n return (\n <div className=\"well well-sm clearfix\">\n <div className=\"row\">\n <div className=\"col-md-12\">\n <h4 className=\"text-left\">Load Balancers</h4>\n </div>\n </div>\n <div className=\"row\">\n <div className=\"col-md-12\">\n <table className=\"table table-condensed\">\n <thead>\n <tr>\n <th>Account</th>\n <th>Name</th>\n <th>Region</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n {(stage.loadBalancers || []).map((loadBalancer: ILoadBalancer, index: number) => (\n <tr\n key={`${loadBalancer.credentials || loadBalancer.account}:${loadBalancer.name}:${\n loadBalancer.region\n }`}\n >\n <td>\n <AccountTag account={loadBalancer.credentials || loadBalancer.account} />\n </td>\n <td>{loadBalancer.name}</td>\n <td>{loadBalancer.region}</td>\n <td className=\"condensed-actions\">\n <button\n type=\"button\"\n className=\"btn btn-sm btn-link\"\n onClick={() => this.editLoadBalancer(index)}\n >\n <span className=\"glyphicon glyphicon-edit\" title=\"Edit\" />\n </button>\n <button\n type=\"button\"\n className=\"btn btn-sm btn-link pad-left\"\n onClick={() => this.removeLoadBalancer(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" title=\"Remove\" />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n <tr>\n <td colSpan={8}>\n <button type=\"button\" className=\"btn btn-block btn-sm add-new\" onClick={this.addLoadBalancer}>\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add load balancer\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n </div>\n );\n }\n}\n\ninterface ICloudrunLoadBalancerChoiceModalProps {\n application: IStageConfigProps['application'];\n closeModal?: (loadBalancer: ILoadBalancer) => void;\n dismissModal?: () => void;\n}\n\ninterface ICloudrunLoadBalancerChoiceModalState {\n loading: boolean;\n loadBalancers: ILoadBalancer[];\n selectedLoadBalancer?: ILoadBalancer;\n}\n\nexport class CloudrunLoadBalancerChoiceModal extends React.Component<\n ICloudrunLoadBalancerChoiceModalProps,\n ICloudrunLoadBalancerChoiceModalState\n> {\n public static show(props: ICloudrunLoadBalancerChoiceModalProps): Promise<ILoadBalancer> {\n return ReactModal.show(CloudrunLoadBalancerChoiceModal, props);\n }\n\n private mounted = false;\n\n public state: ICloudrunLoadBalancerChoiceModalState = { loading: true, loadBalancers: [] };\n\n public componentDidMount(): void {\n this.mounted = true;\n this.props.application.loadBalancers\n .ready()\n .then(() => {\n if (!this.mounted) {\n return;\n }\n const loadBalancers = (this.props.application.loadBalancers.data as ILoadBalancer[]).filter(\n (candidate) => candidate.cloudProvider === 'cloudrun',\n );\n this.setState({ loadBalancers, selectedLoadBalancer: loadBalancers[0], loading: false });\n })\n .catch(() => {\n if (this.mounted) {\n this.setState({ loading: false });\n }\n });\n }\n\n public componentWillUnmount(): void {\n this.mounted = false;\n }\n\n private submit = (): void => {\n CloudrunLoadBalancerModal.show({\n app: this.props.application,\n loadBalancer: cloneDeep(this.state.selectedLoadBalancer),\n isNew: false,\n forPipelineConfig: true,\n })\n .then(this.props.closeModal)\n .catch(() => undefined);\n };\n\n public render() {\n const { dismissModal } = this.props;\n const { loading, loadBalancers, selectedLoadBalancer } = this.state;\n return (\n <div>\n <div className=\"modal-header\">\n <button type=\"button\" className=\"close\" onClick={dismissModal}>\n <span>×</span>\n </button>\n <h4 className=\"modal-title\">Select Load Balancer</h4>\n </div>\n <div className=\"modal-body\">\n {loading && (\n <div style={{ height: 200 }} className=\"horizontal center middle\">\n Loading...\n </div>\n )}\n {!loading && loadBalancers.length === 0 && <LoadBalancerMessage showCreateMessage={true} />}\n {!loading && loadBalancers.length > 0 && (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Load Balancer</b>\n </div>\n <div className=\"col-md-7\">\n <select\n className=\"form-control input-sm\"\n value={getLoadBalancerCompositeKey(selectedLoadBalancer)}\n onChange={(event) =>\n this.setState({\n selectedLoadBalancer: loadBalancers.find(\n (loadBalancer) => getLoadBalancerCompositeKey(loadBalancer) === event.target.value,\n ),\n })\n }\n >\n {loadBalancers.map((loadBalancer) => (\n <option\n key={getLoadBalancerCompositeKey(loadBalancer)}\n value={getLoadBalancerCompositeKey(loadBalancer)}\n >\n {getLoadBalancerOptionLabel(loadBalancer)}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n )}\n </div>\n <div className=\"modal-footer\">\n <button type=\"button\" className=\"btn btn-default\" onClick={dismissModal}>\n Cancel\n </button>\n {loadBalancers.length > 0 && (\n <button type=\"button\" className=\"btn btn-primary\" onClick={this.submit}>\n <span className=\"far fa-check-circle\" /> Edit\n </button>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport function getLoadBalancerOptionLabel(loadBalancer: ILoadBalancer): string {\n return [loadBalancer.account, loadBalancer.name, loadBalancer.region].filter(Boolean).join(' ');\n}\n","import type { IStageTypeConfig } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { CloudrunEditLoadBalancerExecutionDetails } from './CloudrunEditLoadBalancerExecutionDetails';\nimport { CloudrunEditLoadBalancerStageConfig } from './CloudrunEditLoadBalancerStageConfig';\n\nexport const CLOUDRUN_EDIT_LOAD_BALANCER_STAGE_CONFIG: IStageTypeConfig = {\n label: 'Edit Load Balancer (Cloud Run)',\n description: 'Edits a load balancer',\n key: 'upsertCloudrunLoadBalancers',\n cloudProvider: 'cloudrun',\n component: CloudrunEditLoadBalancerStageConfig,\n executionDetailsSections: [CloudrunEditLoadBalancerExecutionDetails, ExecutionDetailsTasks],\n validators: [],\n};\n\nRegistry.pipeline.registerStage(CLOUDRUN_EDIT_LOAD_BALANCER_STAGE_CONFIG);\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface ICloudrunProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n };\n}\n\nexport const CloudrunProviderSettings: ICloudrunProviderSettings = (SETTINGS.providers\n .cloudrun as ICloudrunProviderSettings) || { defaults: {} };\nif (CloudrunProviderSettings) {\n CloudrunProviderSettings.resetToOriginal = SETTINGS.resetProvider('cloudrun');\n}\n","import { cloneDeep } from 'lodash';\n\nimport type {\n Application,\n IAccountDetails,\n IExpectedArtifact,\n IMoniker,\n IPipeline,\n IServerGroupCommand,\n IServerGroupCommandViewState,\n IStage,\n} from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { CloudrunProviderSettings } from '../../cloudrun.settings';\nimport type { CloudrunDeployDescription } from '../serverGroupTransformer.service';\n\nexport enum ServerGroupSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n\nexport interface ICloudrunServerGroupCommandData {\n command: ICloudrunServerGroupCommand;\n metadata: ICloudrunServerGroupCommandMetadata;\n stack: string;\n freeFormDetails: string;\n configFiles: string[];\n}\n\nexport interface ICloudrunServerGroupCommand extends Omit<IServerGroupCommand, 'source' | 'application'> {\n application?: string;\n stack?: string;\n detail?: string;\n account: string;\n configFiles: string[];\n freeFormDetails: string;\n region: string;\n regions: [];\n isNew?: boolean;\n cloudProvider: string;\n provider: string;\n selectedProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: ICloudrunServerGroupSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ServerGroupSource;\n versioned?: boolean;\n gitCredentialType?: string;\n viewState: IServerGroupCommandViewState;\n mode: string;\n credentials: string;\n sourceType: string;\n configArtifacts: any[];\n interestingHealthProviderNames: [];\n fromArtifact: boolean;\n}\n\nexport interface IViewState {\n mode: string;\n submitButtonLabel: string;\n disableStrategySelection: boolean;\n stage?: IStage;\n pipeline?: IPipeline;\n}\n\nexport interface ICloudrunServerGroupCommandMetadata {\n backingData: any;\n}\n\nexport interface ICloudrunServerGroupSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nconst getSubmitButtonLabel = (mode: string): string => {\n switch (mode) {\n case 'createPipeline':\n return 'Add';\n case 'editPipeline':\n return 'Done';\n default:\n return 'Create';\n }\n};\n\nexport class CloudrunV2ServerGroupCommandBuilder {\n // new add servergroup\n public buildNewServerGroupCommand(app: Application): Promise<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'create');\n }\n\n // add servergroup from deploy stage of pipeline\n public buildNewServerGroupCommandForPipeline(_stage: IStage, pipeline: IPipeline) {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommandForPipeline(_stage, pipeline);\n }\n\n // edit servergroup from deploy stage of pipeline\n // add servergroup from deploy stage of pipeline\n public buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ) {\n return CloudrunServerGroupCommandBuilder.buildServerGroupCommandFromPipeline(app, cluster, _stage, pipeline);\n }\n}\n\nexport class CloudrunServerGroupCommandBuilder {\n public static ServerGroupCommandIsValid(command: ICloudrunServerGroupCommand): boolean {\n if (!command.moniker) {\n return false;\n }\n\n if (!command.moniker.app) {\n return false;\n }\n\n return true;\n }\n\n public static copyAndCleanCommand(input: ICloudrunServerGroupCommand): ICloudrunServerGroupCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n // deploy stage : construct servergroup command\n public static buildNewServerGroupCommandForPipeline(stage: IStage, pipeline: IPipeline): any {\n const command: any = this.buildNewServerGroupCommand(\n { name: pipeline.application } as Application,\n 'cloudrun',\n 'createPipeline',\n );\n command.viewState = {\n ...command.viewState,\n pipeline,\n requiresTemplateSelection: true,\n stage,\n };\n return command;\n }\n\n private static getExpectedArtifacts(pipeline: IPipeline): IExpectedArtifact[] {\n return pipeline.expectedArtifacts || [];\n }\n\n public static buildServerGroupCommandFromPipeline(\n app: Application,\n cluster: CloudrunDeployDescription,\n _stage: IStage,\n pipeline: IPipeline,\n ): Promise<ICloudrunServerGroupCommandData> {\n return CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(app, 'cloudrun', 'editPipeline').then(\n (command: ICloudrunServerGroupCommandData) => {\n command = {\n ...command,\n ...cluster,\n\n backingData: {\n ...command.metadata.backingData.backingData,\n\n expectedArtifacts: CloudrunServerGroupCommandBuilder.getExpectedArtifacts(pipeline),\n },\n credentials: cluster.account || command.metadata.backingData.credentials,\n viewState: {\n ...command.metadata.backingData.viewState,\n stage: _stage,\n pipeline,\n },\n } as ICloudrunServerGroupCommandData;\n return command;\n },\n );\n }\n\n public static getCredentials(accounts: IAccountDetails[]): string {\n const accountNames: string[] = (accounts || []).map((account) => account.name);\n const defaultCredentials: string = CloudrunProviderSettings.defaults.account;\n\n return accountNames.includes(defaultCredentials) ? defaultCredentials : accountNames[0];\n }\n\n public static getRegion(accounts: any[], credentials: string): string {\n const account = accounts.find((_account) => _account.name === credentials);\n return account ? account.region : null;\n }\n\n // new servergroup command\n public static buildNewServerGroupCommand(\n app: Application,\n sourceAccount: string,\n mode: string,\n ): Promise<ICloudrunServerGroupCommandData> {\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('cloudrun'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n return Promise.all([dataToFetch.accounts, dataToFetch.artifactAccounts]).then(([accounts, artifactAccounts]) => {\n const backingData = { accounts, artifactAccounts };\n\n const account = accounts.some((a) => a.name === sourceAccount)\n ? accounts.find((a) => a.name === sourceAccount).name\n : accounts.length\n ? accounts[0].name\n : null;\n const viewState: IViewState = {\n mode,\n submitButtonLabel: getSubmitButtonLabel(mode),\n disableStrategySelection: mode === 'create',\n };\n const credentials = account ? account : this.getCredentials(accounts);\n const region = this.getRegion(backingData.accounts, credentials);\n const cloudProvider = 'cloudrun';\n\n return {\n command: {\n application: app.name,\n configFiles: [''],\n cloudProvider,\n selectedProvider: cloudProvider,\n provider: cloudProvider,\n region,\n credentials,\n gitCredentialType: 'NONE',\n manifest: null,\n sourceType: 'git',\n configArtifacts: [],\n interestingHealthProviderNames: [],\n fromArtifact: false,\n account,\n viewState,\n },\n metadata: {\n backingData,\n },\n } as ICloudrunServerGroupCommandData;\n });\n }\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { Application, IAccount, IRouterInjectedProps, IServerGroup } from '@spinnaker/core';\nimport { AccountSelectInput, HelpField, NameUtils, ServerGroupNamePreview, withRouter } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupBasicSettingsProps {\n accounts: IAccount[];\n onAccountSelect: (account: string) => void;\n selectedAccount: string;\n formik: IWizardServerGroupBasicSettingsProps['formik'];\n onEnterStack: (stack: string) => void;\n detailsChanged: (detail: string) => void;\n app: Application;\n}\n\nexport interface IServerGroupBasicSettingsState {\n namePreview: string;\n createsNewCluster: boolean;\n latestServerGroup: IServerGroup;\n}\n\nexport function ServerGroupBasicSettingsComponent({\n accounts,\n onAccountSelect,\n selectedAccount,\n formik,\n onEnterStack,\n detailsChanged,\n app,\n stateService,\n}: IServerGroupBasicSettingsProps & IRouterInjectedProps) {\n const { values } = formik;\n const { stack = '', freeFormDetails } = values;\n\n const namePreview = NameUtils.getClusterName(app.name, stack, freeFormDetails);\n const createsNewCluster = !app.clusters.find((c) => c.name === namePreview);\n const inCluster = (app.serverGroups.data as IServerGroup[])\n .filter((serverGroup) => {\n return (\n serverGroup.cluster === namePreview &&\n serverGroup.account === values.command.credentials &&\n serverGroup.region === values.command.region\n );\n })\n .sort((a, b) => a.createdTime - b.createdTime);\n const latestServerGroup = inCluster.length ? inCluster.pop() : null;\n\n const navigateToLatestServerGroup = () => {\n const { values } = formik;\n const params = {\n provider: values.command.selectedProvider,\n accountId: latestServerGroup.account,\n region: latestServerGroup.region,\n serverGroup: latestServerGroup.name,\n };\n\n if (stateService.is('home.applications.application.insight.clusters')) {\n stateService.go('.serverGroup', params);\n } else {\n stateService.go('^.serverGroup', params);\n }\n };\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">Account</div>\n <div className=\"col-md-7\">\n <AccountSelectInput\n value={selectedAccount}\n onChange={(evt: any) => onAccountSelect(evt.target.value)}\n readOnly={false}\n accounts={accounts}\n provider=\"cloudrun\"\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Stack <HelpField id=\"cloudrun.serverGroup.stack\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={stack}\n onChange={(e) => onEnterStack(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n Detail <HelpField id=\"cloudrun.serverGroup.detail\" />\n </div>\n <div className=\"col-md-7\">\n <input\n type=\"text\"\n className=\"form-control input-sm no-spel\"\n value={freeFormDetails}\n onChange={(e) => detailsChanged(e.target.value)}\n />\n </div>\n </div>\n {!values.command.viewState.hideClusterNamePreview && (\n <ServerGroupNamePreview\n createsNewCluster={createsNewCluster}\n latestServerGroupName={latestServerGroup?.name}\n mode={values.command.viewState.mode}\n namePreview={namePreview}\n navigateToLatestServerGroup={navigateToLatestServerGroup}\n />\n )}\n </div>\n );\n}\n\nexport const ServerGroupBasicSettings = withRouter(ServerGroupBasicSettingsComponent);\n\nexport interface IWizardServerGroupBasicSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n app: Application;\n}\n\nexport class WizardServerGroupBasicSettings extends React.Component<IWizardServerGroupBasicSettingsProps> {\n private accountUpdated = (account: string): void => {\n const { formik } = this.props;\n formik.values.command.account = account;\n formik.setFieldValue('account', account);\n };\n\n private stackChanged = (stack: string): void => {\n const { setFieldValue, values } = this.props.formik;\n values.command.stack = stack;\n setFieldValue('stack', stack);\n };\n\n private freeFormDetailsChanged = (freeFormDetails: string) => {\n const { setFieldValue, values } = this.props.formik;\n values.command.freeFormDetails = freeFormDetails;\n setFieldValue('freeFormDetails', freeFormDetails);\n };\n\n public render() {\n const { formik, app } = this.props;\n return (\n <ServerGroupBasicSettings\n accounts={formik.values.metadata?.backingData?.accounts || []}\n onAccountSelect={this.accountUpdated}\n selectedAccount={formik.values.command?.account || ''}\n onEnterStack={this.stackChanged}\n formik={formik}\n detailsChanged={this.freeFormDetailsChanged}\n app={app}\n />\n );\n }\n}\n","import type { FormikProps } from 'formik';\nimport React, { useState } from 'react';\n\nimport { HelpField, TextAreaInput } from '@spinnaker/core';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\n\nexport interface IServerGroupConfigFilesSettingsProps {\n configFiles: string[];\n onEnterConfig: (file: string[]) => void;\n}\ntype configFiles = IServerGroupConfigFilesSettingsProps['configFiles'];\n\nexport function ServerGroupConfigFilesSettings({ configFiles, onEnterConfig }: IServerGroupConfigFilesSettingsProps) {\n const [configValues, setConfigValues] = useState<configFiles>(configFiles);\n\n function mapTabToSpaces(event: any, i: number) {\n if (event.which === 9) {\n event.preventDefault();\n const cursorPosition = event.target.selectionStart;\n const inputValue = event.target.value;\n event.target.value = `${inputValue.substring(0, cursorPosition)} ${inputValue.substring(cursorPosition)}`;\n event.target.selectionStart += 2;\n }\n const newConfigValues = [...configValues];\n newConfigValues[i] = event.target.value;\n setConfigValues(newConfigValues);\n onEnterConfig(newConfigValues);\n }\n\n return (\n <div className=\"form-horizontal\">\n <div className=\"form-group\">\n {configValues.map((configFile, index) => (\n <>\n <div className=\"col-md-3 sm-label-right\">\n Service Yaml\n <HelpField id=\"cloudrun.serverGroup.configFiles\" />{' '}\n </div>\n <div className=\"col-md-8\" key={index}>\n <TextAreaInput\n name={'text' + index}\n value={configFile}\n rows={10}\n onChange={(e) => mapTabToSpaces(e, index)}\n />\n </div>\n </>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface IWizardServerGroupConfigFilesSettingsProps {\n formik: FormikProps<ICloudrunServerGroupCommandData>;\n}\n\nexport class WizardServerGroupConfigFilesSettings extends React.Component<IWizardServerGroupConfigFilesSettingsProps> {\n private configUpdated = (configFiles: string[]): void => {\n const { formik } = this.props;\n formik.values.command.configFiles = configFiles;\n formik.setFieldValue('configFiles', configFiles);\n };\n\n // yaml config files input from server group wizard\n public render() {\n const { formik } = this.props;\n return (\n <ServerGroupConfigFilesSettings\n configFiles={formik.values.configFiles || formik.values.command.configFiles}\n onEnterConfig={this.configUpdated}\n />\n );\n }\n}\n","import React from 'react';\n\nimport type {\n Application,\n DeckRuntimeServices,\n IModalComponentProps,\n IRouterInjectedProps,\n IStage,\n} from '@spinnaker/core';\nimport {\n DeckRuntimeContext,\n noop,\n ReactModal,\n TaskMonitor,\n withRouter,\n WizardModal,\n WizardPage,\n} from '@spinnaker/core';\n\nimport { WizardServerGroupBasicSettings } from './BasicSettings';\nimport { WizardServerGroupConfigFilesSettings } from './ConfigFiles';\nimport type { ICloudrunServerGroupCommandData } from '../serverGroupCommandBuilder.service';\nimport { CloudrunServerGroupCommandBuilder } from '../serverGroupCommandBuilder.service';\n\nexport interface ICloudrunServerGroupModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: ICloudrunServerGroupCommandData;\n isNew?: boolean;\n closeModal?: (command: any) => void;\n dismissModal?: () => void;\n}\n\nexport interface ICloudrunServerGroupModalState {\n command: ICloudrunServerGroupCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ServerGroupWizardComponent extends React.Component<\n ICloudrunServerGroupModalProps & IRouterInjectedProps,\n ICloudrunServerGroupModalState\n> {\n public static contextType = DeckRuntimeContext;\n public declare context: React.ContextType<typeof DeckRuntimeContext>;\n\n public static defaultProps: Partial<ICloudrunServerGroupModalProps & IRouterInjectedProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n private _isUnmounted = false;\n private applicationRefreshUnsubscribe?: () => void;\n\n /* private serverGroupWriter: ServerGroupWriter; */\n public static show(\n props: ICloudrunServerGroupModalProps,\n runtimeServices: DeckRuntimeServices,\n ): Promise<ICloudrunServerGroupCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ServerGroupWizard, props, modalProps, runtimeServices);\n }\n\n constructor(props: ICloudrunServerGroupModalProps & IRouterInjectedProps) {\n super(props);\n if (!props.command) {\n CloudrunServerGroupCommandBuilder.buildNewServerGroupCommand(props.application, 'cloudrun', 'create').then(\n (command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n },\n );\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as ICloudrunServerGroupCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${\n props.command.command.viewState.submitButtonLabel === 'Create' ? 'Creating' : 'Updating'\n } your Server Group`,\n onDismiss: () => this.props.dismissModal(),\n onTaskComplete: this.onTaskComplete,\n }),\n };\n }\n\n private onTaskComplete = () => {\n this.clearApplicationRefreshSubscription();\n this.applicationRefreshUnsubscribe = this.props.application.serverGroups.onNextRefresh(this.onApplicationRefresh);\n this.props.application.serverGroups.refresh();\n };\n\n protected onApplicationRefresh = (): void => {\n this.clearApplicationRefreshSubscription();\n if (this._isUnmounted) {\n return;\n }\n\n const { command } = this.props;\n const { taskMonitor } = this.state;\n const cloneStage = taskMonitor.task.execution.stages.find((stage: IStage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][command.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: command.command.credentials,\n region: command.command.region,\n provider: 'cloudrun',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if (this.props.stateService.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if (this.props.stateService.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n this.props.stateService.go(transitionTo, newStateParams);\n }\n }\n };\n\n public componentWillUnmount(): void {\n this._isUnmounted = true;\n this.clearApplicationRefreshSubscription();\n }\n\n private clearApplicationRefreshSubscription = (): void => {\n this.applicationRefreshUnsubscribe?.();\n this.applicationRefreshUnsubscribe = undefined;\n };\n\n private submit = (c: ICloudrunServerGroupCommandData): void => {\n const command: any = CloudrunServerGroupCommandBuilder.copyAndCleanCommand(c.command);\n const forPipelineConfig = command.viewState.mode === 'editPipeline' || command.viewState.mode === 'createPipeline';\n if (forPipelineConfig) {\n this.props.closeModal && this.props.closeModal(command);\n } else {\n //command.viewState.mode = 'create';\n const submitMethod = () =>\n this.context.services.serverGroupWriter.cloneServerGroup(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n return null;\n }\n };\n public render() {\n const { dismissModal, application } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n const labelButton = this.state.command.command.viewState.submitButtonLabel;\n\n return (\n <WizardModal<ICloudrunServerGroupCommandData>\n heading={`${labelButton === 'Add' || labelButton === 'Create' ? 'Create New' : 'Update'} Server Group`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={labelButton}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => (\n <WizardServerGroupBasicSettings ref={innerRef} formik={formik} app={application} />\n )}\n />\n\n <WizardPage\n label=\"Service Yaml\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardServerGroupConfigFilesSettings ref={innerRef} formik={formik} />}\n />\n </>\n )}\n />\n );\n }\n}\n\nexport const ServerGroupWizard = Object.assign(withRouter(ServerGroupWizardComponent), {\n show: ServerGroupWizardComponent.show,\n});\n","export class CloudrunHealth {\n public static PLATFORM = 'Cloud Run Service';\n}\n","import React from 'react';\nimport { Dropdown, MenuItem } from 'react-bootstrap';\n\nimport type { IRouterInjectedProps, IServerGroupActionsProps } from '@spinnaker/core';\nimport { ConfirmationModalService, useDeckRuntimeServices, withRouter } from '@spinnaker/core';\n\nimport { CloudrunHealth } from '../../common/cloudrunHealth';\nimport type { ICloudrunServerGroup } from '../../interfaces';\n\nexport function CloudrunServerGroupActionsComponent({\n app,\n serverGroup,\n stateService,\n}: IServerGroupActionsProps & IRouterInjectedProps) {\n const { serverGroupWriter } = useDeckRuntimeServices();\n const cloudrunServerGroup = serverGroup as ICloudrunServerGroup;\n const canDestroyServerGroup = Boolean(\n cloudrunServerGroup && !cloudrunServerGroup.tags?.isLatest && cloudrunServerGroup.disabled,\n );\n const destroyServerGroup = () => {\n const stateParams = {\n name: cloudrunServerGroup.name,\n accountId: cloudrunServerGroup.account,\n region: cloudrunServerGroup.region,\n };\n const taskMonitor = {\n application: app,\n title: `Destroying ${cloudrunServerGroup.name}`,\n onTaskComplete: () => {\n if (stateService.includes('**.serverGroup', stateParams)) {\n stateService.go('^');\n }\n },\n };\n const confirmationModalParams = {\n header: `Really destroy ${cloudrunServerGroup.name}?`,\n buttonText: `Destroy ${cloudrunServerGroup.name}`,\n account: cloudrunServerGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: (params: any) => serverGroupWriter.destroyServerGroup(cloudrunServerGroup, app, params),\n askForReason: true,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: CloudrunHealth.PLATFORM,\n interestingHealthProviderNames: [] as string[],\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = [CloudrunHealth.PLATFORM];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n return (\n <Dropdown className=\"dropdown\" id=\"cloudrun-server-group-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">Server Group Actions</Dropdown.Toggle>\n <Dropdown.Menu>\n {cloudrunServerGroup.tags?.isLatest && (\n <MenuItem\n disabled={true}\n title=\"You cannot destroy the latest server group (revision). You may be able to delete this server group's load balancer.\"\n >\n Destroy\n </MenuItem>\n )}\n {canDestroyServerGroup && <MenuItem onClick={destroyServerGroup}>Destroy</MenuItem>}\n {!canDestroyServerGroup && !cloudrunServerGroup.tags?.isLatest && (\n <MenuItem\n disabled={true}\n title=\"You cannot destroy this server group while it is receiving traffic. You may be able to delete this server group's load balancer.\"\n >\n Destroy\n </MenuItem>\n )}\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n\nexport const CloudrunServerGroupActions = withRouter(CloudrunServerGroupActionsComponent);\n","import { isEmpty } from 'lodash';\nimport { Observable } from 'rxjs';\n\nimport type { IServerGroup, IServerGroupDetailsProps } from '@spinnaker/core';\nimport { ServerGroupReader } from '@spinnaker/core';\n\nexport const cloudrunServerGroupDetailsGetter = (\n props: IServerGroupDetailsProps,\n autoClose: () => void,\n): Observable<IServerGroup> => {\n const { app, serverGroup } = props;\n return new Observable<IServerGroup>((observer) => {\n ServerGroupReader.getServerGroup(app.name, serverGroup.accountId, serverGroup.region, serverGroup.name).then(\n (serverGroupDetails: IServerGroup) => {\n let fromApp = app.serverGroups.data.find((toCheck: IServerGroup) => {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n\n if (!fromApp) {\n app.loadBalancers.data.some((loadBalancer: any) => {\n if (loadBalancer.account !== serverGroup.accountId) {\n return false;\n }\n return loadBalancer.serverGroups.some((toCheck: IServerGroup) => {\n if (toCheck.name === serverGroup.name) {\n fromApp = toCheck;\n return true;\n }\n return false;\n });\n });\n }\n\n const mergedServerGroup = { ...serverGroupDetails, ...fromApp };\n if (isEmpty(mergedServerGroup)) {\n autoClose();\n observer.complete();\n return;\n }\n\n observer.next(mergedServerGroup);\n },\n () => {\n autoClose();\n observer.complete();\n },\n );\n });\n};\n","import React from 'react';\n\nimport type { IServerGroupDetailsSectionProps } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, HealthCounts, timestamp } from '@spinnaker/core';\n\nexport function CloudrunServerGroupInformationSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Server Group Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(serverGroup.createdTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={serverGroup.account} />\n </dd>\n <dt>Region</dt>\n <dd>{serverGroup.region}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function CloudrunServerGroupSizeSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n const capacity = serverGroup.capacity || ({} as any);\n const current = serverGroup.instances?.length || 0;\n return (\n <CollapsibleSection heading=\"Size\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n {capacity.min === capacity.max ? (\n <>\n <dt>Min/Max</dt>\n <dd>{capacity.min}</dd>\n </>\n ) : (\n <>\n <dt>Min</dt>\n <dd>{capacity.min}</dd>\n <dt>Max</dt>\n <dd>{capacity.max}</dd>\n </>\n )}\n <dt>Current</dt>\n <dd>{current}</dd>\n </dl>\n </CollapsibleSection>\n );\n}\n\nexport function CloudrunServerGroupHealthSection({ serverGroup }: IServerGroupDetailsSectionProps) {\n return (\n <CollapsibleSection heading=\"Health\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Instances</dt>\n <dd>\n <HealthCounts container={serverGroup.instanceCounts} className=\"pull-left\" />\n </dd>\n </dl>\n </CollapsibleSection>\n );\n}\n","import type { IServerGroup } from '@spinnaker/core';\n\nimport type { ICloudrunServerGroupCommand } from '../serverGroup/configure/serverGroupCommandBuilder.service';\n\nexport class CloudrunV2ServerGroupTransformer {\n public normalizeServerGroup(serverGroup: IServerGroup): Promise<IServerGroup> {\n return Promise.resolve(serverGroup);\n }\n\n public convertServerGroupCommandToDeployConfiguration(command: ICloudrunServerGroupCommand): any {\n return new CloudrunDeployDescription(command);\n }\n}\n\nexport class CloudrunDeployDescription {\n public cloudProvider = 'cloudrun';\n public provider = 'cloudrun';\n public credentials: string;\n public account: string;\n public application: string;\n public stack?: string;\n public freeFormDetails?: string;\n public configFiles: string[];\n public region: string;\n public strategy?: string;\n public type?: string;\n public fromArtifact: boolean;\n public configArtifacts: string[];\n public strategyApplication?: string;\n public strategyPipeline?: string;\n public gitCredentialType: string;\n public interestingHealthProviderNames: string[];\n public sourceType: string;\n\n constructor(command: ICloudrunServerGroupCommand) {\n this.credentials = command.credentials;\n this.account = command.credentials;\n this.application = command.application;\n this.stack = command.stack;\n this.freeFormDetails = command.freeFormDetails;\n this.region = command.region;\n this.strategy = command.strategy;\n this.type = command.type;\n this.fromArtifact = command.fromArtifact;\n this.gitCredentialType = command.gitCredentialType;\n this.configFiles = command.configFiles;\n this.sourceType = command.sourceType;\n this.interestingHealthProviderNames = command.interestingHealthProviderNames || [];\n this.configArtifacts = [];\n }\n}\n","import { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport './help/cloudrun.help';\nimport { CloudrunInstanceDetails } from './instance/details/CloudrunInstanceDetails';\nimport { CloudrunLoadBalancerModal } from './loadBalancer/configure/wizard/CloudrunLoadBalancerModal';\nimport { CloudrunLoadBalancerActions } from './loadBalancer/details/CloudrunLoadBalancerActions';\nimport {\n CloudrunLoadBalancerDetailsSection,\n CloudrunLoadBalancerDnsSection,\n CloudrunLoadBalancerStatusSection,\n CloudrunLoadBalancerTrafficSplitSection,\n} from './loadBalancer/details/sections';\nimport { useCloudrunLoadBalancerDetails } from './loadBalancer/details/useCloudrunLoadBalancerDetails';\nimport { CloudrunLoadBalancerTransformer } from './loadBalancer/loadBalancerTransformer';\nimport logo from './logo/cloudrun.logo.png';\nimport './pipeline/stages/deployManifest/deployStage';\nimport './pipeline/stages/editLoadBalancer/cloudrunEditLoadBalancerStage';\nimport { CloudrunV2ServerGroupCommandBuilder } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ServerGroupWizard } from './serverGroup/configure/wizard/serverGroupWizard';\nimport { CloudrunServerGroupActions } from './serverGroup/details/CloudrunServerGroupActions';\nimport { cloudrunServerGroupDetailsGetter } from './serverGroup/details/cloudrunServerGroupDetailsGetter';\nimport {\n CloudrunServerGroupHealthSection,\n CloudrunServerGroupInformationSection,\n CloudrunServerGroupSizeSection,\n} from './serverGroup/details/sections';\nimport { CloudrunV2ServerGroupTransformer } from './serverGroup/serverGroupTransformer.service';\n\nimport './logo/cloudrun.logo.less';\n\nCloudProviderRegistry.registerProvider('cloudrun', {\n name: 'cloudrun',\n logo: {\n path: logo,\n },\n\n instance: {\n details: CloudrunInstanceDetails,\n },\n serverGroup: {\n CloneServerGroupModal: ServerGroupWizard,\n commandBuilder: CloudrunV2ServerGroupCommandBuilder,\n detailsActions: CloudrunServerGroupActions,\n detailsGetter: cloudrunServerGroupDetailsGetter,\n detailsSections: [\n CloudrunServerGroupInformationSection,\n CloudrunServerGroupSizeSection,\n CloudrunServerGroupHealthSection,\n ],\n transformer: CloudrunV2ServerGroupTransformer,\n skipUpstreamStageCheck: true,\n },\n\n loadBalancer: {\n transformer: CloudrunLoadBalancerTransformer,\n CreateLoadBalancerModal: CloudrunLoadBalancerModal,\n useDetailsHook: useCloudrunLoadBalancerDetails,\n detailsActions: CloudrunLoadBalancerActions,\n detailsSections: [\n CloudrunLoadBalancerDetailsSection,\n CloudrunLoadBalancerStatusSection,\n CloudrunLoadBalancerTrafficSplitSection,\n CloudrunLoadBalancerDnsSection,\n ],\n },\n});\n\nDeploymentStrategyRegistry.registerProvider('cloudrun', ['custom', 'redblack', 'rollingpush', 'rollingredblack']);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAAFAUlEQVRYR82YfUwcRRjGn5m7veO4rZI2aKuk1kRNjQ012rRANB53YNpYtFHS1Aj9ktaPtGINpPWgKQ0sVNvUNGirgYBJSTSA1H6ltpTrVYtUS2u1aRS/LSRFEmqBPcC7vR2zixwc7N4tJ02c5P64zMwzv332fd+ZWYL/USNGWFL3MpvVJy4xMlZzTJA/7y0hw9HmR4VxlokVIGQzwOzRxCL0D4DgA4+bL4ykERHGKfiqAJb3HyAmTCXVniL7Bj09XRhXqZjBKJqnD2REicjIbNnOn9bS1YVxlvuOgrHl0w0DQo553PYswzAuQcxhwMFpB/lXkAC5LUV83UT9Sc44SpjZxPnaGLDoFsK0BwP2VG8JkcavMQnGWSYWgGD3rQIJ6TIUeor5PbowjrcGk6gktwFI0oKZk0Bw/SYLdSXNpOi6IcfK3SWbaap3a3zXqECYM85ycTcYCvTUX3JZ0NMn41D7iLt5Dgv6hhgavgrEBkSwZ3ztCcE4ynyLKGGKK2Y95ZT7TBBWxuHzH4LY2TSMBUkU+1bbcOn3IPZ95o/FJUlmJNVbbG9X0350YacgKtmTE+kRORNQs9GGO2+nyKsawrVeGe+vt+HyH0E88yiHmrP+WFyq8xTxuSEYV2n/ckbpUSNeFzxlxbKFZuxv9uPUFQkrUzgkz6U4/o2E7MUcbvgY3j01NZeILGe1bL/tmOpMernYTBgyjMBkLjBj29NWfNEhofKkH/MSKXatikPO/kEwBmQv4bA02YyD5wKGXWIEp8+4+UziFPrzAFplBEQZM4snqH8tHjcHGTZWD6nTKtfYUHvWr8aO0u6fTbHpSSt+6ZFR5THqkryBOAXfEYBplmc9wPfW2jD/Loqi+mH81C1jzeMWzEvU3lnmJFDUtfpx+GJYfdOSPkHSBbGHAIlGnRlN6efTOPU1KL+HkkzY8aw1okTLVQk1Xj+6+8bq1MQJJL1MrCYEL04FpjrPhnvvGHNm3RMWNai1mlIkFeBzHRL8QWBgSAeGkAbiKhWXMooTRmFmzSCo3xweMwfW29RYmthOfiepIP3jAAJBhP0PVV8Zy1QFpyDWAlhrBEhJ31cyLKFsevBuip3PxYVN7eyV8XFbABd+HQnoiU2Sgb7BMIc+9BTx61QYhyA+TAGl+oaragjtfSEOC+8xqXXG+72E3Mc4ZD3ChUYeuRRAw/kA/o4Sr0EZakYCGJaBVG8Rf3msApcPVoDJ26K50+K2QxF6tXYIf/mYuh0oG+hvPTLqWgO40qnthq5DQ2SXxx3/ptI/tjeViLMpp7ozTw8o7QETSrOVvUlSq2zyXBOKV1jRdCGgvpapNkrR+WcvW+wt4bvDYNTYKRNfB8E7eqJK5f365yC+vTby9EoWffmjhI7rsR0jgjLb2rSFfzsUxBMXdgnKKY+laAFZzQAfF/V2Y8ggAlysz7eHnSYnKbuEgVUM5CM9xekCCshs9adb+LBztuZjOgXfIYCt0AXiAN4au0MM9Hhjvm3SzUNT0VE64KCUnInkdxwH2GME8vtZ5uHCyXcn/XuT4DsAsJenG4gBNY35ds3tRxfGUd4/nzKqpHpCJCCbhSDeYihmAbB+2cTSPtk046rWjMh37dKBElCyI9pSRoEYUNGYb3fr6UWNQqcKRAuifYWItxDYdBwihIgyY5WRQCYVPT1io99nZvKc5jnCxKytDW+QkWNhhBbVmWgC09n/Dw0j4+SJOXQTAAAAAElFTkSuQmCC\""],"names":["key","value","forEach","entry","HelpContentsRegistry","register","CloudrunInstanceDetails","React","Component","constructor","super","arguments","this","state","loading","isUnmounted","componentDidMount","props","app","ready","then","retrieveInstance","instance","setState","catch","instanceIdNotFound","instanceId","componentWillUnmount","instanceManager","flattenDeep","getDataSource","data","map","loadBalancer","serverGroups","find","dataSource","instances","some","possibleMatch","id","Promise","reject","recentHistoryExtraData","region","account","category","serverGroup","name","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","instanceDetails","render","_a","className","createElement","Spinner","size","CollapsibleSection","heading","defaultExpanded","launchTime","timestamp","AccountTag","UISref","to","params","accountId","provider","vmZoneName","title","healthState","loadBalancers","LoadBalancerMessage","showCreateMessage","CloudrunLoadBalancerUpsertDescription","convertTrafficSplitToTrafficSplitDescription","split","allocationDescriptions","reduce","trafficTargets","acc","trafficTarget","revisionName","percent","concat","credentials","cloudProvider","loadBalancerName","migrateTraffic","mapAllocationsToDecimals","splitDescription","description","mapAllocationsToPercentages","Math","round","CloudrunLoadBalancerTransformer","normalizeLoadBalancer","type","instanceCounts","buildInstanceCounts","detachedInstances","transformInstance","activeServerGroups","filter","isDisabled","chain","flatten","resolve","convertLoadBalancerForEditing","application","upToDateLoadBalancer","candidate","cloneDeep","convertLoadBalancerToUpsertDescription","has","camelCase","health","up","down","outOfService","succeeded","failed","starting","unknown","length","get","allocationTotalIsValid","sum","Number","CloudrunLoadBalancerModalComponent","transformer","onTaskComplete","clearApplicationRefreshSubscription","applicationRefreshUnsubscribe","onNextRefresh","onApplicationRefresh","refresh","dismissModal","newStateParams","stateService","includes","go","call","submit","forPipelineConfig","closeModal","taskMonitor","LoadBalancerWriter","upsertLoadBalancer","updateLoadBalancer","isNew","TaskMonitor","onDismiss","show","ReactModal","CloudrunLoadBalancerModal","dialogClassName","convertedLoadBalancer","command","sourceLoadBalancer","join","submitButtonLabel","canSubmit","onClick","style","height","CloudrunLoadBalancerBasicSettings","onChange","disabled","submitting","Object","assign","withRouter","addAllocation","changeLoadBalancer","remainingServerGroups","serverGroupsWithoutAllocation","push","removeAllocation","index","splice","updateAllocation","changes","serverGroupsWithAllocation","allServerGroups","difference","mutator","serverGroupOptions","showAddButton","allocationIsInvalid","HelpField","CloudrunAllocationConfigurationRow","allocationDescription","onRemove","options","uniq","target","StageConstants","TARGET_LIST","targetOption","val","targetLabel","label","Fragment","cluster","readOnly","event","required","min","max","paddingTop","paddingBottom","marginBottom","CloudrunLoadBalancerActions","cloudrunLoadBalancer","canDeleteLoadBalancer","getConfirmationModalBodyHtml","serverGroupNames","listOfServerGroupNames","Dropdown","Toggle","Menu","MenuItem","ConfirmationModalService","confirm","header","buttonText","body","taskMonitorConfig","submitMethod","deleteLoadBalancer","ComponentUrlDetails","component","url","href","rel","CopyToClipboard","toolTip","text","httpsUrl","compareCloudrunLoadBalancerServerGroups","a","b","localeCompare","CloudrunLoadBalancerDetailsSection","slice","sort","CloudrunLoadBalancerStatusSection","HealthCounts","container","CloudrunLoadBalancerTrafficSplitSection","_b","CloudrunLoadBalancerDnsSection","useCloudrunLoadBalancerDetails","loadBalancerParams","autoClose","loaded","error","useDataSource","useMemo","findCloudrunLoadBalancer","refetch","async","ManifestBindArtifactsSelector","onChangeBinding","binding","bindings","onChangeBindings","onRemoveBinding","stage","pipeline","renderSelect","i","expectedArtifactId","artifact","StageArtifactSelector","onArtifactEdited","onExpectedArtifactSelected","expectedArtifact","excludedArtifactIds","excludedArtifactTypePatterns","ArtifactTypePatterns","FRONT50_PIPELINE_TEMPLATE","ManifestSource","ManifestBasicSettings","accounts","onAccountSelect","selectedAccount","AccountSelectInput","evt","ServerGroupNamePreview","stack","details","textAlign","DeployStageForm","excludedManifestArtifactTypes","MAVEN_FILE","getSourceOptions","TEXT","ARTIFACT","option","capitalize","handleRawManifestChange","rawManifest","manifests","formik","setFieldValue","onManifestArtifactSelected","onManifestArtifactEdited","getRequiredArtifacts","requiredArtifactIds","requiredArtifacts","values","onRequiredArtifactsChanged","isTextManifest","isEmpty","yamlDocumentsToString","accountName","StageConfigField","helpKey","RadioButtonInput","e","source","YamlEditor","StageArtifactSelectorDelegate","manifestArtifact","manifestArtifactId","CheckboxInput","checked","skipExpressionEvaluation","DeployStageConfig","destroy$","Subject","fetchAccounts","observableFrom","AccountService","getAllAccountDetailsForProvider","pipe","takeUntil","subscribe","initialStageConfig","moniker","next","FormikStageConfig","updateStage","strategyRedBlack","MAX_VERSION_HISTORY_ANNOTATION","STATUS_PILLS","available","stable","paused","DeployManifestStatusPills","manifest","status","keys","statusKey","statusDescription","statusClass","isStable","isUnstableWithMessage","message","UNMAPPED_K8S_RESOURCE_STATE_KEY","ManifestDetailsLinkComponent","spinnakerKindStateMap","serverGroupManagers","loadUrl","canOpen","spinnakerKindFromCloudrunKind","kind","kindMap","k","toLowerCase","resourceRegion","trim","getStateParams","stateKey","metadata","reg","getAccountDetails","spinnakerKind","spinnakerKindMap","linkName","ManifestDetailsLink","ManifestEvents","pillStyle","events","namespace","firstTimestamp","lastTimestamp","firstEpochMilliseconds","lastEpochMilliseconds","DateTime","fromISO","toMillis","String","count","reason","relativeTime","JobManifestPodLogs","location","podNamesProviders","JobEventBasedPodNameProvider","styleInject","css","ref","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","ManifestStatus","displayText","ManifestYaml","manifestText","dump","modalTitle","isStoredManifestReference","reference","_CloudrunManifestService","fn","updateManifest","onRefresh","ManifestReader","getManifest","manifestIdentifier","apiVersion","stageManifestToManifestParams","scopedKind","apiGroup","parts","isCRDGroup","BUILT_IN_GROUPS","CloudrunManifestService","DeployStatus","subscriptions","manifestIds","componentDidUpdate","unsubscribeAll","_prevProps","prevState","m","unsubscribe","subscribeToManifestUpdates","stageManifestToIManifest","context","updated","idx","findIndex","sub","subscription","storedManifestRefs","artifacts","sectionName","current","currentSection","ExecutionDetailsSection","StageFailureMessage","failureMessage","uid","manifestUri","replace","CloudrunEditLoadBalancerExecutionDetails","getLoadBalancerCompositeKey","allocation","renderAllocations","Registry","registerStage","executionDetailsSections","ExecutionDetailsTasks","ExecutionArtifactTab","producesArtifacts","supportsCustomTimeout","validators","fieldName","fieldLabel","validate","_pipeline","enabled","services","replicaSetManifests","strategy","maxVersionHistory","parseInt","accountExtractor","configAccountExtractor","artifactExtractor","ExpectedArtifactService","accumulateArtifacts","artifactRemover","ArtifactReferenceService","removeArtifactFromFields","CloudrunEditLoadBalancerStageConfig","addLoadBalancer","CloudrunLoadBalancerChoiceModal","newLoadBalancer","editLoadBalancer","updatedLoadBalancer","removeLoadBalancer","colSpan","mounted","selectedLoadBalancer","Boolean","getLoadBalancerOptionLabel","CLOUDRUN_EDIT_LOAD_BALANCER_STAGE_CONFIG","CloudrunProviderSettings","SETTINGS","providers","cloudrun","defaults","resetToOriginal","resetProvider","ServerGroupSource","getSubmitButtonLabel","mode","CloudrunV2ServerGroupCommandBuilder","buildNewServerGroupCommand","CloudrunServerGroupCommandBuilder","buildNewServerGroupCommandForPipeline","_stage","buildServerGroupCommandFromPipeline","ServerGroupCommandIsValid","copyAndCleanCommand","input","viewState","requiresTemplateSelection","getExpectedArtifacts","expectedArtifacts","backingData","getCredentials","accountNames","defaultCredentials","getRegion","_account","sourceAccount","dataToFetch","artifactAccounts","getArtifactAccounts","all","disableStrategySelection","configFiles","selectedProvider","gitCredentialType","sourceType","configArtifacts","interestingHealthProviderNames","fromArtifact","ServerGroupBasicSettings","onEnterStack","detailsChanged","freeFormDetails","namePreview","NameUtils","getClusterName","createsNewCluster","clusters","c","inCluster","createdTime","latestServerGroup","pop","hideClusterNamePreview","latestServerGroupName","navigateToLatestServerGroup","is","WizardServerGroupBasicSettings","accountUpdated","stackChanged","freeFormDetailsChanged","_c","ServerGroupConfigFilesSettings","onEnterConfig","configValues","setConfigValues","useState","configFile","TextAreaInput","rows","which","preventDefault","cursorPosition","selectionStart","inputValue","substring","newConfigValues","mapTabToSpaces","WizardServerGroupConfigFilesSettings","configUpdated","ServerGroupWizardComponent","_isUnmounted","cloneStage","task","execution","stages","newServerGroupName","transitionTo","serverGroupWriter","cloneServerGroup","runtimeServices","ServerGroupWizard","labelButton","WizardModal","initialValues","nextIdx","wizard","WizardPage","order","innerRef","contextType","DeckRuntimeContext","defaultProps","noop","CloudrunHealth","CloudrunServerGroupActionsComponent","useDeckRuntimeServices","cloudrunServerGroup","canDestroyServerGroup","tags","isLatest","stateParams","confirmationModalParams","destroyServerGroup","askForReason","platformHealthOnlyShowOverride","attributes","platformHealthType","PLATFORM","platformHealthOnly","CloudrunServerGroupActions","cloudrunServerGroupDetailsGetter","Observable","observer","ServerGroupReader","getServerGroup","serverGroupDetails","fromApp","toCheck","mergedServerGroup","complete","CloudrunServerGroupInformationSection","CloudrunServerGroupSizeSection","capacity","CloudrunServerGroupHealthSection","CloudrunV2ServerGroupTransformer","normalizeServerGroup","convertServerGroupCommandToDeployConfiguration","CloudrunDeployDescription","CloudProviderRegistry","registerProvider","logo","path","CloneServerGroupModal","commandBuilder","detailsActions","detailsGetter","detailsSections","skipUpstreamStageCheck","CreateLoadBalancerModal","useDetailsHook","DeploymentStrategyRegistry"],"mappings":"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","x_google_ignoreList":[20]}
|