@spinnaker/kubernetes 0.2.9 → 0.2.12
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/CHANGELOG.md +24 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/help/kubernetes.help.ts","../src/manifest/ManifestSource.ts","../src/manifest/manifestCommandBuilder.service.ts","../src/manifest/wizard/BasicSettings.tsx","../src/manifest/wizard/ManifestEntry.tsx","../src/manifest/wizard/ManifestWizard.tsx","../src/instance/details/details.controller.ts","../src/loadBalancer/details/details.controller.ts","../src/loadBalancer/transformer.ts","../src/manifest/annotationCustomSections.component.ts","../src/manifest/artifact/artifact.component.ts","../src/manifest/delete/deleteOptionsForm.component.ts","../src/manifest/delete/delete.controller.ts","../src/manifest/editor/json/JsonEditor.tsx","../src/manifest/editor/json/jsonEditor.component.ts","../src/pipelines/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../src/manifest/manifestEvents.component.ts","../src/manifest/ManifestImageDetails.tsx","../../../node_modules/style-inject/dist/style-inject.es.js","../src/manifest/manifestImageDetails.component.ts","../src/manifest/ManifestLabels.tsx","../src/manifest/manifestLabels.component.ts","../src/manifest/ManifestQos.tsx","../src/manifest/manifestQos.component.ts","../src/manifest/ManifestResources.tsx","../src/manifest/manifestResources.component.ts","../src/manifest/rollout/RollingRestart.tsx","../src/manifest/rollout/pause.controller.ts","../src/manifest/rollout/resume.controller.ts","../src/manifest/rollout/undo.controller.ts","../src/manifest/scale/scaleSettingsForm.component.ts","../src/manifest/scale/scale.controller.ts","../src/manifest/selector/IManifestSelector.ts","../src/manifest/ManifestKindSearch.tsx","../src/manifest/selector/labelEditor/LabelEditor.tsx","../src/manifest/selector/IManifestLabelSelector.ts","../src/manifest/selector/ManifestSelector.tsx","../src/manifest/selector/selector.component.ts","../src/manifest/status/ManifestCondition.tsx","../src/manifest/status/condition.component.ts","../src/manifest/status/status.component.ts","../src/pipelines/stages/ManifestCoordinates.tsx","../src/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.tsx","../src/pipelines/stages/deleteManifest/DeleteManifestStageConfig.tsx","../src/pipelines/stages/ManifestExecutionDetails.tsx","../src/pipelines/stages/validators/manifestSelectorValidators.ts","../src/pipelines/stages/deleteManifest/deleteManifestStage.ts","../src/pipelines/stages/deployManifest/ManifestCopier.tsx","../src/pipelines/stages/deployManifest/CopyFromTemplateButton.tsx","../src/pipelines/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/pipelines/stages/deployManifest/NamespaceSelector.tsx","../src/rolloutStrategy/redblack.strategy.ts","../src/rolloutStrategy/index.ts","../src/rolloutStrategy/none.strategy.ts","../src/rolloutStrategy/highlander.strategy.ts","../src/pipelines/stages/deployManifest/ManifestDeploymentOptions.tsx","../src/pipelines/stages/deployManifest/DeployManifestStageForm.tsx","../src/pipelines/stages/deployManifest/DeployManifestStageConfig.tsx","../src/pipelines/stages/deployManifest/deployManifest.validator.ts","../src/pipelines/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipelines/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipelines/stages/deployManifest/deployManifestStage.ts","../src/pipelines/stages/patchManifest/PatchManifestOptionsForm.tsx","../src/pipelines/stages/patchManifest/PatchManifestStageForm.tsx","../src/pipelines/stages/patchManifest/PatchManifestStageConfig.tsx","../src/pipelines/stages/patchManifest/patchManifestStage.ts","../src/pipelines/stages/runJob/KubernetesV2RunJobStageConfig.tsx","../src/pipelines/stages/runJob/RunJobExecutionDetails.tsx","../src/pipelines/stages/runJob/runJobStage.ts","../src/pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceConfig.controller.ts","../src/pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceStage.ts","../src/pipelines/stages/scaleManifest/scaleManifestConfig.controller.ts","../src/pipelines/stages/scaleManifest/scaleManifestStage.ts","../src/pipelines/stages/traffic/ManifestTrafficStageConfig.tsx","../src/pipelines/stages/traffic/disableManifest.stage.ts","../src/pipelines/stages/traffic/enableManifest.stage.ts","../src/pipelines/stages/undoRolloutManifest/undoRolloutManifestConfig.controller.ts","../src/pipelines/stages/undoRolloutManifest/undoRolloutManifestStage.ts","../src/pipelines/validation/manifestSelector.validator.ts","../src/rawResource/rawResource.dataSource.ts","../src/rawResource/component/RawResourceUtils.ts","../src/rawResource/controller/FiltersPubSub.ts","../src/rawResource/component/group/RawResource.tsx","../src/rawResource/component/group/RawResouceGroup.tsx","../src/rawResource/component/group/RawResourceGroups.tsx","../src/rawResource/component/K8sResources.tsx","../src/rawResource/component/K8sResourcesFilters.tsx","../src/rawResource/component/group/RawResourceDetails.tsx","../src/rawResource/rawResource.states.ts","../src/rawResource/rawResource.module.ts","../src/resources/ResourceDetails.tsx","../src/resources/resources.state.ts","../src/securityGroup/details/details.controller.ts","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/transformer.ts","../src/manifest/traffic/ManifestTrafficService.ts","../src/serverGroup/details/details.controller.ts","../src/serverGroup/details/resize/resize.controller.ts","../src/serverGroup/serverGroupCommandBuilder.service.ts","../src/serverGroup/serverGroupTransformer.service.ts","../src/serverGroupManager/details/details.controller.ts","../src/validation/applicationName.validator.ts","../src/kubernetes.module.ts"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'kubernetes.serverGroup.stack':\n '(Optional) One of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'kubernetes.serverGroup.detail':\n '(Optional) A string of free-form alphanumeric characters and hyphens to describe any other variables.',\n 'kubernetes.serverGroup.containers': `\n (Required) Select at least one image to run in this server group (pod).\n If multiple images are selected, they will be colocated and replicated equally.`,\n 'kubernetes.serverGroup.initContainers': `\n (Optional) Select at least one image to run in this server group as an init container (pod).`,\n 'kubernetes.serverGroup.terminationGracePeriodSeconds':\n '(Required) Termination grace period in <b>seconds</b>. You can customize the termination grace period setting (terminationGracePeriodSeconds). Because server groups (pods) represent running processes on nodes in the cluster, it is important to allow those processes to gracefully terminate when they are no longer needed (vs. being violently killed and having no chance to clean up). Default is <b>30</b> seconds.',\n 'kubernetes.serverGroup.autoscaling.enabled':\n 'If selected, a horizontal autoscaler will be attached to this replica set.',\n 'kubernetes.serverGroup.autoscaling.min': 'The smallest number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.max': 'The largest number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.desired': 'The initial number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.cpuTarget': 'The target CPU utilization to be achieved by the autoscaler.',\n 'kubernetes.serverGroup.useSourceCapacity.enabled': 'Use same number of pods as current.',\n 'kubernetes.serverGroup.deployment.enabled': 'Check this box if you want to spawn a deployment for this replica set.',\n 'kubernetes.serverGroup.deployment.strategy': `\n <p><b>RollingUpdate</b> Deploy new pods in groups while killing old ones off.</p>\n <p><b>Recreate</b> Recreate the entire replica set.</p>`,\n 'kubernetes.serverGroup.deployment.minReadySeconds':\n 'The minimum time the deployment object will wait after a pod becomes healthy.',\n 'kubernetes.serverGroup.deployment.revisionHistoryLimit':\n \"(Optional) How many old replica sets to keep around. Leave empty if you don't want any to be deleted.\",\n 'kubernetes.serverGroup.deployment.maxSurge':\n '(Optional) Either a number or a percentage (1 vs. 10%) representing the maximum number of new pods to deploy during a rollout.',\n 'kubernetes.serverGroup.deployment.maxUnavailable':\n '(Optional) Either a number or a percentage (1 vs. 10%) representing the maximum number of pods to destroy during a rollout.',\n 'kubernetes.serverGroup.tolerations.key':\n 'Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.',\n 'kubernetes.serverGroup.tolerations.value':\n 'Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.',\n 'kubernetes.serverGroup.tolerations.operator':\n \"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.\",\n 'kubernetes.serverGroup.tolerations.effect':\n 'Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.',\n 'kubernetes.serverGroup.tolerations.tolerationSeconds':\n 'TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.',\n 'kubernetes.job.parallelism': '(Required) The number of concurrent pods to run.',\n 'kubernetes.job.completions':\n '(Required) The number of sucessful completions required for the job to be considered a success.',\n 'kubernetes.job.deadlineSeconds': '(Optional) The number of seconds until the job is considered a failure.',\n 'kubernetes.containers.image': 'The image selected under Basic Settings whose container is to be configured.',\n 'kubernetes.containers.registry': 'The registry the selected image will be pulled from.',\n 'kubernetes.containers.command': 'The list of commands which to overwrite the docker ENTRYPOINT array.',\n 'kubernetes.containers.name':\n '(Required) The name of the container associated with the above image. Used for resource identification',\n 'kubernetes.containers.pullpolicy': `\n <p>Sets the policy used to determine when to pull (download) the selected container image.</p>\n <p><i><b>Warning</b> - This shouldn't be modified for most production pipelines as it encourages aliasing tags,\n preventing proper rollbacks and determining an image's source.</i></p>\n <p><b>IFNOTPRESENT</b>: (Default) Pulls the image only when it is not present on the host machine.</p>\n <p><b>ALWAYS</b>: Always pulls the image, regardless of if it is present or not.</p>\n <p><b>NEVER</b>: Never pulls the image, regardless of if it is present or not.</p>`,\n 'kubernetes.containers.cpu': `\n (Optional) The relative CPU shares to allocate this container. If set, it is multiplied by 1024, then\n passed to Docker as the --cpu-shares flag. Otherwise the default of 1 (1024) is used`,\n 'kubernetes.containers.lifecycle.postStart': `\n Called immediately after a container is created. If the handler fails, the container is terminated\n and restarted according to its restart policy.`,\n 'kubernetes.containers.lifecycle.preStop': `\n Called immediately before a container is terminated. The container is terminated after the handler completes.\n The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated.`,\n 'kubernetes.containers.execAction.command': `\n Command to execute inside the container. The working directory for the command is root within the container's filesystem.\n An exit status of 0 is treated as live/healthy; non-zero is unhealthy.`,\n 'kubernetes.containers.httpGetAction.path': 'Path to access on the HTTP server',\n 'kubernetes.containers.httpGetAction.port': 'Number of the port to access on the container.',\n 'kubernetes.containers.httpGetAction.host': 'Host name to connect to, defaults to the pod IP.',\n 'kubernetes.containers.httpGetAction.uriScheme': 'Scheme to use for connecting to the host.',\n 'kubernetes.containers.httpGetAction.httpHeaders': 'Custom headers to set in the request.',\n 'kubernetes.containers.memory': `\n (Optional) The relative memory in megabytes to allocate this container. If set, it is converted to an integer\n and passed to Docker as the --memory flag`,\n 'kubernetes.containers.requests': `\n (Optional) This is used for scheduling. It assures that this container will always be scheduled on a machine ' +\n with at least this much of the resource available.`,\n 'kubernetes.containers.ports.name': '(Optional) A name for this port. Can be found using DNS lookup if specified.',\n 'kubernetes.containers.ports.containerPort': '(Required) The port to expose on this container.',\n 'kubernetes.containers.ports.hostPort':\n '(Optional) The port to expose on <b>Host IP</b>. Most containers do not need this',\n 'kubernetes.containers.ports.hostIp':\n '(Optional) The IP to bind the external port to. Most containers do not need this.',\n 'kubernetes.containers.ports.protocol': '(Required) The protocol for this port.',\n 'kubernetes.containers.limits': '(Optional) This provides a hard limit on this resource for the given container.',\n 'kubernetes.containers.probes.type': `\n <p><b>HTTP</b> Hit the probe at the specified port and path.</p>\n <p><b>EXEC</b> Execute the specified commands on the container.</p>\n <p><b>TCP</b> Connect to the container at the specified port.</p>`,\n 'kubernetes.containers.probes.initialDelay': 'How long to wait after startup before running this probe.',\n 'kubernetes.containers.probes.timeout': 'How long to wait on the result of this probe.',\n 'kubernetes.containers.probes.period': 'How long between probe executions.',\n 'kubernetes.containers.probes.successThreshold':\n 'How many executions need to succeed before the probe is declared healthy.',\n 'kubernetes.containers.probes.failureThreshold':\n 'How many executions need to fail before the probe is declared unhealthy.',\n 'kubernetes.containers.volumemounts.name': 'The <b>Volume Source</b> configured above to claim.',\n 'kubernetes.containers.volumemounts.mountPath': 'The directory to mount the specified <b>Volume Source</b> to.',\n 'kubernetes.containers.volumemounts.subPath':\n 'This will mount the sub path in the referenced volume rather than the root path.',\n 'kubernetes.namespace':\n 'The namespace you have configured with the above selected account. This will often be referred to as <b>Region</b> in Spinnaker.',\n 'kubernetes.loadBalancer.detail':\n '(Optional) A string of free-form alphanumeric characters; by convention, we recommend using \"frontend\".',\n 'kubernetes.loadBalancer.stack':\n '(Optional) One of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'kubernetes.service.ports.name': '(Optional) A name for this port. Can be found using DNS lookup if specified.',\n 'kubernetes.service.ports.port': 'The port this service will expose to resources internal to the cluster.',\n 'kubernetes.service.ports.nodePort': `\n (Optional) A port to open on every node in the cluster. This allows you to receive external traffic without\n having to provision a cloud load balancer. <b>Type</b> in <b>Advanced Settings</b> cannot be set to <b>ClusterIP</b> for this to work.`,\n 'kubernetes.service.ports.targetPort':\n '(Optional) The port to forward incoming traffic to for pods associated with this load balancer.',\n 'kubernetes.service.ports.protocol': 'The protocol this port listens to.',\n 'kubernetes.service.type': `\n <b>ClusterIP</b> means this is an internal load balancer only. <b>LoadBalancer</b> provisions a cloud load balancer if possible\n at address <b>Load Balancer IP</b>. <b>NodePort</b> means this load balancer forwards traffic from ports with <b>Node Port</b> specified.`,\n 'kubernetes.service.sessionAffinity': `\n <b>None</b> means incoming connections are not associated with the pods they are routed to. <b>ClientIP</b>\n associates connections with pods by incoming IP address.`,\n 'kubernetes.service.clusterIp': `\n (Optional) If specified, and available, this internal IP address will be the internal endpoint for this load balancer.\n If not specified, one will be assigned.`,\n 'kubernetes.service.loadBalancerIp': `\n If specified, and available, this external IP address will be the external endpoint for this load balancer\n when <b>Type</b> is set to <b>LoadBalancer</b>.`,\n 'kubernetes.service.externalIps': `\n IP addresses for which nodes in the cluster also accept traffic. This is not managed by Kubernetes and the\n responsibility of the user to configure.`,\n 'kubernetes.pod.dnsPolicy': `\n <p>Set DNS policy for containers within the pod.</p>\n <p>Defaults to <b>ClusterFirst</b>.</p>\n <p>To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to <b>ClusterFirstWithHostNet</b>.</p>`,\n 'kubernetes.pod.volume': `\n <p>A storage volume to be mounted and shared by containers in this pod. The lifecycle depends on the volume type selected.</p>\n <p><b>CONFIGMAP</b>: Intended to act as a reference to multiple properties files. Similar to the /etc directory, and the files within, on a Linux computer.</p>\n <p><b>EMPTYDIR</b>: A transient volume tied to the lifecycle of this pod.</p>\n <p><b>HOSTPATH</b>: A directory on the host node. Most pods do not need this.</p>\n <p><b>PERSISTENTVOLUMECLAIM</b>: An already created persistent volume claim to be bound by this pod.</p>\n <p><b>SECRET</b>: An already created kubernetes secret to be mounted in this pod.</p>`,\n 'kubernetes.pod.emptydir.medium': `\n The type of storage medium used by this volume type.\n <p><b>DEFAULT</b>: Depends on the storage mechanism backing this pod's Kubernetes installation.</p>\n <p><b>MEMORY</b>: A tmpfs (RAM-backed filesystem). Very fast, but usage counts against the memory resource limit, and contents are lost on reboot.</p>`,\n 'kubernetes.pod.volume.persistentvolumeclaim.claim': 'The name of the underlying persistent volume claim to request.',\n 'kubernetes.pod.volume.hostpath.path': \"The path on the host node's filesystem to mount.\",\n 'kubernetes.pod.volume.secret.secretName': 'The name of the secret to mount.',\n 'kubernetes.pod.volume.awsElasticBlockStore.volumeId':\n 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume).',\n 'kubernetes.pod.volume.awsElasticBlockStore.fsType':\n 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.',\n 'kubernetes.pod.volume.awsElasticBlockStore.partition':\n 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as \"1\". Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).',\n 'kubernetes.pod.volume.nfs.server': 'NFS (Network File System) server to be mount',\n 'kubernetes.pod.volume.nfs.path': 'The path in the NFS to mount',\n 'kubernetes.ingress.backend.port': 'The port for the specified load balancer.',\n 'kubernetes.ingress.backend.service':\n 'The load balancer (service) traffic not matching the below rules will be routed to.',\n 'kubernetes.ingress.rules.service': 'The load balancer (service) traffic matching this rule will be routed to.',\n 'kubernetes.ingress.rules.host':\n 'The fully qualified domain name of a network host. Any traffic routed to this host matches this rule. May not be an IP address, or contain port information.',\n 'kubernetes.ingress.rules.path': 'POSIX regex (IEE Std 1003.1) matched against the path of an incoming request.',\n 'kubernetes.ingress.rules.port': 'The port on the specifed load balancer to route traffic to.',\n 'kubernetes.ingress.tls.host':\n 'The fully qualified domain name of a network host. Any traffic routed to this host can be secured with TLS. May not be an IP address, or contain port information.',\n 'kubernetes.ingress.tls.secret':\n '(Optional) Name of the Kubernetes secret that will be used to secure TLS connections to the {{firewall}}. Note that Spinnaker will not create any secrets, they are assumed to exist.',\n 'kubernetes.manifest.account': `\n <p>A Spinnaker account corresponds to a physical Kubernetes cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n 'kubernetes.manifest.cluster': `\n <p>A cluster is a grouping of resources (often across multiple versions of a resource) within an application.</p>\n `,\n 'kubernetes.manifest.stackdetail': `\n <p>\n <b>Stack:</b> <i>(Optional)</i> A naming component used to optionally group manifests within Spinnaker. Typically used to create vertical stacks of resources that can be aggregated/filtered later.\n </p>\n <p>\n <b>Detail:</b> <i>(Optional)</i> A naming component used to store free-form text about your manifest, and can be used to aggregate/filter resources later.\n </p>\n `,\n 'kubernetes.manifest.delete.gracePeriod': `\n <p><i>(Optional)</i>The number of seconds given to the resource to terminate gracefully. Overrides what's set on the manifest if applicable.</p>\n `,\n 'kubernetes.manifest.delete.cascading': `\n <p>When set, delete all resources managed by this resource as well (all pods owned by a replica set). When unset, this may orphan resources.</p>\n `,\n 'kubernetes.manifest.source': `\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 'kubernetes.manifest.rolloutStrategyOptions': `\n <p>Allow Spinnaker to associate each ReplicaSet deployed in this stage with one or more Services and manage traffic based on your selected rollout strategy options.</p>\n `,\n 'kubernetes.manifest.rolloutStrategy': `\n <p>The rollout strategy tells Spinnaker what to do with the previous version(s) of the ReplicaSet in the cluster.</p>\n `,\n 'kubernetes.manifest.expectedArtifact':\n 'The artifact that is to be applied to the Kubernetes account for this stage. The artifact should represent a valid Kubernetes manifest.',\n 'kubernetes.manifest.requiredArtifactsToBind':\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-kubernetes-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n 'kubernetes.manifest.skipExpressionEvaluation':\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 'kubernetes.manifest.undoRollout.revisionsBack': `\n <p>How many revisions to rollback from the current active revision. This is not a hard-coded revision to rollout.</p>\n <p>For example: If you specify \"1\", and this stage executes, the prior revision will be active upon success.</p>\n `,\n 'kubernetes.manifest.patch.record': `Record the applied patch in the <i>kubernetes.io/change-cause</i> annotation. If the annotation already exists, the contents are replaced.`,\n 'kubernetes.manifest.patch.mergeStrategy': `\n <p>The merge strategy to use when patching Kubernetes objects:</p>\n <p><b>strategic</b>: <i>(Default)</i> <a href=\"https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md\" target=\"_blank\">Kubernetes Strategic merge patch.</a></p>\n <p><b>json</b>: <a href=\"https://tools.ietf.org/html/rfc6902\" target=\"_blank\">JSON Patch, RFC 6902</a></p>\n <p><b>merge</b>: <a href=\"https://tools.ietf.org/html/rfc7386\" target=\"_blank\">JSON Merge Patch, RFC 7386</a></p>\n `,\n 'kubernetes.runJob.captureSource':\n 'Source from which to capture Job output. Captured output will be available in the pipeline context for use in downstream stages.',\n 'kubernetes.runJob.captureSource.containerName': `Use logs from this container to capture output data.`,\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import { load } from 'js-yaml';\nimport { cloneDeep, has } from 'lodash';\nimport { $q } from 'ngimport';\n\nimport type { Application, IAccountDetails, IArtifactAccount, IMoniker } from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { ManifestSource } from './ManifestSource';\n\nconst LAST_APPLIED_CONFIGURATION = 'kubectl.kubernetes.io/last-applied-configuration';\n\nexport interface IKubernetesManifestCommandData {\n command: IKubernetesManifestCommand;\n metadata: IKubernetesManifestCommandMetadata;\n}\n\nexport interface IKubernetesManifestCommand {\n account: string;\n cloudProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: IKubernetesManifestSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ManifestSource;\n versioned?: boolean;\n}\n\nexport interface IKubernetesManifestCommandMetadata {\n backingData: any;\n}\n\nexport interface IKubernetesManifestSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nexport class KubernetesManifestCommandBuilder {\n // TODO(lwander) add explanatory error messages\n public static manifestCommandIsValid(command: IKubernetesManifestCommand): 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: IKubernetesManifestCommand): IKubernetesManifestCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n public static buildNewManifestCommand(\n app: Application,\n sourceManifest?: any,\n sourceMoniker?: IMoniker,\n sourceAccount?: string,\n ): PromiseLike<IKubernetesManifestCommandData> {\n if (sourceManifest != null && has(sourceManifest, ['metadata', 'annotations', LAST_APPLIED_CONFIGURATION])) {\n sourceManifest = load(sourceManifest.metadata.annotations[LAST_APPLIED_CONFIGURATION]);\n }\n\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('kubernetes'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n // TODO(dpeach): if no callers of this method are Angular controllers,\n // $q.all may be safely replaced with Promise.all.\n return $q\n .all(dataToFetch)\n .then((backingData: { accounts: IAccountDetails[]; artifactAccounts: IArtifactAccount[] }) => {\n const { accounts, artifactAccounts } = 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\n let manifestArtifactAccount: string = null;\n const [artifactAccountData] = artifactAccounts;\n if (artifactAccountData) {\n manifestArtifactAccount = artifactAccountData.name;\n }\n\n const cloudProvider = 'kubernetes';\n const moniker = sourceMoniker || {\n app: app.name,\n };\n\n const relationships = {\n loadBalancers: [] as string[],\n securityGroups: [] as string[],\n };\n\n const versioned: any = null;\n\n return {\n command: {\n cloudProvider,\n manifest: null,\n manifests: Array.isArray(sourceManifest)\n ? sourceManifest\n : sourceManifest != null\n ? [sourceManifest]\n : null,\n relationships,\n moniker,\n account,\n versioned,\n manifestArtifactAccount,\n source: ManifestSource.TEXT,\n },\n metadata: {\n backingData,\n },\n } as IKubernetesManifestCommandData;\n });\n }\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 { IKubernetesManifestCommandData } 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=\"kubernetes.manifest.account\" />\n </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=\"kubernetes\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<IKubernetesManifestCommandData>;\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 type { FormikProps } from 'formik';\nimport { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { YamlEditor } from '@spinnaker/core';\n\nimport type { IKubernetesManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n app: Application;\n formik: FormikProps<IKubernetesManifestCommandData>;\n}\n\nexport interface IManifestBasicSettingsState {\n rawManifest: string;\n}\n\nexport class ManifestEntry extends React.Component<IManifestBasicSettingsProps, IManifestBasicSettingsState> {\n constructor(props: IManifestBasicSettingsProps) {\n super(props);\n\n const { values } = this.props.formik;\n const [first = null, ...rest] = values.command.manifests || [];\n const manifest = rest && rest.length ? values.command.manifests : first;\n try {\n this.state = {\n rawManifest: manifest ? dump(manifest) : null,\n };\n } catch (e) {\n this.state = { rawManifest: null };\n }\n }\n\n private handleChange = (rawManifest: string, manifest: any) => {\n this.props.formik.setFieldValue(\n 'command.manifests',\n [].concat(manifest).filter((x) => !!x),\n );\n this.setState({ rawManifest });\n };\n\n public render() {\n return <YamlEditor value={this.state.rawManifest} onChange={this.handleChange} />;\n }\n}\n","import React from 'react';\n\nimport type { Application, IModalComponentProps } from '@spinnaker/core';\nimport { ManifestWriter, noop, ReactModal, TaskMonitor, WizardModal, WizardPage } from '@spinnaker/core';\n\nimport { WizardManifestBasicSettings } from './BasicSettings';\nimport { ManifestEntry } from './ManifestEntry';\nimport type { IKubernetesManifestCommandData } from '../manifestCommandBuilder.service';\nimport { KubernetesManifestCommandBuilder } from '../manifestCommandBuilder.service';\n\nexport interface IKubernetesManifestModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: IKubernetesManifestCommandData;\n isNew?: boolean;\n}\n\nexport interface IKubernetesManifestModalState {\n command: IKubernetesManifestCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ManifestWizard extends React.Component<IKubernetesManifestModalProps, IKubernetesManifestModalState> {\n public static defaultProps: Partial<IKubernetesManifestModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IKubernetesManifestModalProps): Promise<IKubernetesManifestCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ManifestWizard, props, modalProps);\n }\n\n constructor(props: IKubernetesManifestModalProps) {\n super(props);\n if (!props.command) {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(props.application).then((command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n });\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as IKubernetesManifestCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${this.props.isNew ? 'Deploying' : 'Updating'} your manifest`,\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n }),\n };\n }\n\n private submit = (c: IKubernetesManifestCommandData): void => {\n const command = KubernetesManifestCommandBuilder.copyAndCleanCommand(c.command);\n const submitMethod = () => ManifestWriter.deployManifest(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n };\n\n public render() {\n const { application, dismissModal, isNew } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n\n return (\n <WizardModal<IKubernetesManifestCommandData>\n heading={`${isNew ? 'Deploy' : 'Update'} Manifest`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={isNew ? 'Create' : 'Edit'}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardManifestBasicSettings ref={innerRef} formik={formik} />}\n />\n\n <WizardPage\n label=\"Manifest\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <ManifestEntry ref={innerRef} formik={formik} app={application} />}\n />\n </>\n )}\n />\n );\n }\n}\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { flattenDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer, IManifest } from '@spinnaker/core';\nimport { InstanceReader, ManifestReader, RecentHistoryService, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesInstance } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\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: IKubernetesInstance[];\n}\n\ninterface IConsoleOutputInstance {\n account: string;\n region: string;\n id: string;\n provider: string;\n}\n\ninterface InstanceIdentifier {\n account: string;\n id: string;\n name: string;\n namespace: string;\n}\n\nclass KubernetesInstanceDetailsController implements IController {\n public state = { loading: true };\n public instance: IKubernetesInstance;\n public manifest: IManifest;\n public consoleOutputInstance: IConsoleOutputInstance;\n public environment: string;\n\n public static $inject = ['instance', '$uibModal', '$q', '$scope', 'app', '$state'];\n constructor(\n instance: InstanceFromStateParams,\n private $uibModal: IModalService,\n private $q: IQService,\n private $scope: IScope,\n private app: Application,\n private $state: StateService,\n ) {\n this.app\n .ready()\n .then(() => {\n this.extractInstance(instance);\n this.app.onRefresh(this.$scope, () => this.extractInstance(instance));\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n })\n .catch(() => this.autoClose());\n }\n\n public deleteInstance(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.instance.name,\n namespace: this.instance.namespace,\n account: this.instance.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editInstance(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.instance.moniker,\n this.instance.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractInstance(instanceFromState: InstanceFromStateParams): void {\n const instanceId = this.retrieveInstance(instanceFromState);\n if (!instanceId) {\n return this.autoClose();\n }\n this.$q\n .all([\n this.fetchInstance(instanceId).then((instance: IKubernetesInstance) => {\n this.instance = instance;\n this.consoleOutputInstance = {\n account: instance.account,\n region: instance.zone,\n id: instance.humanReadableName,\n provider: instance.provider,\n };\n }),\n ManifestReader.getManifest(instanceId.account, instanceId.namespace, instanceId.name).then(\n (manifest: IManifest) => {\n this.manifest = manifest;\n },\n ),\n ])\n .then(() => {\n this.state.loading = false;\n });\n }\n\n private fetchInstance(instance: InstanceIdentifier): PromiseLike<IKubernetesInstance> {\n return InstanceReader.getInstanceDetails(instance.account, instance.namespace, instance.name).then(\n (instanceDetails: IKubernetesInstance) => {\n instanceDetails.id = instance.id;\n instanceDetails.name = instance.name;\n instanceDetails.provider = 'kubernetes';\n return instanceDetails;\n },\n );\n }\n\n private retrieveInstance(instanceFromState: InstanceFromStateParams): InstanceIdentifier {\n const instanceLocatorPredicate = (dataSource: InstanceManager) => {\n return dataSource.instances.some((possibleMatch) => possibleMatch.id === instanceFromState.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 if (!instanceManager) {\n return null;\n }\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n\n const instance = instanceManager.instances.find((i) => i.id === instanceFromState.instanceId);\n if (!instance) {\n return null;\n }\n\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return {\n id: instance.id,\n name: instance.name,\n namespace: instanceManager.region,\n account: instanceManager.account,\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 KUBERNETES_INSTANCE_DETAILS_CTRL = 'spinnaker.kubernetes.instanceDetails.controller';\n\nmodule(KUBERNETES_INSTANCE_DETAILS_CTRL, []).controller(\n 'kubernetesV2InstanceDetailsCtrl',\n KubernetesInstanceDetailsController,\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';\n\nimport type { Application, ILoadBalancer, IManifest } from '@spinnaker/core';\nimport { ManifestReader, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesLoadBalancer } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface ILoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesLoadBalancerDetailsController implements IController {\n public state = { loading: true };\n public manifest: IManifest;\n public loadBalancer: IKubernetesLoadBalancer;\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 const dataSource = this.app.getDataSource('loadBalancers');\n dataSource\n .ready()\n .then(() => {\n this.extractLoadBalancer(loadBalancer);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractLoadBalancer(loadBalancer));\n })\n .catch(() => this.autoClose());\n }\n\n public deleteLoadBalancer(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.loadBalancer.name,\n namespace: this.loadBalancer.namespace,\n account: this.loadBalancer.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editLoadBalancer(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.loadBalancer.moniker,\n this.loadBalancer.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractLoadBalancer({ accountId, name, region }: ILoadBalancerFromStateParams): void {\n const loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {\n return test.name === name && test.account === accountId && test.region === region;\n });\n\n if (!loadBalancer) {\n return this.autoClose();\n }\n\n ManifestReader.getManifest(accountId, region, name).then((manifest: IManifest) => {\n this.manifest = manifest;\n this.loadBalancer = loadBalancer;\n this.state.loading = false;\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 KUBERNETES_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.kubernetes.loadBalancerDetails.controller';\nmodule(KUBERNETES_LOAD_BALANCER_DETAILS_CTRL, []).controller(\n 'kubernetesV2LoadBalancerDetailsCtrl',\n KubernetesLoadBalancerDetailsController,\n);\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\nimport { camelCase, chain } from 'lodash';\n\nimport type { IInstanceCounts, IServerGroup } from '@spinnaker/core';\n\nimport type { IKubernetesLoadBalancer } from '../interfaces';\n\nclass KubernetesV2LoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeLoadBalancer(loadBalancer: IKubernetesLoadBalancer): PromiseLike<IKubernetesLoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = [];\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n (loadBalancer.serverGroups || []).forEach((serverGroup) => {\n serverGroup.cloudProvider = loadBalancer.provider;\n (serverGroup.instances || []).forEach((instance) => {\n instance.cloudProvider = loadBalancer.provider;\n });\n });\n return this.$q.resolve(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts = chain(serverGroups)\n .map((serverGroup) => serverGroup.instances)\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n acc[camelCase(instance.health.state) as keyof IInstanceCounts]++;\n return acc;\n },\n {\n up: 0,\n down: 0,\n outOfService: 0,\n succeeded: 0,\n failed: 0,\n unknown: 0,\n starting: 0,\n },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups)\n .map((serverGroup) => serverGroup.detachedInstances)\n .flatten()\n .value().length;\n\n return instanceCounts;\n }\n}\n\nexport const KUBERNETES_LOAD_BALANCER_TRANSFORMER = 'spinnaker.kubernetes.loadBalancerTransformer';\nmodule(KUBERNETES_LOAD_BALANCER_TRANSFORMER, []).service(\n 'kubernetesV2LoadBalancerTransformer',\n KubernetesV2LoadBalancerTransformer,\n);\n","import type { IComponentOptions, IController, IInterpolateService, ISCEService } from 'angular';\nimport { module } from 'angular';\nimport DOMPurify from 'dompurify';\nimport { get, partition } from 'lodash';\n\ninterface IAnnotationsMap {\n [key: string]: string;\n}\n\ninterface ICustomSection {\n title: string;\n key: string;\n isHtml: boolean;\n content: string;\n}\n\ninterface ICustomSectionMap {\n [key: string]: ICustomSection[];\n}\n\nclass KubernetesAnnotationCustomSections implements IController {\n private resource: any;\n public manifest: any;\n public customSections: ICustomSectionMap;\n\n public static $inject = ['$sce', '$interpolate'];\n constructor(private $sce: ISCEService, private $interpolate: IInterpolateService) {}\n\n public $onInit() {\n const annotations: IAnnotationsMap = get(this, ['manifest', 'metadata', 'annotations']);\n if (annotations == null) {\n return;\n }\n this.populateCustomSections(annotations);\n }\n\n private populateCustomSections(annotations: IAnnotationsMap) {\n const customSections: ICustomSectionMap = Object.keys(annotations).reduce(\n (memo: ICustomSectionMap, annotationKey: string) => {\n const entry = this.annotationToEntry(annotations[annotationKey], annotationKey);\n if (entry != null && entry.title) {\n memo[entry.title] = memo[entry.title] || [];\n memo[entry.title].push(entry);\n }\n return memo;\n },\n {},\n );\n // Sort section contents such that text entries appear before HTML entries.\n this.customSections = Object.keys(customSections).reduce((memo: ICustomSectionMap, sectionTitle: string) => {\n const entriesHtmlText = partition(customSections[sectionTitle], (section) => section.isHtml);\n memo[sectionTitle] = entriesHtmlText[1].concat(entriesHtmlText[0]);\n return memo;\n }, {});\n }\n\n private annotationToEntry(content: string, annotationKey: string): ICustomSection {\n const parsed = this.parseAnnotationKey(annotationKey);\n if (parsed == null) {\n return null;\n }\n if (this.resource && content.includes('{{')) {\n content = this.$interpolate(content)({ ...this.resource, manifest: this.manifest });\n }\n return {\n title: parsed.title.replace(/-/g, ' ').trim(),\n key: parsed.key.replace(/-/g, ' ').trim(),\n content: parsed.isHtml ? this.sanitizeContent(content) : content,\n isHtml: parsed.isHtml,\n };\n }\n\n private parseAnnotationKey(annotationKey: string): { title: string; key: string; isHtml: boolean } {\n const keyParts = /([^.]+)\\.details\\.(html\\.)?spinnaker\\.io(?:\\/(.*))?/.exec(annotationKey);\n if (keyParts == null || keyParts.length !== 4) {\n return null;\n }\n return {\n title: keyParts[1] || '',\n key: keyParts[3] || '',\n isHtml: !!keyParts[2],\n };\n }\n\n private sanitizeContent(unsanitized: string): any {\n const sanitized = DOMPurify.sanitize(unsanitized, {\n ADD_ATTR: ['target'],\n });\n return this.$sce.trustAsHtml(sanitized);\n }\n}\n\nconst kubernetesAnnotationCustomSectionsComponent: IComponentOptions = {\n bindings: { manifest: '<', resource: '<' },\n controller: ['$sce', '$interpolate', KubernetesAnnotationCustomSections],\n controllerAs: 'ctrl',\n template: `\n <collapsible-section expanded=\"true\" ng-if=\"ctrl.manifest\" ng-repeat=\"(section, entries) in ctrl.customSections\" heading=\"{{ section }}\">\n <div ng-repeat=\"entry in entries\">\n <div ng-if=\"entry.isHtml\" ng-bind-html=\"entry.content\"></div>\n <div ng-if=\"!entry.isHtml\">\n <span ng-if=\"entry.key\" style=\"font-weight:bold\">{{ entry.key }}</span>\n <span>{{ entry.content }}</span>\n </div>\n </div>\n </collapsible-section>\n `,\n};\n\nexport const KUBERNETES_ANNOTATION_CUSTOM_SECTIONS = 'spinnaker.kubernetes.v2.manifest.annotation.custom.sections';\nmodule(KUBERNETES_ANNOTATION_CUSTOM_SECTIONS, []).component(\n 'kubernetesAnnotationCustomSections',\n kubernetesAnnotationCustomSectionsComponent,\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IArtifact } from '@spinnaker/core';\n\nclass KubernetesManifestArtifactCtrl implements IController {\n public artifact: IArtifact;\n}\n\nconst kubernetesManifestArtifactComponent: IComponentOptions = {\n bindings: { artifact: '<' },\n controller: KubernetesManifestArtifactCtrl,\n controllerAs: 'ctrl',\n template: `\n <span>\n <b>{{ctrl.artifact.type}}</b>\n <i>{{ctrl.artifact.reference}}</i>\n </span>\n `,\n};\n\nexport const KUBERNETES_MANIFEST_ARTIFACT = 'spinnaker.kubernetes.v2.manifest.artifact.component';\nmodule(KUBERNETES_MANIFEST_ARTIFACT, []).component('kubernetesManifestArtifact', kubernetesManifestArtifactComponent);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IDeleteOptions } from './delete.controller';\n\nclass KubernetesDeleteManifestOptionsFormCtrl implements IController {\n public options: IDeleteOptions;\n}\n\nconst kubernetesDeletManifestOptionsFormComponent: IComponentOptions = {\n bindings: { options: '=' },\n controller: KubernetesDeleteManifestOptionsFormCtrl,\n controllerAs: 'ctrl',\n template: `\n <div class=\"form-horizontal\">\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Cascading\n <help-field key=\"kubernetes.manifest.delete.cascading\"></help-field>\n </div>\n <div class=\"col-md-3\">\n <div class=\"input-group\">\n <input type=\"checkbox\"\n ng-model=\"ctrl.options.cascading\"/>\n </div>\n </div>\n </div>\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Grace Period\n <help-field key=\"kubernetes.manifest.delete.gracePeriod\"></help-field>\n </div>\n <div class=\"col-md-4\">\n <div class=\"input-group\">\n <input type=\"number\"\n class=\"form-control input-sm highlight-pristine\"\n ng-model=\"ctrl.options.gracePeriodSeconds\"\n min=\"0\"/>\n <span class=\"input-group-addon\">second<span ng-if=\"ctrl.options.gracePeriodSeconds !== 1\">s</span></span>\n </div>\n </div>\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM =\n 'spinnaker.kubernetes.v2.kubernetes.manifest.delete.options.component';\nmodule(KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM, []).component(\n 'kubernetesDeleteManifestOptionsForm',\n kubernetesDeletManifestOptionsFormComponent,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\nimport { KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM } from './deleteOptionsForm.component';\n\nexport interface IDeleteCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n options: IDeleteOptions;\n}\n\nexport interface IDeleteOptions {\n gracePeriodSeconds?: number;\n cascading: boolean;\n}\n\nclass KubernetesManifestDeleteController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IDeleteCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application', 'manifestController'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n public manifestController: string,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Deleting ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n options: {\n cascading: true,\n },\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public delete(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n // cascading is the kubectl term (more familiar) orphanDependants is the k8s server term\n payload.options.orphanDependants = !payload.options.cascading;\n delete payload.options.cascading;\n\n return ManifestWriter.deleteManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_DELETE_CTRL = 'spinnaker.kubernetes.v2.manifest.delete.controller';\n\nmodule(KUBERNETES_MANIFEST_DELETE_CTRL, [KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM]).controller(\n 'kubernetesV2ManifestDeleteCtrl',\n KubernetesManifestDeleteController,\n);\n","import 'brace/mode/json';\nimport 'brace/theme/textmate';\nimport { $log } from 'ngimport';\nimport React from 'react';\nimport AceEditor from 'react-ace';\n\nexport interface IJsonEditorProps {\n value: string;\n onChange(raw: string, obj: any): void;\n}\n\nexport const JSON_EDITOR_TAB_SIZE = 2;\n\nexport class JsonEditor extends React.Component<IJsonEditorProps> {\n private handleChange = (raw: string) => {\n try {\n const obj = JSON.parse(raw);\n this.props.onChange\n ? this.props.onChange(raw, obj)\n : $log.warn('No `onChange` handler provided for JSON editor.');\n } catch (e) {\n this.props.onChange\n ? this.props.onChange(raw, null)\n : $log.warn('No `onChange` handler provided for JSON editor.');\n $log.warn(`Error loading JSON from string ${raw}: `, e);\n }\n };\n\n public render = () => {\n return (\n <AceEditor\n mode=\"json\"\n theme=\"textmate\"\n name=\"json-editor\"\n style={{ width: 'inherit' }}\n onChange={this.handleChange}\n fontSize={12}\n showGutter={true}\n cursorStart={0}\n showPrintMargin={false}\n minLines={50}\n maxLines={100}\n highlightActiveLine={true}\n value={this.props.value || undefined}\n setOptions={{\n firstLineNumber: 1,\n tabSize: JSON_EDITOR_TAB_SIZE,\n showLineNumbers: false,\n showFoldWidgets: false,\n }}\n editorProps={{ $blockScrolling: Infinity }}\n className=\"ace-editor\"\n />\n );\n };\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { JsonEditor } from './JsonEditor';\n\nexport const JSON_EDITOR_COMPONENT = 'spinnaker.kubernetes.jsonEditor.component';\nmodule(JSON_EDITOR_COMPONENT, []).component(\n 'jsonEditor',\n react2angular(withErrorBoundary(JsonEditor, 'jsonEditor'), ['onChange', 'value']),\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 - Kubernetes 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 { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestEvents } from '../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport const KUBERNETES_MANIFEST_EVENTS = 'spinnaker.kubernetes.v2.manifest.events';\nmodule(KUBERNETES_MANIFEST_EVENTS, []).component(\n 'kubernetesManifestEvents',\n react2angular(withErrorBoundary(ManifestEvents, 'kubernetesManifestEvents'), ['manifest']),\n);\n","import { has, sortBy } from 'lodash';\nimport React from 'react';\n\nimport { HelpField } from '@spinnaker/core';\n\nexport interface IContainer {\n name: string;\n image: string;\n}\n\nexport interface IManifestImageDetailsProps {\n manifest: {\n spec: {\n template: {\n spec: {\n containers: IContainer;\n initContainers: IContainer;\n };\n };\n };\n };\n}\n\n// From https://github.com/docker/distribution/blob/master/docs/spec/api.md\n// if an image doesn't have a colon, it doesn't have a tag or digest.\nconst normalizeImage = (image: string): string => {\n if (image && image.includes(':')) {\n return image;\n }\n return `${image}:latest`;\n};\n\nexport const ManifestImageDetails = ({ manifest }: IManifestImageDetailsProps) => {\n if (!has(manifest, 'spec.template.spec')) {\n // Could still be loading the manifest in a parent component.\n return null;\n }\n const containers = sortBy(manifest.spec.template.spec.containers || [], ['image']);\n const initContainers = sortBy(manifest.spec.template.spec.initContainers || [], ['image']);\n const hasBothContainerTypes = containers.length > 0 && initContainers.length > 0;\n if (containers.length === 0 && initContainers.length === 0) {\n // Not sure if this could happen\n return <span>No images.</span>;\n }\n\n return (\n <ul>\n {hasBothContainerTypes && <strong>Containers</strong>}\n {containers.map((container) => (\n <li key={container.image} title={normalizeImage(container.image)} className=\"break-word\">\n {normalizeImage(container.image)}{' '}\n <HelpField content={`This is container <strong>${container.name}</strong>'s image.`} />\n </li>\n ))}\n {hasBothContainerTypes && <strong>Init Containers</strong>}\n {initContainers.map((container) => (\n <li key={container.image} className=\"break-word\" title={normalizeImage(container.image)}>\n {normalizeImage(container.image)}{' '}\n <HelpField content={`This is init container <strong>${container.name}</strong>'s image.`} />\n </li>\n ))}\n </ul>\n );\n};\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestImageDetails } from './ManifestImageDetails';\n\nexport const KUBERNETES_MANIFEST_IMAGE_DETAILS = 'spinnaker.kubernetes.v2.manifestImageDetails.component';\nmodule(KUBERNETES_MANIFEST_IMAGE_DETAILS, []).component(\n 'kubernetesManifestImageDetails',\n react2angular(withErrorBoundary(ManifestImageDetails, 'kubernetesManifestImageDetails'), ['manifest']),\n);\n","import { get, keys } from 'lodash';\nimport React from 'react';\n\nimport './manifestLabels.less';\n\nexport interface IManifestLabelsMap {\n [key: string]: string;\n}\n\nexport interface IManifestLabelsProps {\n manifest?: {\n metadata?: {\n labels?: IManifestLabelsMap;\n };\n };\n}\n\nexport class ManifestLabels extends React.Component<IManifestLabelsProps> {\n public render() {\n const labels: IManifestLabelsMap = get(this.props, ['manifest', 'metadata', 'labels'], {});\n return (\n <div className=\"horizontal wrap\">\n {keys(labels).map((key) => (\n <div key={key} className=\"manifest-label sp-badge info\">\n {key}: {labels[key]}\n </div>\n ))}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestLabels } from './ManifestLabels';\n\nexport const KUBERNETES_MANIFEST_LABELS = 'spinnaker.kubernetes.v2.manifest.labels';\nmodule(KUBERNETES_MANIFEST_LABELS, []).component(\n 'kubernetesManifestLabels',\n react2angular(withErrorBoundary(ManifestLabels, 'kubernetesManifestLabels'), ['manifest']),\n);\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport { HoverablePopover } from '@spinnaker/core';\n\nimport './manifestLabels.less';\n\n// TODO(dpeach) https://github.com/spinnaker/spinnaker/issues/3239\nexport interface IManifestQosProps {\n manifest?: {\n status?: {\n qosClass?: string;\n };\n };\n}\n\nexport class ManifestQos extends React.Component<IManifestQosProps> {\n private qosClass(): string {\n return get(this.props, ['manifest', 'status', 'qosClass'], 'Unknown');\n }\n\n private qosStyle(): string {\n const qosClass = this.qosClass();\n if (qosClass === 'Guaranteed') {\n return 'success';\n } else if (qosClass === 'BestEffort') {\n return 'alert';\n } else {\n return 'warn';\n }\n }\n\n private description = () => {\n return (\n <div>\n <p>There are three QOS (Quality of Service) classes:</p>\n <p>\n <b>Guaranteed</b>: Pods are considered highest-priority, and will only be killed if they exceed their resource\n requests when other containers require their resources.\n </p>\n <p>\n <b>Burstable</b>: Pods have some minimum guaranteed resources and can exceed them, but are more likely to be\n killed than <b>Guaranteed</b> pods.\n </p>\n <p>\n <b>BestEffort</b>: These are the lowest-priority pods, and will be the first to be evicted when resources run\n out.\n </p>\n <p>\n To understand how to set the QOS class of a pod, read{' '}\n <a href=\"https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/\">\n the Kubernetes documentation\n </a>\n .\n </p>\n </div>\n );\n };\n\n public render() {\n const style = `sp-badge ${this.qosStyle()}`;\n return (\n <HoverablePopover Component={this.description} title=\"QOS Class\" className={`ephemeral-popover`}>\n <div className={style}>{this.qosClass()}</div>\n </HoverablePopover>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestQos } from './ManifestQos';\n\nexport const KUBERNETES_MANIFEST_QOS = 'spinnaker.kubernetes.v2.manifest.qos';\nmodule(KUBERNETES_MANIFEST_QOS, []).component(\n 'kubernetesManifestQos',\n react2angular(withErrorBoundary(ManifestQos, 'kubernetesManifestQos'), ['manifest']),\n);\n","import { get } from 'lodash';\nimport React from 'react';\n\nexport interface IManifestResources {\n cpu?: string;\n memory?: string;\n}\n\n// TODO(dpeach) https://github.com/spinnaker/spinnaker/issues/3239\nexport interface IManifestResourceProps {\n manifest?: {\n spec?: {\n containers?: [\n {\n name?: string;\n resources?: {\n limits?: IManifestResources;\n requests?: IManifestResources;\n };\n },\n ];\n };\n status?: {\n qosClass?: string;\n };\n };\n metrics?: [\n {\n containerName?: string;\n metrics?: IPodMetricsMap;\n },\n ];\n}\n\nexport interface IPodMetricsMap {\n [key: string]: string;\n}\n\nexport class ManifestResources extends React.Component<IManifestResourceProps> {\n public render() {\n const containers = get(this.props, ['manifest', 'spec', 'containers'], []);\n const metrics = get(this.props, ['metrics'], []);\n\n if (!metrics) {\n return <div>No metrics reported.</div>;\n }\n const containerToMetricMap = metrics.reduce((acc, val) => {\n acc[val.containerName] = { metrics: val.metrics };\n return acc;\n }, {});\n\n return (\n <div>\n {containers.map((c, i) => (\n <div key={c.name}>\n Resource usage for <b>{c.name}</b>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>CPU</dt>\n <dd>{get(containerToMetricMap, [c.name, 'metrics', 'CPU(cores)'], 'Unknown')}</dd>\n <dt>MEMORY</dt>\n <dd>{get(containerToMetricMap, [c.name, 'metrics', 'MEMORY(bytes)'], 'Unknown')}</dd>\n </dl>\n {i < containers.length - 1 ? <hr /> : ''}\n </div>\n ))}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestResources } from './ManifestResources';\n\nexport const KUBERNETES_MANIFEST_RESOURCES = 'spinnaker.kubernetes.v2.manifest.resources';\nmodule(KUBERNETES_MANIFEST_RESOURCES, []).component(\n 'kubernetesManifestResources',\n react2angular(withErrorBoundary(ManifestResources, 'kubernetesManifestResources'), ['manifest', 'metrics']),\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { react2angular } from 'react2angular';\n\nimport type { Application } from '@spinnaker/core';\nimport { ConfirmationModalService, ManifestWriter, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroupManager } from '../../interfaces';\n\ninterface IRollingRestartProps {\n application: Application;\n serverGroupManager: IKubernetesServerGroupManager;\n}\n\ninterface IRollingRestartParameters {\n account: string;\n cloudProvider: string;\n location: string;\n manifestName: string;\n}\n\nfunction RollingRestart({ application, serverGroupManager }: IRollingRestartProps) {\n function rollingRestart() {\n const rollingRestartParameters: IRollingRestartParameters = {\n account: serverGroupManager.account,\n cloudProvider: 'kubernetes',\n location: serverGroupManager.namespace,\n manifestName: serverGroupManager.name,\n };\n ConfirmationModalService.confirm({\n account: serverGroupManager.account,\n askForReason: true,\n header: `Initiate rolling restart of ${serverGroupManager.name}`,\n submitMethod: () => {\n return ManifestWriter.rollingRestartManifest(rollingRestartParameters, application);\n },\n taskMonitorConfig: {\n application,\n title: `Rolling restart of ${serverGroupManager.name}`,\n },\n });\n }\n return (\n <li>\n <a onClick={rollingRestart}>Rolling Restart</a>\n </li>\n );\n}\n\nexport const KUBERNETES_ROLLING_RESTART = 'spinnaker.kubernetes.v2.rolling.restart';\nmodule(KUBERNETES_ROLLING_RESTART, []).component(\n 'kubernetesRollingRestart',\n react2angular(withErrorBoundary(RollingRestart, 'kubernetesRollingRestart'), ['application', 'serverGroupManager']),\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IPauseRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n}\n\nclass KubernetesManifestPauseRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IPauseRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Pause rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public pauseRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.pauseRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.pauseRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestPauseRolloutCtrl',\n KubernetesManifestPauseRolloutController,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IResumeRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n}\n\nclass KubernetesManifestResumeRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IResumeRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Resume rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public resumeRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.resumeRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.resumeRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestResumeRolloutCtrl',\n KubernetesManifestResumeRolloutController,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IUndoRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n revision: number;\n}\n\ninterface IRolloutRevision {\n label: string;\n revision: number;\n}\n\nclass KubernetesManifestUndoRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IUndoRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', 'revisions', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n public revisions: IRolloutRevision[],\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Undo rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n revision: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public undoRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.undoRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.undoRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestUndoRolloutCtrl',\n KubernetesManifestUndoRolloutController,\n);\n","import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst kubernetesScaleManifestSettingsFormComponent: IComponentOptions = {\n bindings: { settings: '=' },\n controllerAs: 'ctrl',\n template: `\n <div class=\"form-horizontal\">\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Replicas\n </div>\n <div class=\"col-md-4\">\n <input type=\"text\"\n class=\"form-control input-sm highlight-pristine\"\n ng-model=\"ctrl.settings.replicas\"\n min=\"0\"/>\n </div>\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM =\n 'spinnaker.kubernetes.v2.kubernetes.manifest.scale.settingsForm.component';\nmodule(KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM, []).component(\n 'kubernetesScaleManifestSettingsForm',\n kubernetesScaleManifestSettingsFormComponent,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\nimport { KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM } from './scaleSettingsForm.component';\n\ninterface IScaleCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n replicas: number;\n}\n\nclass KubernetesManifestScaleController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IScaleCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', 'currentReplicas', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n currentReplicas: number,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Scaling ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n replicas: currentReplicas,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public scale(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.scaleManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_SCALE_CTRL = 'spinnaker.kubernetes.v2.manifest.scale.controller';\n\nmodule(KUBERNETES_MANIFEST_SCALE_CTRL, [KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM]).controller(\n 'kubernetesV2ManifestScaleCtrl',\n KubernetesManifestScaleController,\n);\n","import type { IManifestLabelSelectors } from './IManifestLabelSelector';\n\nexport interface IMultiManifestSelector extends IManifestSelector {\n kinds: string[];\n labelSelectors?: IManifestLabelSelectors;\n}\n\nexport interface IManifestSelector {\n account: string;\n app?: string;\n cluster?: string;\n criteria?: string;\n kind?: string;\n kinds?: string[];\n labelSelectors?: IManifestLabelSelectors;\n location: string;\n manifestName?: string;\n mode?: SelectorMode;\n}\n\nexport enum SelectorMode {\n Static = 'static',\n Dynamic = 'dynamic',\n Label = 'label',\n}\n\ninterface ISelectorModeData {\n label: string;\n selectorDefaults: Partial<IManifestSelector>;\n}\n\nexport const SelectorModeDataMap: { [key in SelectorMode]: ISelectorModeData } = {\n [SelectorMode.Static]: {\n label: 'Choose a static target',\n selectorDefaults: {\n cluster: null,\n criteria: null,\n kind: null,\n kinds: null,\n labelSelectors: null,\n },\n },\n [SelectorMode.Dynamic]: {\n label: 'Choose a target dynamically',\n selectorDefaults: {\n kinds: null,\n labelSelectors: null,\n manifestName: null,\n },\n },\n [SelectorMode.Label]: {\n label: 'Match target(s) by label',\n selectorDefaults: {\n cluster: null,\n criteria: null,\n kind: null,\n kinds: [],\n labelSelectors: {\n selectors: [],\n },\n manifestName: null,\n },\n },\n};\n","import { chain } from 'lodash';\n\nimport { SearchService } from '@spinnaker/core';\n\ninterface IManifestKindSearchResults {\n account: string;\n kubernetesKind: string;\n name: string;\n namespace: string;\n provider: string;\n region: string;\n type: string; // spinnakerKind\n}\n\nexport class ManifestKindSearchService {\n public static search(kind: string, namespace: string, account: string): PromiseLike<IManifestKindSearchResults[]> {\n return SearchService.search<IManifestKindSearchResults>({\n q: namespace,\n type: kind,\n })\n .then((response) =>\n chain(response ? response.results : [])\n .filter(\n (result) => result.namespace === namespace && result.account === account && result.kubernetesKind === kind,\n )\n .uniqBy('name')\n .valueOf(),\n )\n .catch(() => []);\n }\n}\n","import React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport { noop } from '@spinnaker/core';\n\nimport type { IManifestLabelSelector } from '../IManifestLabelSelector';\nimport { LABEL_KINDS } from '../IManifestLabelSelector';\n\nimport './labelEditor.less';\n\nexport interface ILabelEditorProps {\n labelSelectors: IManifestLabelSelector[];\n onLabelSelectorsChange: (labelSelectors: IManifestLabelSelector[]) => void;\n}\n\nconst LabelKeyOptions: Array<Option<string>> = LABEL_KINDS.map((kind) => ({ label: kind, value: kind }));\n\nexport default class LabelEditor extends React.Component<ILabelEditorProps> {\n public static defaultProps: Partial<ILabelEditorProps> = {\n labelSelectors: [],\n onLabelSelectorsChange: noop,\n };\n\n private static convertValueStringToArray = (value: string): string[] => {\n return value.split(',').map((v: string) => v.trim());\n };\n\n private handleChange = (idx: number, property: keyof IManifestLabelSelector, value: string | string[]): void => {\n this.props.onLabelSelectorsChange(\n this.props.labelSelectors.map((ls, i) => {\n if (idx !== i) {\n return ls;\n }\n return {\n ...ls,\n [property]: value,\n };\n }),\n );\n };\n\n private removeField = (idx: number): void => {\n this.props.onLabelSelectorsChange(\n this.props.labelSelectors.filter((_ls, i) => {\n return idx !== i;\n }),\n );\n };\n\n private addField = (): void => {\n return this.props.onLabelSelectorsChange(\n this.props.labelSelectors.concat([\n {\n key: '',\n kind: 'EQUALS',\n values: [],\n },\n ]),\n );\n };\n\n public render() {\n return (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th>Key</th>\n <th>Kind</th>\n <th>Value(s)</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {this.props.labelSelectors.map((selector, idx) => (\n <tr className=\"label-editor-selector-row\" key={idx}>\n <td>\n <input\n className=\"form-control input input-sm label-editor-key-input\"\n type=\"text\"\n value={selector.key}\n onChange={(e: any) => this.handleChange(idx, 'key', e.target.value)}\n />\n </td>\n <td>\n <Select\n className=\"label-editor-kind-select\"\n clearable={false}\n onChange={(option: Option<string>) => this.handleChange(idx, 'kind', option.value)}\n options={LabelKeyOptions}\n value={selector.kind}\n />\n </td>\n <td>\n <input\n className=\"form-control input input-sm label-editor-values-input\"\n onChange={(e: any) =>\n this.handleChange(idx, 'values', LabelEditor.convertValueStringToArray(e.target.value))\n }\n placeholder=\"Comma-separated values\"\n value={selector.values.join(', ')}\n type=\"text\"\n />\n </td>\n <td>\n <button className=\"link label-editor-remove\" onClick={() => this.removeField(idx)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove field</span>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.addField}>\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add Label\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n );\n }\n}\n","export interface IManifestLabelSelector {\n key: string;\n kind: string;\n values: string[];\n}\n\nexport interface IManifestLabelSelectors {\n selectors: IManifestLabelSelector[];\n}\n\nexport const LABEL_KINDS: string[] = [\n 'ANY',\n 'EQUALS',\n 'NOT_EQUALS',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'EXISTS',\n 'NOT_EXISTS',\n];\n","import { get, isEmpty } from 'lodash';\nimport { $q } from 'ngimport';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { switchMap, takeUntil, tap } from 'rxjs/operators';\n\nimport type { Application, IAccountDetails, IServerGroup } from '@spinnaker/core';\nimport {\n AccountSelectInput,\n AccountService,\n AppListExtractor,\n NgReact,\n noop,\n ScopeClusterSelector,\n SETTINGS,\n StageConfigField,\n StageConstants,\n} from '@spinnaker/core';\n\nimport type { IManifestLabelSelector } from './IManifestLabelSelector';\nimport type { IManifestSelector } from './IManifestSelector';\nimport { SelectorMode, SelectorModeDataMap } from './IManifestSelector';\nimport { ManifestKindSearchService } from '../ManifestKindSearch';\nimport LabelEditor from './labelEditor/LabelEditor';\n\nexport interface IManifestSelectorProps {\n selector: IManifestSelector;\n application?: Application;\n includeSpinnakerKinds?: string[];\n modes?: SelectorMode[];\n onChange(selector: IManifestSelector): void;\n}\n\nexport interface IManifestSelectorState {\n accounts: IAccountDetails[];\n selector: IManifestSelector;\n namespaces: string[];\n kinds: string[];\n resources: string[];\n loading: boolean;\n}\n\ninterface ISelectorHandler {\n handles(mode: SelectorMode): boolean;\n handleModeChange(): void;\n handleKindChange(kind: string): void;\n getKind(): string;\n}\n\nconst parseSpinnakerName = (spinnakerName: string): { name: string; kind: string } => {\n const [kind, name] = (spinnakerName || '').split(' ');\n return { kind, name };\n};\n\nclass StaticManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Static;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n this.handleKindChange(selector.kind);\n Object.assign(selector, SelectorModeDataMap.static.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (kind: string): void => {\n const { selector } = this.component.state;\n const { name } = parseSpinnakerName(selector.manifestName);\n selector.manifestName = kind ? (name ? `${kind} ${name}` : kind) : name;\n };\n\n public getKind = (): string => parseSpinnakerName(this.component.state.selector.manifestName).kind;\n}\n\nclass DynamicManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Dynamic;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n const { kind } = parseSpinnakerName(selector.manifestName);\n selector.kind = kind || null;\n Object.assign(selector, SelectorModeDataMap.dynamic.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (kind: string): void => {\n this.component.state.selector.kind = kind;\n };\n\n public getKind = (): string => this.component.state.selector.kind;\n}\n\nclass LabelManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Label;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n Object.assign(selector, SelectorModeDataMap.label.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (): void => {};\n\n public getKind = (): string => null;\n}\n\nexport class ManifestSelector extends React.Component<IManifestSelectorProps, IManifestSelectorState> {\n private search$ = new Subject<{ kind: string; namespace: string; account: string }>();\n private destroy$ = new Subject<void>();\n private handlers: ISelectorHandler[];\n\n constructor(props: IManifestSelectorProps) {\n super(props);\n\n if (!this.props.selector.mode) {\n this.props.selector.mode = SelectorMode.Static;\n this.props.onChange && this.props.onChange(this.props.selector);\n }\n\n this.state = {\n selector: props.selector,\n accounts: [],\n namespaces: [],\n kinds: [],\n resources: [],\n loading: false,\n };\n this.handlers = [\n new StaticManifestSelectorHandler(this),\n new DynamicManifestSelectorHandler(this),\n new LabelManifestSelectorHandler(this),\n ];\n }\n\n public setStateAndUpdateStage = (state: Partial<IManifestSelectorState>, cb?: () => void): void => {\n if (state.selector && this.props.onChange) {\n this.props.onChange(state.selector);\n }\n this.setState(state as IManifestSelectorState, cb || noop);\n };\n\n public componentDidMount = (): void => {\n this.loadAccounts();\n\n this.search$\n .pipe(\n tap(() => this.setStateAndUpdateStage({ loading: true })),\n switchMap(({ kind, namespace, account }) => observableFrom(this.search(kind, namespace, account))),\n takeUntil(this.destroy$),\n )\n .subscribe((resources) => {\n if (this.state.selector.manifestName == null && this.getSelectedMode() === SelectorMode.Static) {\n this.handleNameChange('');\n }\n this.setStateAndUpdateStage({ loading: false, resources: resources, selector: this.state.selector });\n });\n };\n\n public componentWillUnmount = () => this.destroy$.next();\n\n public loadAccounts = (): PromiseLike<void> => {\n return AccountService.getAllAccountDetailsForProvider('kubernetes').then((accounts) => {\n const selector = this.state.selector;\n const kind = parseSpinnakerName(selector.manifestName).kind;\n\n this.setStateAndUpdateStage({ accounts });\n\n if (!selector.account && accounts.length > 0) {\n selector.account = accounts.some((e) => e.name === SETTINGS.providers.kubernetes.defaults.account)\n ? SETTINGS.providers.kubernetes.defaults.account\n : accounts[0].name;\n }\n if (selector.account) {\n this.handleAccountChange(selector.account);\n }\n if (kind) {\n this.search$.next({ kind, namespace: selector.location, account: selector.account });\n }\n });\n };\n\n private handleAccountChange = (selectedAccount: string): void => {\n const details = (this.state.accounts || []).find((account) => account.name === selectedAccount);\n if (!details) {\n return;\n }\n const namespaces = (details.namespaces || []).sort();\n const kinds = Object.entries(details.spinnakerKindMap || {})\n .filter(([, spinnakerKind]) =>\n this.props.includeSpinnakerKinds && this.props.includeSpinnakerKinds.length\n ? this.props.includeSpinnakerKinds.includes(spinnakerKind)\n : true,\n )\n .map(([kind]) => kind)\n .sort();\n\n if (\n !this.isExpression(this.state.selector.location) &&\n namespaces.every((ns) => ns !== this.state.selector.location)\n ) {\n this.state.selector.location = null;\n }\n this.state.selector.account = selectedAccount;\n\n this.search$.next({\n kind: parseSpinnakerName(this.state.selector.manifestName).kind || this.state.selector.kind,\n namespace: this.state.selector.location,\n account: this.state.selector.account,\n });\n this.setStateAndUpdateStage({\n namespaces,\n kinds,\n selector: this.state.selector,\n });\n };\n\n private handleNamespaceChange = (selectedNamespace: Option): void => {\n this.state.selector.location =\n selectedNamespace && selectedNamespace.value ? (selectedNamespace.value as string) : null;\n this.search$.next({\n kind: parseSpinnakerName(this.state.selector.manifestName).kind,\n namespace: this.state.selector.location,\n account: this.state.selector.account,\n });\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleKindChange = (kind: string): void => {\n this.modeDelegate().handleKindChange(kind);\n this.search$.next({ kind: kind, namespace: this.state.selector.location, account: this.state.selector.account });\n };\n\n private handleNameChange = (selectedName: string): void => {\n const { kind } = parseSpinnakerName(this.state.selector.manifestName);\n this.state.selector.manifestName = kind ? `${kind} ${selectedName}` : ` ${selectedName}`;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private isExpression = (value: string): boolean => (typeof value === 'string' ? value.includes('${') : false);\n\n private search = (kind: string, namespace: string, account: string): PromiseLike<string[]> => {\n if (this.isExpression(account)) {\n return $q.resolve([]);\n }\n return ManifestKindSearchService.search(kind, namespace, account).then((results) =>\n results.map((result) => result.name).sort(),\n );\n };\n\n private handleModeSelect = (mode: SelectorMode) => {\n this.state.selector.mode = mode;\n this.setStateAndUpdateStage({ selector: this.state.selector }, () => {\n this.modeDelegate().handleModeChange();\n });\n };\n\n private handleClusterChange = ({ clusterName }: { clusterName: string }) => {\n this.state.selector.cluster = clusterName;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private handleCriteriaChange = (criteria: string) => {\n this.state.selector.criteria = criteria;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleKindsChange = (kinds: string[]): void => {\n this.state.selector.kinds = kinds;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleLabelSelectorsChange = (labelSelectors: IManifestLabelSelector[]): void => {\n this.state.selector.labelSelectors.selectors = labelSelectors;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private modeDelegate = (): ISelectorHandler =>\n this.handlers.find((handler) => handler.handles(this.getSelectedMode()));\n\n private promptTextCreator = (text: string) => `Use custom expression: ${text}`;\n\n private getSelectedMode = (): SelectorMode => this.state.selector.mode || SelectorMode.Static;\n\n private getFilteredClusters = (): string[] => {\n const { application, includeSpinnakerKinds } = this.props;\n const { selector } = this.state;\n const applications = application ? [application] : [];\n // If the only allowlisted Spinnaker kind is `serverGroups`, exclude server groups with `serverGroupManagers`.\n // This is because traffic management stages only allow ReplicaSets.\n const includeServerGroupsWithManagers: boolean =\n isEmpty(includeSpinnakerKinds) || includeSpinnakerKinds.length > 1 || includeSpinnakerKinds[0] !== 'serverGroups';\n const filter = (serverGroup: IServerGroup): boolean => {\n const accountAndNamespaceFilter: boolean = AppListExtractor.clusterFilterForCredentialsAndRegion(\n selector.account,\n selector.location,\n )(serverGroup);\n const hasServerGroupManagers: boolean = get(serverGroup, 'serverGroupManagers.length', 0) > 0;\n const serverGroupManagerFilter: boolean = includeServerGroupsWithManagers || !hasServerGroupManagers;\n const nameToParseKind: string = hasServerGroupManagers ? serverGroup.cluster : serverGroup.name;\n const kindFilter: boolean = parseSpinnakerName(nameToParseKind).kind === this.modeDelegate().getKind();\n return accountAndNamespaceFilter && serverGroupManagerFilter && kindFilter;\n };\n return AppListExtractor.getClusters(applications, filter);\n };\n\n public render() {\n const { TargetSelect } = NgReact;\n const selectedMode = this.getSelectedMode();\n const modes = this.props.modes || [selectedMode];\n const { selector, accounts, kinds, namespaces, resources, loading } = this.state;\n const kind = this.modeDelegate().getKind();\n const name = parseSpinnakerName(selector.manifestName).name;\n const resourceNames = resources.map((resource) => parseSpinnakerName(resource).name);\n const selectedKinds = selector.kinds || [];\n const KindField = (\n <StageConfigField label=\"Kind\">\n <Creatable\n clearable={false}\n value={{ value: kind, label: kind }}\n options={kinds.map((k) => ({ value: k, label: k }))}\n onChange={(option: Option<string>) => this.handleKindChange(option && option.value)}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n );\n\n return (\n <>\n <StageConfigField label=\"Account\">\n <AccountSelectInput\n value={selector.account}\n onChange={(evt: any) => this.handleAccountChange(evt.target.value)}\n accounts={accounts}\n provider=\"'kubernetes'\"\n />\n </StageConfigField>\n <StageConfigField label=\"Namespace\">\n <Creatable\n clearable={false}\n value={{ value: selector.location, label: selector.location }}\n options={namespaces.map((ns) => ({ value: ns, label: ns }))}\n onChange={this.handleNamespaceChange}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n {!modes.includes(SelectorMode.Label) && KindField}\n {modes.length > 1 && (\n <StageConfigField label=\"Selector\">\n {modes.map((mode) => (\n <div className=\"radio\" key={mode}>\n <label htmlFor={mode}>\n <input\n type=\"radio\"\n onChange={() => this.handleModeSelect(mode)}\n checked={selectedMode === mode}\n id={mode}\n />{' '}\n {get(SelectorModeDataMap, [mode, 'label'], '')}\n </label>\n </div>\n ))}\n </StageConfigField>\n )}\n {modes.includes(SelectorMode.Label) && selectedMode !== SelectorMode.Label && KindField}\n {modes.includes(SelectorMode.Static) && selectedMode === SelectorMode.Static && (\n <StageConfigField label=\"Name\">\n <Creatable\n isLoading={loading}\n clearable={false}\n value={{ value: name, label: name }}\n options={resourceNames.map((r) => ({ value: r, label: r }))}\n onChange={(option: Option) => this.handleNameChange(option ? (option.value as string) : '')}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n )}\n {modes.includes(SelectorMode.Dynamic) && selectedMode === SelectorMode.Dynamic && (\n <>\n <StageConfigField label=\"Cluster\">\n <ScopeClusterSelector\n clusters={this.getFilteredClusters()}\n model={selector.cluster}\n onChange={this.handleClusterChange}\n />\n </StageConfigField>\n <StageConfigField label=\"Target\">\n <TargetSelect\n onChange={this.handleCriteriaChange}\n model={{ target: selector.criteria }}\n options={StageConstants.MANIFEST_CRITERIA_OPTIONS}\n />\n </StageConfigField>\n </>\n )}\n {modes.includes(SelectorMode.Label) && selectedMode === SelectorMode.Label && (\n <>\n <StageConfigField label=\"Kinds\">\n <Select\n clearable={false}\n multi={true}\n value={selectedKinds}\n options={kinds.map((k) => ({ value: k, label: k }))}\n onChange={(options: Array<Option<string>>) => this.handleKindsChange(options.map((o) => o.value))}\n />\n </StageConfigField>\n <StageConfigField label=\"Labels\">\n <LabelEditor\n labelSelectors={get(selector, 'labelSelectors.selectors', [])}\n onLabelSelectorsChange={this.handleLabelSelectorsChange}\n />\n </StageConfigField>\n </>\n )}\n </>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestSelector } from './ManifestSelector';\n\nexport const KUBERNETES_MANIFEST_SELECTOR = 'spinnaker.kubernetes.v2.manifest.selector.component';\nmodule(KUBERNETES_MANIFEST_SELECTOR, []).component(\n 'kubernetesManifestSelector',\n react2angular(withErrorBoundary(ManifestSelector, 'kubernetesManifestSelector'), [\n 'selector',\n 'modes',\n 'application',\n 'onChange',\n ]),\n);\n","import { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { relativeTime } from '@spinnaker/core';\n\nexport interface IKubernetesManifestCondition {\n status: string;\n type: string;\n lastTransitionTime: string;\n message: string;\n}\n\nexport interface IKubernetesManifestConditionProps {\n condition: IKubernetesManifestCondition;\n}\n\nexport class ManifestCondition extends React.Component<IKubernetesManifestConditionProps> {\n public render() {\n const { condition } = this.props;\n const transitionTime = DateTime.fromISO(condition.lastTransitionTime);\n return [\n <span key=\"properties\">\n {condition.status === 'True' && <span style={{ marginRight: '3px' }} className=\"glyphicon glyphicon-Normal\" />}\n {condition.status === 'False' && <span style={{ marginRight: '3px' }} className=\"glyphicon glyphicon-Warn\" />}\n {condition.status === 'Unknown' && <span style={{ marginRight: '3px' }}>?</span>}\n <b style={{ marginRight: '3px' }}>{condition.type}</b>\n <i>{transitionTime.isValid && relativeTime(transitionTime.toMillis())}</i>\n </span>,\n <div key=\"message\">{condition.message}</div>,\n ];\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestCondition } from './ManifestCondition';\n\nexport const KUBERNETES_MANIFEST_CONDITION = 'spinnaker.kubernetes.v2.manifest.condition.component';\nmodule(KUBERNETES_MANIFEST_CONDITION, []).component(\n 'kubernetesManifestCondition',\n react2angular(withErrorBoundary(ManifestCondition, 'kubernetesManifestCondition'), ['condition']),\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IManifestStatus } from '@spinnaker/core';\n\nclass KubernetesManifestStatusCtrl implements IController {\n public status: IManifestStatus;\n}\n\nconst kubernetesManifestStatusComponent: IComponentOptions = {\n bindings: { status: '<' },\n controller: KubernetesManifestStatusCtrl,\n controllerAs: 'ctrl',\n template: `\n <div ng-if=\"!ctrl.status\" class=\"horizontal middle center spinner-section\">\n <loading-spinner size=\"'small'\"></loading-spinner>\n </div>\n <div ng-if=\"ctrl.status\">\n <div class=\"band band-warning\" ng-if=\"!ctrl.status.available.state\"\n uib-tooltip=\"{{ctrl.status.available.message}}\">\n Not Fully Available\n </div>\n <div class=\"band band-active\" ng-if=\"!ctrl.status.stable.state\"\n uib-tooltip=\"{{ctrl.status.stable.message}}\">\n Transitioning\n </div>\n <div class=\"band band-info\" ng-if=\"ctrl.status.paused.state\"\n uib-tooltip=\"{{ctrl.status.paused.message}}\">\n Rollout Paused\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_MANIFEST_STATUS = 'spinnaker.kubernetes.v2.kubernetes.manifest.status.component';\nmodule(KUBERNETES_MANIFEST_STATUS, []).component('kubernetesManifestStatus', kubernetesManifestStatusComponent);\n","import { flatten, get } from 'lodash';\nimport React from 'react';\n\nimport { StageConstants } from '@spinnaker/core';\n\nexport interface IManifestCoordinateProps {\n account: string;\n manifestName: string;\n location: string;\n cluster: string;\n criteria: string;\n labelSelectors: ILabelSelectors;\n manifestNamesByNamespace: IManifestNamesByNamespace;\n}\n\nexport interface IManifestNamesByNamespace {\n [namespace: string]: string[];\n}\n\nexport interface ILabelSelectors {\n selectors: Array<{\n key?: string;\n kind: SelectorKind;\n values?: string[];\n }>;\n}\n\nexport enum SelectorKind {\n ANY = 'ANY',\n EQUALS = 'EQUALS',\n NOT_EQUALS = 'NOT_EQUALS',\n CONTAINS = 'CONTAINS',\n NOT_CONTAINS = 'NOT_CONTAINS',\n EXISTS = 'EXISTS',\n NOT_EXISTS = 'NOT_EXISTS',\n}\n\nconst mapCriteriaToLabel = (criteria: string): string =>\n get(\n StageConstants.MANIFEST_CRITERIA_OPTIONS.find((option) => option.val === criteria),\n 'label',\n );\n\nexport const formatLabelSelectors = (labelSelectors: ILabelSelectors): string => {\n return (labelSelectors.selectors || [])\n .map((selector) => {\n const { key, kind, values = [] } = selector;\n switch (kind) {\n case SelectorKind.ANY:\n return null;\n case SelectorKind.EQUALS:\n return `${key} = ${values[0]}`;\n case SelectorKind.NOT_EQUALS:\n return `${key} != ${values[0]}`;\n case SelectorKind.CONTAINS:\n return `${key} in (${values.join(', ')})`;\n case SelectorKind.NOT_CONTAINS:\n return `${key} notin (${values.join(', ')})`;\n case SelectorKind.EXISTS:\n return `${key}`;\n case SelectorKind.NOT_EXISTS:\n return `!${key}`;\n default:\n return null;\n }\n })\n .filter((formatted) => !!formatted)\n .join(', ');\n};\n\nconst formatManifestNames = (manifestName: string, manifestNamesByNamespace: IManifestNamesByNamespace) => {\n if (manifestName) {\n return (\n <>\n <dt>Manifest</dt>\n <dd>{manifestName}</dd>\n </>\n );\n } else if (manifestNamesByNamespace) {\n const names = flatten(Object.values(manifestNamesByNamespace));\n return (\n <>\n <dt>\n Manifest\n {names.length > 1 ? 's' : ''}\n </dt>\n <dd>{names.join(', ')}</dd>\n </>\n );\n } else {\n return null;\n }\n};\n\nexport const ManifestCoordinates = ({\n account,\n manifestName,\n location,\n cluster,\n criteria,\n labelSelectors,\n manifestNamesByNamespace,\n}: IManifestCoordinateProps) => {\n return (\n <>\n <dt>Account</dt>\n <dd>{account}</dd>\n {formatManifestNames(manifestName, manifestNamesByNamespace)}\n <dt>Namespace</dt>\n <dd>{location}</dd>\n {mapCriteriaToLabel(criteria) != null && cluster != null && (\n <>\n <dt>Target</dt>\n <dd>{`${mapCriteriaToLabel(criteria)} in cluster ${cluster}`}</dd>\n </>\n )}\n {labelSelectors != null && !!formatLabelSelectors(labelSelectors) && (\n <>\n <dt>\n Selector\n {(labelSelectors.selectors || []).length > 1 ? 's' : ''}\n </dt>\n <dd>{formatLabelSelectors(labelSelectors)}</dd>\n </>\n )}\n </>\n );\n};\n","import React from 'react';\n\nimport { noop, StageConfigField } from '@spinnaker/core';\n\nimport type { IDeleteOptions } from '../../../manifest/delete/delete.controller';\n\nimport './deleteManifestOptionsForm.less';\n\nexport interface IDeleteManifestOptionsFormProps {\n onOptionsChange: (options: IDeleteOptions) => void;\n options: IDeleteOptions;\n}\n\nexport interface IDeleteManifestOptionsFormState {\n options: IDeleteOptions;\n}\n\nexport default class DeleteManifestOptionsForm extends React.Component<\n IDeleteManifestOptionsFormProps,\n IDeleteManifestOptionsFormState\n> {\n public static defaultProps: Partial<IDeleteManifestOptionsFormProps> = {\n onOptionsChange: noop,\n options: {\n cascading: true,\n gracePeriodSeconds: null,\n },\n };\n\n public constructor(props: IDeleteManifestOptionsFormProps) {\n super(props);\n this.state = {\n options: props.options,\n };\n }\n\n private setStateAndUpdateStage = (options: IDeleteOptions) => {\n this.props.onOptionsChange(options);\n this.setState({ options });\n };\n\n private onCascadingChange = (e: any): void => {\n this.setStateAndUpdateStage({\n ...this.state.options,\n cascading: e.target.checked,\n });\n };\n\n private onGracePeriodChange = (e: any): void => {\n const integerValue = parseInt(e.target.value, 10);\n const gracePeriodSeconds = !isNaN(integerValue) ? integerValue : null;\n this.setStateAndUpdateStage({\n ...this.state.options,\n gracePeriodSeconds,\n });\n };\n\n public render() {\n const {\n options: { cascading, gracePeriodSeconds },\n } = this.state;\n return (\n <>\n <StageConfigField helpKey=\"kubernetes.manifest.delete.cascading\" label=\"Cascading\">\n <div className=\"checkbox\">\n <input\n checked={cascading}\n className=\"delete-manifest-options-input-cascading\"\n onChange={this.onCascadingChange}\n type=\"checkbox\"\n />\n </div>\n </StageConfigField>\n <StageConfigField helpKey=\"kubernetes.manifest.delete.gracePeriod\" label=\"Grace Period\">\n <input\n className=\"form-control input-sm delete-manifest-options-input-grace-period\"\n min=\"0\"\n onChange={this.onGracePeriodChange}\n type=\"number\"\n value={Number.isInteger(gracePeriodSeconds) ? gracePeriodSeconds : ''}\n />\n <span className=\"form-control-static\">{gracePeriodSeconds === 1 ? 'second' : 'seconds'}</span>\n </StageConfigField>\n </>\n );\n }\n}\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { Application, IStage, IStageConfigProps } from '@spinnaker/core';\n\nimport DeleteManifestOptionsForm from './DeleteManifestOptionsForm';\nimport type { IDeleteOptions } from '../../../manifest/delete/delete.controller';\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\nexport interface IKubernetesManifestStageConfigProps extends IStageConfigProps {\n application: Application;\n stage: IManifestSelector & IStage;\n stageFieldUpdated: () => void;\n}\n\nexport class DeleteManifestStageConfig extends React.Component<IKubernetesManifestStageConfigProps> {\n public componentDidMount = (): void => {\n defaults(this.props.stage, {\n app: this.props.application.name,\n cloudProvider: 'kubernetes',\n });\n if (this.props.stage.isNew) {\n this.props.stage.options = {\n gracePeriodSeconds: null,\n cascading: true,\n };\n }\n this.props.stageFieldUpdated();\n };\n\n private onChange = (stage: IManifestSelector): void => {\n Object.assign(this.props.stage, stage);\n this.props.stageFieldUpdated();\n };\n\n private onOptionsChange = (options: IDeleteOptions): void => {\n this.props.stage.options = options;\n this.props.stageFieldUpdated();\n };\n\n public render() {\n const selector = { ...this.props.stage };\n return (\n <div className=\"form-horizontal\">\n <h4>Manifest</h4>\n <div className=\"horizontal-rule\" />\n <ManifestSelector\n application={this.props.application}\n selector={selector}\n modes={[SelectorMode.Static, SelectorMode.Dynamic, SelectorMode.Label]}\n onChange={this.onChange}\n includeSpinnakerKinds={null}\n />\n <h4>Settings</h4>\n <div className=\"horizontal-rule\" />\n <DeleteManifestOptionsForm onOptionsChange={this.onOptionsChange} options={this.props.stage.options} />\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { IExecutionDetailsSectionProps } from '@spinnaker/core';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport type { ILabelSelectors, IManifestNamesByNamespace } from './ManifestCoordinates';\nimport { ManifestCoordinates } from './ManifestCoordinates';\n\ninterface IManifestExecutionDetailsProps extends IExecutionDetailsSectionProps {\n context: {\n account: string;\n manifestName: string;\n location: string;\n cluster: string;\n criteria: string;\n labelSelectors: ILabelSelectors;\n manifestNamesByNamespace: IManifestNamesByNamespace;\n };\n}\n\nexport const manifestExecutionDetails = (stageName: string) => {\n return class ManifestExecutionDetails extends React.Component<IManifestExecutionDetailsProps> {\n public static title = stageName;\n\n public render() {\n const { stage, current, name } = this.props;\n const {\n account,\n manifestName,\n location,\n cluster,\n criteria,\n labelSelectors,\n manifestNamesByNamespace,\n } = stage.context;\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <div className=\"row\">\n <div className=\"col-md-9\">\n <dl className=\"dl-narrow dl-horizontal\">\n <ManifestCoordinates\n account={account}\n manifestName={manifestName}\n location={location}\n cluster={cluster}\n criteria={criteria}\n labelSelectors={labelSelectors}\n manifestNamesByNamespace={manifestNamesByNamespace}\n />\n </dl>\n </div>\n </div>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n </ExecutionDetailsSection>\n );\n }\n };\n};\n","import type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\n\nexport const manifestSelectorValidators = (stageName: string): IValidatorConfig[] => {\n const required = (field: string) => `<strong>${field}</strong> is a required field for ${stageName} stages.`;\n\n return [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IManifestSelector & IStage) => {\n if (stage.mode === SelectorMode.Dynamic) {\n if (!stage.kind) {\n return required('Kind');\n }\n if (!stage.cluster) {\n return required('Cluster');\n }\n if (!stage.criteria) {\n return required('Target');\n }\n } else if (stage.mode === SelectorMode.Static) {\n const [kind] = (stage.manifestName || '').split(' ');\n if (!kind) {\n return required('Kind');\n }\n const [, name] = (stage.manifestName || '').split(' ');\n if (!name) {\n return required('Name');\n }\n } else if (stage.mode === SelectorMode.Label) {\n if (!stage.kinds) {\n return required('Kinds');\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import type { IStage } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { DeleteManifestStageConfig } from './DeleteManifestStageConfig';\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Delete (Manifest)';\nconst STAGE_KEY = 'deleteManifest';\n\nRegistry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Destroy a Kubernetes object created from a manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: DeleteManifestStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n});\n","import { groupBy, sortBy } from 'lodash';\nimport React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type {\n Application,\n ILoadBalancer,\n IManifest,\n ISecurityGroup,\n IServerGroup,\n IServerGroupManager,\n} from '@spinnaker/core';\nimport { AccountTag, ManifestReader, ModalClose, noop, robotToHuman, TetheredSelect } from '@spinnaker/core';\n\nexport interface IManifestCopierProps {\n application: Application;\n cloudProvider: string;\n show: boolean;\n onDismiss: () => void;\n onManifestSelected: (manifest: IManifest) => void;\n}\n\nexport interface IManifestCopierState {\n selectedManifest: IManifestOption;\n manifests: IManifestOption[];\n}\n\nexport interface IManifestOption {\n account: string;\n location: string;\n name: string;\n kind: string;\n data: any;\n key: string;\n}\n\nconst LAST_APPLIED_CONFIGURATION = 'kubectl.kubernetes.io/last-applied-configuration';\n\n/*\n * A modal that allows a user to copy a running Kubernetes resource.\n **/\nexport class ManifestCopier extends React.Component<IManifestCopierProps, IManifestCopierState> {\n private destroy$ = new Subject();\n\n public static getState = (props: IManifestCopierProps) => {\n let manifests: IManifestOption[] = [];\n\n const serverGroups: IServerGroup[] = props.application.getDataSource('serverGroups').data.filter(\n (s: IServerGroup) =>\n s.cloudProvider === props.cloudProvider &&\n s.category === 'serverGroup' &&\n // Don't include managed server groups - just the manager (see below).\n !(s.serverGroupManagers || []).length,\n );\n\n const grouped = groupBy(serverGroups, (serverGroup) =>\n [serverGroup.cluster, serverGroup.account, serverGroup.region].join(':'),\n );\n\n Object.keys(grouped).forEach((key) => {\n // Only include the most recent server group in a cluster (e.g., if v001 and v002 exist, only include v002).\n const latest = sortBy(grouped[key], 'name').pop();\n const [kind, name] = latest.name.split(' ');\n manifests.push({\n account: latest.account,\n location: latest.region,\n name: name,\n kind: kind,\n data: latest,\n key: [latest.account, latest.region, latest.name].join(':'),\n });\n });\n\n const serverGroupManagers: IServerGroupManager[] = props.application.getDataSource('serverGroupManagers').data;\n const loadBalancers: ILoadBalancer[] = props.application.getDataSource('loadBalancers').data;\n const firewalls: ISecurityGroup[] = props.application.getDataSource('securityGroups').data;\n\n [...serverGroupManagers, ...loadBalancers, ...firewalls]\n .filter(\n (manifest: IServerGroupManager | ILoadBalancer | ISecurityGroup) =>\n manifest.cloudProvider === props.cloudProvider,\n )\n .forEach((manifest: IServerGroupManager | ILoadBalancer | ISecurityGroup) => {\n const [kind, name] = manifest.name.split(' ');\n manifests.push({\n account: manifest.account,\n location: manifest.region,\n name,\n kind,\n data: manifest,\n key: [manifest.account, manifest.region, manifest.name].join(':'),\n });\n });\n\n manifests = sortBy(\n manifests,\n (manifest) => {\n // TODO(dpeach): Could load an account here, then use the spinnakerKind -> kubernetesKind map to\n // construct a more maintainable ordering.\n const order = [\n // server group manager\n 'deployment',\n // server group\n 'replicaSet',\n 'statefulSet',\n 'daemonSet',\n 'jobs',\n 'cronJob',\n // load balancer\n 'service',\n 'ingress',\n // firewall\n 'networkPolicy',\n ];\n return order.includes(manifest.kind) ? order.indexOf(manifest.kind) : Number.MAX_SAFE_INTEGER;\n },\n ['kind', 'name', 'location'],\n );\n\n return {\n selectedManifest: manifests.length ? manifests[0] : null,\n manifests,\n };\n };\n\n constructor(props: IManifestCopierProps) {\n super(props);\n this.state = ManifestCopier.getState(props);\n }\n\n public useManifest = (): void => {\n const {\n data: { account, region, name },\n } = this.state.selectedManifest;\n observableFrom(ManifestReader.getManifest(account, region, name))\n .pipe(takeUntil(this.destroy$))\n .subscribe((manifest: IManifest) => {\n this.props.onManifestSelected(JSON.parse(manifest.manifest.metadata.annotations[LAST_APPLIED_CONFIGURATION]));\n });\n };\n\n public manifestChanged = (option: Option) => {\n this.setState({ selectedManifest: option as IManifestOption });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n const { selectedManifest, manifests } = this.state;\n\n return (\n <Modal show={this.props.show} onHide={noop}>\n <ModalClose dismiss={this.props.onDismiss} />\n <div>\n <Modal.Header>\n <Modal.Title>Copy Manifest</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-4 col-md-offset-1 sm-label-left\">\n <b>Copy manifest from</b>\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-10 col-md-offset-1\">\n <TetheredSelect\n value={selectedManifest ? selectedManifest.key : null}\n placeholder=\"Select...\"\n valueRenderer={this.manifestValueRenderer}\n optionRenderer={this.manifestOptionRenderer}\n options={manifests}\n valueKey=\"key\"\n onChange={this.manifestChanged}\n clearable={false}\n />\n </div>\n </div>\n </form>\n </Modal.Body>\n <div className=\"modal-footer\">\n {selectedManifest && (\n <button className=\"btn btn-primary\" onClick={this.useManifest}>\n <span>Use this manifest</span>\n <span className=\"glyphicon glyphicon-chevron-right\" />\n </button>\n )}\n {!selectedManifest && (\n <button className=\"btn\" onClick={this.props.onDismiss}>\n <span>Cancel</span>\n </button>\n )}\n </div>\n </div>\n </Modal>\n );\n }\n\n private manifestValueRenderer = (option: Option) => {\n const kindLabel = robotToHuman(option.kind).trim();\n return (\n <span>\n <AccountTag account={option.account} />\n {option.data && <span> {option.name}</span>} ({kindLabel} in {option.location})\n </span>\n );\n };\n\n private manifestOptionRenderer = (option: Option) => {\n const kindLabel = robotToHuman(option.kind).trim();\n return (\n <h5>\n <AccountTag account={option.account} /> {option.name} ({kindLabel} in {option.location})\n </h5>\n );\n };\n}\n","import React from 'react';\n\nimport type { Application, IManifest } from '@spinnaker/core';\n\nimport { ManifestCopier } from './ManifestCopier';\n\nexport interface ICopyFromTemplateProps {\n application: Application;\n handleCopy(manifest: IManifest): void;\n}\n\nexport interface ICopyFromTemplateState {\n show: boolean;\n}\n\nexport class CopyFromTemplateButton extends React.Component<ICopyFromTemplateProps, ICopyFromTemplateState> {\n constructor(props: ICopyFromTemplateProps) {\n super(props);\n this.state = { show: false };\n }\n\n private toggle = () => this.setState({ show: !this.state.show });\n\n private handleManifestSelected = (manifest: IManifest) => {\n this.props.handleCopy(manifest);\n this.toggle();\n };\n\n public render() {\n return (\n <>\n <ManifestCopier\n show={this.state.show}\n application={this.props.application}\n cloudProvider=\"kubernetes\"\n onDismiss={this.toggle}\n onManifestSelected={this.handleManifestSelected}\n />\n <button className=\"link\" onClick={this.toggle} style={{ paddingLeft: 0 }}>\n Copy from running infrastructure\n </button>\n </>\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","import { find, get, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\n\nimport type { IAccountDetails } from '@spinnaker/core';\n\nexport interface INamespaceSelectorProps {\n onChange: (namespace: string) => void;\n accounts: IAccountDetails[];\n selectedAccount: string;\n selectedNamespace: string;\n createable?: boolean;\n}\n\nexport class NamespaceSelector extends React.Component<INamespaceSelectorProps> {\n public defaultProps = { createable: false };\n\n private getNamespaceOptions(): Array<Option<string>> {\n const { accounts, selectedAccount, selectedNamespace } = this.props;\n const selectedAccountDetails = find(accounts, (a) => a.name === selectedAccount);\n const namespaces = get(selectedAccountDetails, 'namespaces', []);\n const options = map(namespaces, (n) => ({ label: n, value: n }));\n // only create a value for selectedNamespace if it contains a SPeL expression\n if (this.props.createable && selectedNamespace.includes('${')) {\n options.push({ label: selectedNamespace, value: selectedNamespace });\n }\n return options;\n }\n\n public render() {\n const componentProps = {\n clearable: false,\n options: this.getNamespaceOptions(),\n value: this.props.selectedNamespace,\n onChange: (option: Option) => this.props.onChange(option.value.toString()),\n };\n return this.props.createable ? <Creatable {...componentProps} /> : <Select {...componentProps} />;\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 { strategyHighlander } from './highlander.strategy';\nimport { strategyNone } from './none.strategy';\nimport { strategyRedBlack } from './redblack.strategy';\n\nexport const rolloutStrategies = [strategyNone, strategyRedBlack, strategyHighlander];\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyNone: IDeploymentStrategy = {\n label: 'None',\n description: 'Creates the new ReplicaSet with no impact on existing ReplicaSets in the cluster',\n key: null,\n providerRestricted: false,\n};\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyHighlander: IDeploymentStrategy = {\n label: 'Highlander',\n description: 'Destroys <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'highlander',\n};\n","import { cloneDeep, map, set, split } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\n\nimport type { IAccountDetails, IDeploymentStrategy } from '@spinnaker/core';\nimport { Markdown, StageConfigField } from '@spinnaker/core';\n\nimport { NamespaceSelector } from './NamespaceSelector';\nimport { ManifestKindSearchService } from '../../../manifest/ManifestKindSearch';\nimport { rolloutStrategies } from '../../../rolloutStrategy';\n\nexport interface ITrafficManagementConfig {\n enabled: boolean;\n options: ITrafficManagementOptions;\n}\n\nexport interface ITrafficManagementOptions {\n namespace: string;\n services: string[];\n enableTraffic: boolean;\n strategy: string;\n}\n\nexport const defaultTrafficManagementConfig: ITrafficManagementConfig = {\n enabled: false,\n options: {\n namespace: null,\n services: [],\n enableTraffic: false,\n strategy: null,\n },\n};\n\nexport interface IManifestDeploymentOptionsProps {\n accounts: IAccountDetails[];\n config: ITrafficManagementConfig;\n onConfigChange: (config: ITrafficManagementConfig) => void;\n selectedAccount: string;\n}\n\nexport interface IManifestDeploymentOptionsState {\n services: string[];\n}\n\nexport class ManifestDeploymentOptions extends React.Component<\n IManifestDeploymentOptionsProps,\n IManifestDeploymentOptionsState\n> {\n public state: IManifestDeploymentOptionsState = { services: [] };\n\n private onConfigChange = (key: string, value: any): void => {\n const updatedConfig = cloneDeep(this.props.config);\n set(updatedConfig, key, value);\n this.props.onConfigChange(updatedConfig);\n };\n\n private fetchServices = (): void => {\n const namespace = this.props.config.options.namespace;\n const account = this.props.selectedAccount;\n if (!namespace || !account) {\n this.setState({\n services: [],\n });\n }\n ManifestKindSearchService.search('service', namespace, account).then((services) => {\n this.setState({ services: map(services, 'name') });\n });\n };\n\n private getServiceOptions = (): Array<Option<string>> => {\n const options = this.state.services.map((service) => ({ label: split(service, ' ')[1], value: service }));\n (this.props.config.options.services || []).forEach((service) => {\n if (!this.state.services.includes(service)) {\n options.push({ label: service, value: service });\n }\n });\n return options;\n };\n\n private strategyOptionRenderer = (option: IDeploymentStrategy) => {\n return (\n <div className=\"body-regular\">\n <strong>\n <Markdown tag=\"span\" message={option.label} />\n </strong>\n <div>\n <Markdown tag=\"span\" message={option.description} />\n </div>\n </div>\n );\n };\n\n public componentDidMount() {\n this.fetchServices();\n }\n\n public componentDidUpdate(prevProps: IManifestDeploymentOptionsProps) {\n if (prevProps.selectedAccount !== this.props.selectedAccount) {\n this.onConfigChange('options.namespace', null);\n }\n\n if (prevProps.config.options.namespace !== this.props.config.options.namespace) {\n this.onConfigChange('options.services', null);\n this.fetchServices();\n }\n\n if (!this.props.config.options.enableTraffic && !!this.props.config.options.strategy) {\n this.onConfigChange('options.enableTraffic', true);\n }\n }\n\n public render() {\n const { config } = this.props;\n return (\n <>\n <h4>Rollout Strategy Options</h4>\n <StageConfigField helpKey=\"kubernetes.manifest.rolloutStrategyOptions\" fieldColumns={8} label=\"Enable\">\n <div className=\"checkbox\">\n <label>\n <input\n checked={config.enabled}\n onChange={(e) => this.onConfigChange('enabled', e.target.checked)}\n type=\"checkbox\"\n />\n Spinnaker manages traffic based on your selected strategy\n </label>\n </div>\n </StageConfigField>\n {config.enabled && (\n <>\n <StageConfigField fieldColumns={8} label=\"Service(s) Namespace\">\n <NamespaceSelector\n createable={true}\n onChange={(namespace: string): void => this.onConfigChange('options.namespace', namespace)}\n accounts={this.props.accounts}\n selectedAccount={this.props.selectedAccount}\n selectedNamespace={config.options.namespace || ''}\n />\n </StageConfigField>\n <StageConfigField fieldColumns={8} label=\"Service(s)\">\n <Creatable\n clearable={false}\n multi={true}\n onChange={(options) => this.onConfigChange('options.services', map(options, 'value'))}\n options={this.getServiceOptions()}\n value={config.options.services}\n />\n </StageConfigField>\n <StageConfigField fieldColumns={8} label=\"Traffic\">\n <div className=\"checkbox\">\n <label>\n <input\n checked={config.options.enableTraffic}\n disabled={!!config.options.strategy}\n onChange={(e) => this.onConfigChange('options.enableTraffic', e.target.checked)}\n type=\"checkbox\"\n />\n Send client requests to new pods\n </label>\n </div>\n </StageConfigField>\n <StageConfigField fieldColumns={8} helpKey=\"kubernetes.manifest.rolloutStrategy\" label=\"Strategy\">\n <Select\n clearable={false}\n onChange={(option: Option<IDeploymentStrategy>) => this.onConfigChange('options.strategy', option.key)}\n options={rolloutStrategies}\n optionRenderer={this.strategyOptionRenderer}\n placeholder=\"None\"\n value={config.options.strategy}\n valueKey=\"key\"\n valueRenderer={(o) => <>{o.label}</>}\n />\n </StageConfigField>\n </>\n )}\n </>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type {\n IAccountDetails,\n IArtifact,\n IExpectedArtifact,\n IFormikStageConfigInjectedProps,\n IManifest,\n} from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { CopyFromTemplateButton } from './CopyFromTemplateButton';\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestDeploymentOptions } from './ManifestDeploymentOptions';\nimport { NamespaceSelector } from './NamespaceSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n overrideNamespace: boolean;\n}\n\nexport class DeployManifestStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\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 overrideNamespace: get(stage, 'namespaceOverride', '') !== '',\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 handleCopy = (manifest: IManifest): void => {\n this.props.formik.setFieldValue('manifests', [manifest]);\n this.setState({\n rawManifest: yamlDocumentsToString([manifest]),\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 private overrideNamespaceChange(checked: boolean) {\n if (!checked) {\n this.props.formik.setFieldValue('namespaceOverride', '');\n }\n this.setState({ overrideNamespace: checked });\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=\"Override Namespace\">\n <CheckboxInput\n checked={this.state.overrideNamespace}\n onChange={(e: any) => this.overrideNamespaceChange(e.target.checked)}\n />\n </StageConfigField>\n {this.state.overrideNamespace && (\n <StageConfigField label=\"Namespace\">\n <NamespaceSelector\n createable={true}\n accounts={this.props.accounts}\n selectedAccount={stage.account}\n selectedNamespace={stage.namespaceOverride || ''}\n onChange={(namespace) => this.props.formik.setFieldValue('namespaceOverride', namespace)}\n />\n </StageConfigField>\n )}\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.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 <CopyFromTemplateButton application={this.props.application} handleCopy={this.handleCopy} />\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=\"kubernetes.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=\"kubernetes.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=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n <hr />\n <ManifestDeploymentOptions\n accounts={this.props.accounts}\n config={stage.trafficManagement}\n onConfigChange={(config) => this.props.formik.setFieldValue('trafficManagement', config)}\n selectedAccount={stage.account}\n />\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 { DeployManifestStageForm } from './DeployManifestStageForm';\nimport { defaultTrafficManagementConfig } from './ManifestDeploymentOptions';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployManifestStageConfig 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.trafficManagement) {\n stage.trafficManagement = defaultTrafficManagementConfig;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'kubernetes';\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('kubernetes'))\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) => <DeployManifestStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\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 deployManifestValidators = (): 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 {(isStable || isUnstableWithMessage) && <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 = 'kubernetesResource';\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 KubernetesSpinnakerKindMap\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 spinnakerKindFromKubernetesKind(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: 'kubernetes',\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.spinnakerKindFromKubernetesKind(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 { 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 KubernetesManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n KubernetesManifestService.updateManifest(params, fn);\n return app.onRefresh(null, () => KubernetesManifestService.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: KubernetesManifestService.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 !KubernetesManifestService.BUILT_IN_GROUPS.includes(KubernetesManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (KubernetesManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + KubernetesManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n // from https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/\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 { KubernetesManifestService } 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) => KubernetesManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = KubernetesManifestService.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 = KubernetesManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return KubernetesManifestService.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: 'kubernetes',\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 || KubernetesManifestService.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 { DeployManifestStageConfig } from './DeployManifestStageConfig';\nimport { deployManifestValidators } from './deployManifest.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Manifest)',\n description: 'Deploy a Kubernetes manifest yaml/json file.',\n key: 'deployManifest',\n cloudProvider: 'kubernetes',\n component: DeployManifestStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployManifestValidators(),\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 React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport { CheckboxInput, StageConfigField } from '@spinnaker/core';\n\nexport interface IPatchManifestOptionsFormProps {\n record: boolean;\n onRecordChange: (record: boolean) => void;\n strategy: string;\n onStrategyChange: (strategy: string) => void;\n}\n\nexport const PatchManifestOptionsForm: React.FunctionComponent<IPatchManifestOptionsFormProps> = (\n props: IPatchManifestOptionsFormProps,\n) => {\n return (\n <div className=\"form-horizontal\">\n <StageConfigField label=\"Record Patch Annotation\" helpKey=\"kubernetes.manifest.patch.record\">\n <CheckboxInput\n checked={props.record}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => props.onRecordChange(e.target.checked)}\n />\n </StageConfigField>\n <StageConfigField label=\"Merge Strategy\" helpKey=\"kubernetes.manifest.patch.mergeStrategy\" fieldColumns={3}>\n <Select\n clearable={false}\n value={props.strategy}\n options={['strategic', 'json', 'merge'].map((k) => ({ value: k, label: k }))}\n onChange={(e: Option<string>) => props.onStrategyChange(e.value)}\n />\n </StageConfigField>\n </div>\n );\n};\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { PatchManifestOptionsForm } from './PatchManifestOptionsForm';\nimport { ManifestBindArtifactsSelector } from '../deployManifest/ManifestBindArtifactsSelector';\nimport type { IManifestBindArtifact } from '../deployManifest/ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\ninterface IPatchManifestStageConfigFormProps {\n stageFieldUpdated: () => void;\n}\n\ninterface IPatchManifestStageConfigFormState {\n rawManifest: string;\n}\n\nexport class PatchManifestStageForm extends React.Component<\n IPatchManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IPatchManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.EMBEDDED_BASE64,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IPatchManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const patchBody: any[] = get(props.formik.values, 'patchBody');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(patchBody) && isTextManifest ? yamlDocumentsToString(patchBody) : '',\n };\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 private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('patchBody', manifests);\n };\n\n private onManifestSelectorChange = (): void => {\n this.props.stageFieldUpdated();\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 public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"container-fluid form-horizontal\">\n <h4>Resource to Patch</h4>\n <ManifestSelector\n application={this.props.application}\n modes={[SelectorMode.Static, SelectorMode.Dynamic]}\n onChange={this.onManifestSelectorChange}\n selector={stage as any}\n />\n <hr />\n <h4>Patch Content</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.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=\"kubernetes.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 </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n\n <hr />\n <h4>Patch Options</h4>\n <PatchManifestOptionsForm\n strategy={!!stage.options && stage.options.mergeStrategy}\n onStrategyChange={(strategy: string) => this.props.formik.setFieldValue('options.mergeStrategy', strategy)}\n record={!!stage.options && stage.options.record}\n onRecordChange={(record: boolean) => this.props.formik.setFieldValue('options.record', record)}\n />\n </div>\n );\n }\n}\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { IStage, IStageConfigProps } from '@spinnaker/core';\nimport { FormikStageConfig } from '@spinnaker/core';\n\nimport { PatchManifestStageForm } from './PatchManifestStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\nexport class PatchManifestStageConfig extends React.Component<IStageConfigProps> {\n private readonly stage: IStage;\n\n public constructor(props: IStageConfigProps) {\n super(props);\n defaults(props.stage, {\n app: props.application.name,\n source: ManifestSource.TEXT,\n options: {\n record: true,\n mergeStrategy: 'strategic',\n },\n cloudProvider: 'kubernetes',\n });\n\n // There was a bug introduced in Spinnaker 1.15 where we were incorrectly\n // storing the merge strategy on a field called 'strategy' instead of on\n // 'mergeStrategy'. In order to auto-fix pipelines affected by that bug,\n // delete any value in 'strategy'. If 'mergeStrategy' is empty, set it to\n // the value we deleted from 'strategy'.\n defaults(props.stage.options, {\n mergeStrategy: props.stage.options.strategy,\n });\n delete props.stage.options.strategy;\n\n // There was a bug introduced in Spinnaker 1.15 where we were incorrectly\n // always storing the patchBody as an object. In order to auto-fix pipelines\n // affected by that bug, massage any configured patchBody value into a list.\n if (props.stage.patchBody && !Array.isArray(props.stage.patchBody)) {\n props.stage.patchBody = [props.stage.patchBody];\n }\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 = props.stage;\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <PatchManifestStageForm {...props} stageFieldUpdated={this.props.stageFieldUpdated} />}\n />\n );\n }\n}\n","import {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { PatchManifestStageConfig } from './PatchManifestStageConfig';\nimport { DeployStatus } from '../deployManifest/manifestStatus/DeployStatus';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nexport class PatchStatus extends DeployStatus {\n public static title = 'PatchStatus';\n}\n\nconst STAGE_NAME = 'Patch (Manifest)';\nRegistry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Patch a Kubernetes object in place.',\n key: 'patchManifest',\n cloudProvider: 'kubernetes',\n component: PatchManifestStageConfig,\n executionDetailsSections: [PatchStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: manifestSelectorValidators(STAGE_NAME),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import { capitalize, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IArtifact, IExpectedArtifact, IStageConfigProps } from '@spinnaker/core';\nimport {\n AccountService,\n ArtifactTypePatterns,\n RadioButtonInput,\n StageArtifactSelector,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { ManifestBindArtifactsSelector } from '../deployManifest/ManifestBindArtifactsSelector';\nimport type { IManifestBindArtifact } from '../deployManifest/ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\n\nexport interface IKubernetesRunJobStageConfigState {\n credentials: IAccount[];\n rawManifest?: string;\n}\n\nexport class KubernetesV2RunJobStageConfig extends React.Component<IStageConfigProps> {\n public state: IKubernetesRunJobStageConfigState = {\n credentials: [],\n };\n\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n constructor(props: IStageConfigProps) {\n super(props);\n const { stage, application } = this.props;\n if (!stage.application) {\n stage.application = application.name;\n }\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n }\n\n public outputOptions = [\n { label: 'None', value: 'none' },\n { label: 'Logs', value: 'propertyFile' },\n { label: 'Artifact', value: 'artifact' },\n ];\n\n public accountChanged = (account: string) => {\n this.props.updateStageField({\n credentials: account,\n account: account,\n });\n };\n\n public handleRawManifestChange = (rawManifest: string, manifests: any) => {\n if (manifests) {\n this.props.updateStageField({ manifest: manifests[0] });\n }\n this.setState({ rawManifest });\n };\n\n public initRawManifest() {\n const { stage } = this.props;\n if (stage.manifest) {\n this.setState({ rawManifest: yamlDocumentsToString([stage.manifest]) });\n }\n }\n\n public componentDidMount() {\n this.props.updateStageField({ cloudProvider: 'kubernetes' });\n AccountService.getAllAccountDetailsForProvider('kubernetes').then((accounts: any) => {\n this.setState({ credentials: accounts });\n });\n this.initRawManifest();\n }\n\n private sourceChanged = (event: any) => {\n this.props.updateStageField({ consumeArtifactSource: event.value });\n if (event.value === 'none') {\n this.props.updateStageField({ propertyFile: null });\n }\n };\n\n private onArtifactSelected = (artifact: IExpectedArtifact) => {\n this.props.updateStageField({ consumeArtifactId: artifact.id });\n };\n\n private onArtifactEdited = (artifact: IArtifact) => {\n this.props.updateStageField({\n consumeArtifact: artifact,\n consumeArtifactId: artifact.id,\n consumeArtifactAccount: artifact.artifactAccount,\n });\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.updateStageField({\n manifestArtifactId: expectedArtifactId,\n manifestArtifact: null,\n });\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.updateStageField({\n manifestArtifactId: null,\n manifestArtifact: artifact,\n });\n };\n\n private updatePropertyFile = (event: any) => {\n this.props.updateStageField({ propertyFile: event.target.value });\n };\n\n public logSourceForm() {\n const { stage } = this.props;\n return (\n <StageConfigField label=\"Container Name\" helpKey=\"kubernetes.runJob.captureSource.containerName\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.propertyFile}\n onChange={this.updatePropertyFile}\n />\n </StageConfigField>\n );\n }\n\n public artifactForm() {\n const { stage, pipeline } = this.props;\n return (\n <StageConfigField label=\"Artifact\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n artifact={stage.consumeArtifact}\n excludedArtifactTypePatterns={[]}\n expectedArtifactId={stage.consumeArtifactId}\n onExpectedArtifactSelected={this.onArtifactSelected}\n onArtifactEdited={this.onArtifactEdited}\n />\n </StageConfigField>\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 getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.stage;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.updateStageField({\n requiredArtifactIds: bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n });\n this.props.updateStageField({ requiredArtifacts: bindings.filter((b) => b.artifact) });\n };\n\n public render() {\n const { stage } = this.props;\n\n let outputSource = <div />;\n if (stage.consumeArtifactSource === 'propertyFile') {\n outputSource = this.logSourceForm();\n } else if (stage.consumeArtifactSource === 'artifact') {\n outputSource = this.artifactForm();\n }\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n selectedAccount={stage.account || ''}\n accounts={this.state.credentials}\n onAccountSelect={(selectedAccount: string) => this.accountChanged(selectedAccount)}\n />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.updateStageField({ source: e.target.value })}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <YamlEditor value={this.state.rawManifest} onChange={this.handleRawManifestChange} />\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"kubernetes.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 </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n <h4>Output</h4>\n <StageConfigField label=\"Capture Output From\" helpKey=\"kubernetes.runJob.captureSource\">\n <div>\n <Select\n clearable={false}\n options={this.outputOptions}\n value={stage.consumeArtifactSource}\n onChange={this.sourceChanged}\n />\n </div>\n </StageConfigField>\n {outputSource}\n </div>\n );\n }\n}\n","import { get, isEmpty, sortBy } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IJobOwnedPodStatus } from '@spinnaker/core';\nimport {\n AccountTag,\n DefaultPodNameProvider,\n ExecutionDetailsSection,\n JobStageExecutionLogs,\n StageFailureMessage,\n} from '@spinnaker/core';\n\nexport class RunJobExecutionDetails extends React.Component<IExecutionDetailsSectionProps, any> {\n public static title = 'runJobConfig';\n\n private createdPodNames(podsStatuses: IJobOwnedPodStatus[]): string[] {\n const sorted = sortBy(podsStatuses, (p: IJobOwnedPodStatus) => p.status.startTime);\n return sorted.map((p: IJobOwnedPodStatus) => p.name);\n }\n\n public render() {\n const { stage, name, current } = this.props;\n const { context } = stage;\n const namespace = get(stage, ['context', 'jobStatus', 'location'], '');\n const deployedName = namespace ? get<string[]>(context, ['deploy.jobs', namespace])[0] : '';\n const externalLink = get<string>(stage, ['context', 'execution', 'logs']);\n const pods = get(stage.context, 'jobStatus.pods', []);\n const podNames = !isEmpty(pods)\n ? this.createdPodNames(pods)\n : [get(stage, ['context', 'jobStatus', 'mostRecentPodName'], '')];\n const podNamesProviders = podNames.map((p) => new DefaultPodNameProvider(p));\n\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n <div className=\"row\">\n <div className=\"col-md-9\">\n <dl className=\"dl-narrow dl-horizontal\">\n <dt>Account</dt>\n <dd>\n <AccountTag account={context.account} />\n </dd>\n {namespace && (\n <>\n <dt>Namespace</dt>\n <dd>{stage.context.jobStatus.location}</dd>\n <dt>Logs</dt>\n <dd>\n <JobStageExecutionLogs\n deployedName={deployedName}\n account={this.props.stage.context.account}\n location={namespace}\n application={this.props.application}\n externalLink={externalLink}\n podNamesProviders={podNamesProviders}\n />\n </dd>\n </>\n )}\n {!namespace && <div className=\"well\">Collecting additional details...</div>}\n </dl>\n </div>\n </div>\n </ExecutionDetailsSection>\n );\n }\n}\n","import type { ICustomValidator, IPipeline, IStage, IStageOrTriggerTypeConfig, IValidatorConfig } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { KubernetesV2RunJobStageConfig } from './KubernetesV2RunJobStageConfig';\nimport { RunJobExecutionDetails } from './RunJobExecutionDetails';\nimport { DeployStatus } from '../deployManifest/manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Run Job (Manifest)',\n description: 'Run a Kubernetes Job manifest yaml/json file.',\n key: 'runJobManifest',\n alias: 'runJob',\n addAliasToConfig: true,\n cloudProvider: 'kubernetes',\n component: KubernetesV2RunJobStageConfig,\n executionDetailsSections: [RunJobExecutionDetails, DeployStatus, ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n producesArtifacts: true,\n restartable: true,\n validators: [\n {\n type: 'custom',\n validate: (\n _pipeline: IPipeline,\n stage: IStage,\n _validator: IValidatorConfig,\n _config: IStageOrTriggerTypeConfig,\n ): string => {\n if (!stage.manifest || !stage.manifest.kind) {\n return '';\n }\n if (stage.manifest.kind !== 'Job') {\n return 'Run Job (Manifest) only accepts manifest of kind Job.';\n }\n return '';\n },\n } as ICustomValidator,\n ],\n});\n","import type { IController, IScope } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\n\nexport class KubernetesV2FindArtifactsFromResourceConfigCtrl implements IController {\n public application: Application;\n\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n this.application = this.$scope.$parent.application;\n if (this.$scope.stage.isNew) {\n const defaultSelection: IManifestSelector = {\n location: '',\n account: '',\n manifestName: '',\n app: this.application.name,\n };\n Object.assign(this.$scope.stage, defaultSelection);\n this.$scope.stage.cloudProvider = 'kubernetes';\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport { ExecutionArtifactTab, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { KubernetesV2FindArtifactsFromResourceConfigCtrl } from './findArtifactsFromResourceConfig.controller';\nimport { KUBERNETES_MANIFEST_SELECTOR } from '../../../manifest/selector/selector.component';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nexport const KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE =\n 'spinnaker.kubernetes.v2.pipeline.stage.findArtifactsFromResource';\n\nconst STAGE_NAME = 'Find Artifacts From Resource (Manifest)';\nmodule(KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE, [KUBERNETES_MANIFEST_SELECTOR])\n .config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Finds artifacts from a Kubernetes resource.',\n key: 'findArtifactsFromResource',\n cloudProvider: 'kubernetes',\n templateUrl: require('./findArtifactsFromResourceConfig.html'),\n controller: 'KubernetesV2FindArtifactsFromResourceConfigCtrl',\n controllerAs: 'ctrl',\n executionDetailsSections: [ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n })\n .controller('KubernetesV2FindArtifactsFromResourceConfigCtrl', KubernetesV2FindArtifactsFromResourceConfigCtrl);\n","import type { IController, IScope } from 'angular';\nimport { defaults } from 'lodash';\n\nimport type { Application } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\n\nexport class KubernetesV2ScaleManifestConfigCtrl implements IController {\n public application: Application;\n\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n if (this.$scope.stage.isNew) {\n this.application = this.$scope.$parent.application;\n const defaultSelection: IManifestSelector = {\n location: '',\n account: '',\n };\n defaults(this.$scope.stage, defaultSelection);\n const defaultOptions: any = {\n replicas: null,\n app: this.application.name,\n };\n defaults(this.$scope.stage, defaultOptions);\n this.$scope.stage.cloudProvider = 'kubernetes';\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM } from '../../../manifest/scale/scaleSettingsForm.component';\nimport { KubernetesV2ScaleManifestConfigCtrl } from './scaleManifestConfig.controller';\n\nexport const KUBERNETES_SCALE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.scaleManifestStage';\nconst STAGE_KEY = 'scaleManifest';\n\nmodule(KUBERNETES_SCALE_MANIFEST_STAGE, [KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Scale (Manifest)',\n description: 'Scale a Kubernetes object created from a manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n templateUrl: require('./scaleManifestConfig.html'),\n controller: 'KubernetesV2ScaleManifestConfigCtrl',\n controllerAs: 'ctrl',\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'replicas', fieldLabel: 'Replicas' },\n ],\n });\n })\n .controller('KubernetesV2ScaleManifestConfigCtrl', KubernetesV2ScaleManifestConfigCtrl);\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { IStage, IStageConfigProps } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\nexport interface IKubernetesManifestStageConfigProps extends IStageConfigProps {\n stage: IManifestSelector & IStage;\n}\n\nexport class ManifestTrafficStageConfig extends React.Component<IKubernetesManifestStageConfigProps> {\n public componentDidMount = (): void => {\n defaults(this.props.stage, {\n app: this.props.application.name,\n cloudProvider: 'kubernetes',\n });\n this.props.stageFieldUpdated();\n };\n\n private onChange = (stage: IManifestSelector): void => {\n Object.assign(this.props.stage, stage);\n this.props.stageFieldUpdated();\n };\n\n public render() {\n const selector = { ...this.props.stage };\n return (\n <div className=\"form-horizontal\">\n <h4>Manifest</h4>\n <div className=\"horizontal-rule\" />\n <ManifestSelector\n application={this.props.application}\n selector={selector}\n modes={[SelectorMode.Static, SelectorMode.Dynamic]}\n onChange={this.onChange}\n includeSpinnakerKinds={['serverGroups']}\n />\n </div>\n );\n }\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Disable (Manifest)';\nconst STAGE_KEY = 'disableManifest';\nexport const KUBERNETES_DISABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.disableManifestStage';\nmodule(KUBERNETES_DISABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Disable a Kubernetes manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: ManifestTrafficStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n});\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Enable (Manifest)';\nconst STAGE_KEY = 'enableManifest';\nexport const KUBERNETES_ENABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.enableManifestStage';\nmodule(KUBERNETES_ENABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Enable a Kubernetes manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: ManifestTrafficStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n});\n","import type { IController, IScope } from 'angular';\n\nexport class KubernetesV2UndoRolloutManifestConfigCtrl implements IController {\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n if (this.$scope.stage.isNew) {\n Object.assign(this.$scope.stage, {\n location: '',\n account: '',\n cloudProvider: 'kubernetes',\n numRevisionsBack: 1,\n });\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { Registry } from '@spinnaker/core';\n\nimport { KubernetesV2UndoRolloutManifestConfigCtrl } from './undoRolloutManifestConfig.controller';\n\nexport const KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.undoRolloutManifestStage';\n\nmodule(KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE, [])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Undo Rollout (Manifest)',\n description: 'Rollback a manifest a target number of revisions.',\n key: 'undoRolloutManifest',\n cloudProvider: 'kubernetes',\n templateUrl: require('./undoRolloutManifestConfig.html'),\n controller: 'KubernetesV2UndoRolloutManifestConfigCtrl',\n controllerAs: 'ctrl',\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'numRevisionsBack', fieldLabel: 'Number of Revisions' },\n { type: 'manifestSelector' },\n ],\n });\n })\n .controller('KubernetesV2UndoRolloutManifestConfigCtrl', KubernetesV2UndoRolloutManifestConfigCtrl);\n","import type {\n IPipeline,\n IStage,\n IStageOrTriggerTypeConfig,\n IStageOrTriggerValidator,\n IValidatorConfig,\n} from '@spinnaker/core';\nimport { PipelineConfigValidator } from '@spinnaker/core';\n\nexport interface IStageWithManifestSelector extends IStage {\n manifestName: string;\n location: string;\n}\n\nexport class ManifestSelectorValidator implements IStageOrTriggerValidator {\n public validate(\n _pipeline: IPipeline,\n stage: IStageWithManifestSelector,\n _validator: IValidatorConfig,\n _config: IStageOrTriggerTypeConfig,\n ): string {\n const [kind, name] = (stage.manifestName || '').split(' ');\n if (!name && !kind) {\n return `<strong>Name</strong> and <strong>Kind</strong> are required fields.`;\n }\n if (!name) {\n return `<strong>Name</strong> is a required field.`;\n }\n if (!kind) {\n return `<strong>Kind</strong> is a required field.`;\n }\n return null;\n }\n}\n\nPipelineConfigValidator.registerValidator('manifestSelector', new ManifestSelectorValidator());\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\nimport { ApplicationDataSourceRegistry, INFRASTRUCTURE_KEY, REST } from '@spinnaker/core';\n\nexport const KUBERNETS_RAW_RESOURCE_DATA_SOURCE = 'spinnaker.core.rawresource.dataSource';\nexport const KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY = 'k8s';\nconst KUBERNETS_RAW_RESOURCE_DATA_SOURCE_SREF = `.insight.${KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY}`;\n\ntype ApiK8sResource = any;\n\nconst fetchK8sResources = (application: Application): PromiseLike<ApiK8sResource> =>\n REST('applications').path(application.name, 'rawResources').get();\n\nconst formatK8sResources = ($q: IQService) => (_: Application, result: ApiK8sResource): PromiseLike<ApiK8sResource> =>\n $q.resolve(result);\n\nmodule(KUBERNETS_RAW_RESOURCE_DATA_SOURCE, []).run([\n '$q',\n ($q: IQService) => {\n ApplicationDataSourceRegistry.registerDataSource({\n key: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,\n label: 'Kubernetes',\n category: INFRASTRUCTURE_KEY,\n sref: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_SREF,\n primary: true,\n icon: 'fas fa-xs fa-fw fa-th-large',\n iconName: 'spMenuK8s',\n loader: fetchK8sResources,\n onLoad: formatK8sResources($q),\n providerField: 'cloudProvider',\n credentialsField: 'account',\n regionField: 'region',\n description: 'Collections of kubernetes resources',\n defaultData: [],\n });\n },\n]);\n","export class RawResourceUtils {\n static GLOBAL_LABEL = '(global)';\n\n static namespaceDisplayName(ns: string): string {\n if (ns === null || ns === '') {\n return RawResourceUtils.GLOBAL_LABEL;\n }\n return ns;\n }\n\n static resourceKey(resource: IApiKubernetesResource): string {\n if (resource === null) {\n return '';\n }\n return resource.namespace === ''\n ? resource.account + '-' + resource.kind + '-' + resource.name\n : resource.account + '-' + resource.namespace + '-' + resource.kind + '-' + resource.name;\n }\n}\n","import type { IK8sResourcesFiltersState } from '../component/K8sResourcesFilters';\n\ntype ISubscriber = (message: IK8sResourcesFiltersState) => void;\n\nexport class FiltersPubSub {\n private subscribers: ISubscriber[] = [];\n private static intances: Record<string, FiltersPubSub> = {};\n\n private constructor() {}\n\n public static getInstance(name: string) {\n let instance = FiltersPubSub.intances[name];\n if (!FiltersPubSub.intances[name]) {\n FiltersPubSub.intances[name] = new FiltersPubSub();\n instance = FiltersPubSub.intances[name];\n }\n return instance;\n }\n\n public subscribe(subscriber: ISubscriber) {\n this.subscribers.push(subscriber);\n return () => (this.subscribers = this.subscribers.filter((x) => x !== subscriber));\n }\n\n public unsubscribe(subscriber: ISubscriber) {\n const index = this.subscribers.indexOf(subscriber);\n if (index > -1) {\n this.subscribers.splice(index, 1);\n }\n }\n\n public publish(message: IK8sResourcesFiltersState) {\n this.subscribers.forEach((sub) => sub(message));\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport { CloudProviderLogo } from '@spinnaker/core';\n\nimport { RawResourceUtils } from '../RawResourceUtils';\n\nimport './RawResource.less';\n\ninterface IRawResourceProps {\n resource: IApiKubernetesResource;\n}\n\ninterface IRawResourceState {}\n\nexport class RawResource extends React.Component<IRawResourceProps, IRawResourceState> {\n constructor(props: IRawResourceProps) {\n super(props);\n }\n\n public render() {\n const { account, name, region } = this.props.resource;\n const params = { account, name, region };\n return (\n <UISrefActive class=\"active\">\n <UISref to=\".rawResourceDetails\" params={params}>\n <div className=\"RawResource card clickable clickable-row\">\n <h4 className=\"title\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"20px\" width=\"20px\" />\n {this.props.resource.kind} {this.props.resource.displayName}\n </h4>\n <div className=\"details\">\n <div className=\"column\">\n <div className=\"title\">account:</div>\n <div>{this.props.resource.account}</div>\n </div>\n <div className=\"column\">\n <div className=\"title\">namespace:</div>\n <div>{RawResourceUtils.namespaceDisplayName(this.props.resource.namespace)}</div>\n </div>\n <div className=\"column\">\n <div className=\"title\">apiVersion:</div>\n <div>{this.props.resource.apiVersion}</div>\n </div>\n </div>\n </div>\n </UISref>\n </UISrefActive>\n );\n }\n}\n","import React from 'react';\nimport './RawResource.less';\n\ninterface IRawResourceGroupProps {\n title: string;\n resources?: IApiKubernetesResource[];\n}\n\ninterface IRawResourceGroupState {\n open: boolean;\n}\n\nexport class RawResourceGroup extends React.Component<IRawResourceGroupProps, IRawResourceGroupState> {\n constructor(props: IRawResourceGroupProps) {\n super(props);\n\n this.state = {\n open: true,\n };\n }\n\n public render() {\n return (\n <div className=\"RawResourceGroup\">\n <div className=\"clickable sticky-header header\" onClick={this.onHeaderClick.bind(this)}>\n <span className={`glyphicon pipeline-toggle glyphicon-chevron-${this.state.open ? 'down' : 'right'}`} />\n <div className=\"shadowed\">\n <h4 className=\"group-title\">{this.props.title}</h4>\n </div>\n </div>\n <div className={`items${this.state.open ? '' : ' hidden'}`}>{this.props.children}</div>\n </div>\n );\n }\n\n private onHeaderClick() {\n this.setState({\n open: !this.state.open,\n });\n }\n}\n","import React from 'react';\nimport { RawResourceGroup } from './RawResouceGroup';\nimport { RawResource } from './RawResource';\nimport { RawResourceUtils } from '../RawResourceUtils';\n\ninterface IRawResourceGroupsProps {\n resources: IApiKubernetesResource[];\n groupBy: string;\n}\n\ninterface IRawResourceGroupsState {}\n\nexport class RawResourceGroups extends React.Component<IRawResourceGroupsProps, IRawResourceGroupsState> {\n constructor(props: IRawResourceGroupsProps) {\n super(props);\n }\n\n private buildGroupByModel(resources: IApiKubernetesResource[]) {\n const values = resources.map((r: Record<string, any>) => String(r[this.props.groupBy]));\n return Object.assign(\n {},\n ...values.map((value) => ({\n [value]: resources.filter((r: Record<string, any>) => String(r[this.props.groupBy]) === value),\n })),\n ) as Record<string, IApiKubernetesResource[]>;\n }\n\n private groupTitle(title: string): string {\n if (this.props.groupBy == 'namespace') {\n return RawResourceUtils.namespaceDisplayName(title);\n }\n return title;\n }\n\n public render() {\n const groups = this.buildGroupByModel(this.props.resources);\n return (\n <div className=\"RawResourceGroups\">\n {...Object.entries(groups).map(([key, value]) => {\n return key !== 'undefined' ? (\n <RawResourceGroup title={this.groupTitle(key)} key={key}>\n {...value.map((resource) => (\n <RawResource resource={resource} key={RawResourceUtils.resourceKey(resource)}></RawResource>\n ))}\n </RawResourceGroup>\n ) : (\n <></>\n );\n })}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { Application, ApplicationDataSource } from '@spinnaker/core';\nimport { FormField, ReactSelectInput } from '@spinnaker/core';\n\nimport type { IK8sResourcesFiltersState } from './K8sResourcesFilters';\nimport { RawResourceUtils } from './RawResourceUtils';\nimport { FiltersPubSub } from '../controller/FiltersPubSub';\nimport { RawResource } from './group/RawResource';\nimport { RawResourceGroups } from './group/RawResourceGroups';\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY } from '../rawResource.dataSource';\n\nimport './K8sResources.less';\n\nexport interface IK8sResourcesProps {\n app: Application;\n}\n\ninterface IK8sResourcesState {\n groupBy: string;\n filters: IK8sResourcesFiltersState;\n rawResources: IApiKubernetesResource[];\n}\n\nexport class K8sResources extends React.Component<IK8sResourcesProps, IK8sResourcesState> {\n private dataSource: ApplicationDataSource<IApiKubernetesResource[]>;\n private filterPubSub: FiltersPubSub = FiltersPubSub.getInstance(this.props.app.name);\n private sub = this.onFilterChange.bind(this);\n\n constructor(props: IK8sResourcesProps) {\n super(props);\n this.dataSource = this.props.app.getDataSource(KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY);\n this.state = {\n groupBy: 'none',\n filters: null,\n rawResources: [],\n };\n\n this.filterPubSub.subscribe(this.sub);\n }\n\n public componentWillUnmount() {\n this.filterPubSub.unsubscribe(this.sub);\n }\n\n public onFilterChange(message: IK8sResourcesFiltersState) {\n this.setState({ ...this.state, filters: message });\n }\n\n public async componentDidMount() {\n await this.dataSource.ready();\n\n this.setState({\n ...this.state,\n groupBy: this.state.groupBy,\n rawResources: await this.dataSource.data.sort((a, b) => a.name.localeCompare(b.name)),\n });\n }\n\n private groupByChanged = (e: React.ChangeEvent<any>): void => {\n this.setState({ groupBy: e.target.value.toLowerCase() });\n };\n\n public render() {\n const opts = ['None', 'Account', 'Kind', 'Namespace'];\n return (\n <div className=\"K8sResources\">\n <div className=\"header row\">\n <FormField\n onChange={this.groupByChanged}\n value={this.state.groupBy.charAt(0).toUpperCase() + this.state.groupBy.substr(1)}\n name=\"groupBy\"\n label=\"Group By\"\n input={(props) => (\n <ReactSelectInput {...props} inputClassName=\"groupby\" stringOptions={opts} clearable={false} />\n )}\n />\n </div>\n <div className=\"content\">\n {this.state.groupBy === 'none' ? (\n <>\n {...this.state.rawResources\n .filter((resource) => this.matchFilters(resource))\n .map((resource) => (\n <RawResource key={RawResourceUtils.resourceKey(resource)} resource={resource}></RawResource>\n ))}\n </>\n ) : (\n <RawResourceGroups\n resources={this.state.rawResources.filter((resource) => this.matchFilters(resource))}\n groupBy={this.state.groupBy}\n ></RawResourceGroups>\n )}\n </div>\n </div>\n );\n }\n\n private matchFilters(resource: IApiKubernetesResource) {\n if (this.state.filters == null) {\n return true;\n }\n const accountMatch =\n Object.values(this.state.filters.accounts).every((x) => !x) || this.state.filters.accounts[resource.account];\n const kindMatch =\n Object.values(this.state.filters.kinds).every((x) => !x) || this.state.filters.kinds[resource.kind];\n const namespaceMatch =\n Object.values(this.state.filters.namespaces).every((x) => !x) ||\n this.state.filters.namespaces[resource.namespace];\n return accountMatch && kindMatch && namespaceMatch;\n }\n}\n","import React from 'react';\n\nimport type { Application, ApplicationDataSource } from '@spinnaker/core';\nimport { FilterCheckbox, FilterSection } from '@spinnaker/core';\n\nimport { RawResourceUtils } from './RawResourceUtils';\nimport { FiltersPubSub } from '../controller/FiltersPubSub';\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY } from '../rawResource.dataSource';\n\nexport interface IK8sResourcesFiltersProps {\n app: Application;\n}\n\nexport interface IK8sResourcesFiltersState {\n accounts: Record<string, boolean>;\n kinds: Record<string, boolean>;\n namespaces: Record<string, boolean>;\n displayNamespaces: Record<string, boolean>;\n}\n\nexport class K8sResourcesFilters extends React.Component<IK8sResourcesFiltersProps, IK8sResourcesFiltersState> {\n private dataSource: ApplicationDataSource<IApiKubernetesResource[]>;\n private filterPubSub: FiltersPubSub = FiltersPubSub.getInstance(this.props.app.name);\n\n constructor(props: IK8sResourcesFiltersProps) {\n super(props);\n this.dataSource = this.props.app.getDataSource(KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY);\n\n this.state = {\n accounts: {},\n kinds: {},\n namespaces: {},\n displayNamespaces: {},\n };\n }\n\n public async componentDidMount() {\n await this.dataSource.ready();\n const ns = Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.namespace]: false })));\n const displayNs = { ...ns };\n if ('' in displayNs) {\n delete displayNs[''];\n displayNs[RawResourceUtils.GLOBAL_LABEL] = false;\n }\n this.setState({\n accounts: Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.account]: false }))),\n kinds: Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.kind]: false }))),\n namespaces: ns,\n displayNamespaces: displayNs,\n });\n }\n\n public render() {\n return (\n <div className=\"content\">\n <FilterSection heading={'Kind'} expanded={true}>\n {...Object.keys(this.state.kinds)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.kinds}\n onChange={this.onCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n <FilterSection heading={'Account'} expanded={true}>\n {...Object.keys(this.state.accounts)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.accounts}\n onChange={this.onCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n <FilterSection heading={'Namespace'} expanded={true}>\n {...Object.keys(this.state.displayNamespaces)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.displayNamespaces}\n onChange={this.onNsCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n </div>\n );\n }\n\n private onNsCheckbox() {\n const { namespaces, displayNamespaces } = { ...this.state };\n for (const p in displayNamespaces) {\n if (p == RawResourceUtils.GLOBAL_LABEL) {\n namespaces[''] = displayNamespaces[p];\n }\n namespaces[p] = displayNamespaces[p];\n }\n this.setState({ namespaces });\n this.filterPubSub.publish(this.state);\n }\n\n private onCheckbox() {\n this.setState(this.state);\n this.filterPubSub.publish(this.state);\n }\n}\n","import { UISref } from '@uirouter/react';\nimport { get } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\nimport { Dropdown } from 'react-bootstrap';\nimport { Subject } from 'rxjs';\n\nimport type { IManifest } from '@spinnaker/core';\nimport {\n AccountTag,\n CloudProviderLogo,\n CollapsibleSection,\n ConfirmationModalService,\n logger,\n ManifestWriter,\n Overridable,\n SETTINGS,\n Spinner,\n timestamp,\n} from '@spinnaker/core';\n\nimport { RawResourceUtils } from '../RawResourceUtils';\nimport { ManifestLabels } from '../../../manifest/ManifestLabels';\nimport { KubernetesManifestService } from '../../../manifest/manifest.service';\nimport { KubernetesManifestCommandBuilder } from '../../../manifest/manifestCommandBuilder.service';\nimport type { IKubernetesManifestCondition } from '../../../manifest/status/ManifestCondition';\nimport { ManifestCondition } from '../../../manifest/status/ManifestCondition';\nimport { ManifestWizard } from '../../../manifest/wizard/ManifestWizard';\nimport { ManifestEvents } from '../../../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport interface IRawResourceDetailsProps {\n app: any;\n $stateParams: {\n account: string;\n application: string;\n name: string;\n region: string;\n };\n}\n\nexport interface IRawResourcesDetailState {\n account: string;\n application: string;\n name: string;\n region: string;\n loading: boolean;\n manifest?: IManifest;\n}\n\nOverridable('k8s.rawResource.details');\nexport class RawResourceDetails extends React.Component<IRawResourceDetailsProps, IRawResourcesDetailState> {\n constructor(props: IRawResourceDetailsProps) {\n super(props);\n this.state = {\n account: null,\n application: null,\n name: null,\n region: null,\n loading: true,\n manifest: null,\n };\n }\n private destroy$ = new Subject();\n private props$ = new Subject<IRawResourceDetailsProps>();\n private unsubscribeManifest?: () => void;\n\n public componentDidMount() {\n this.setState({\n account: this.props.$stateParams.account,\n application: this.props.$stateParams.application,\n name: this.props.$stateParams.name,\n region: this.props.$stateParams.region,\n });\n const params = {\n account: this.props.$stateParams.account,\n location: this.props.$stateParams.region == '' ? '_' : this.props.$stateParams.region,\n name: this.props.$stateParams.name,\n };\n this.unsubscribeManifest = KubernetesManifestService.subscribe(this.props.app, params, (manifest) => {\n if (this.unsubscribeManifest != null) {\n this.setState({ manifest, loading: false });\n }\n });\n }\n\n public componentWillReceiveProps(nextProps: IRawResourceDetailsProps) {\n this.props$.next(nextProps);\n }\n\n public componentWillUnmount() {\n this.destroy$.next();\n if (this.unsubscribeManifest) {\n this.unsubscribeManifest();\n this.unsubscribeManifest = null;\n }\n }\n\n private editRawResource() {\n const { app } = this.props;\n const { account, application, manifest } = this.state;\n\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n app,\n manifest.manifest,\n { app: application },\n account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: app, command: builtCommand });\n });\n }\n\n private deletedRawResource = () => {\n const { app } = this.props;\n const { account, manifest } = this.state;\n const name = manifest?.manifest?.metadata?.name ?? null;\n const kind = manifest?.manifest?.kind;\n const taskMonitor = {\n application: app,\n title: 'Deleting ' + name,\n };\n\n const submitMethod = () => {\n logger.log({ category: 'RawResource', action: 'Delete clicked' });\n const command = {\n manifestName: this.state.name,\n location: this.state.region,\n account: this.state.account,\n reason: null as string,\n cloudProvider: 'kubernetes',\n options: {\n cascading: false,\n },\n };\n return ManifestWriter.deleteManifest(command, this.props.app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Are you sure you want to delete the ' + kind + ' ' + name + '?',\n buttonText: 'Delete',\n account: account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n });\n };\n\n private handleEditClick = (): void => {\n logger.log({ category: 'RawResource', action: 'Edit clicked' });\n this.editRawResource();\n };\n\n public render() {\n const { account, region, manifest } = this.state;\n const kind = manifest?.manifest?.kind;\n const apiVersion = manifest?.manifest?.apiVersion;\n const metadata = manifest?.manifest?.metadata;\n const name = metadata?.name;\n const creationUnixMs =\n get(metadata, 'creationTimestamp') && DateTime.fromISO(metadata.creationTimestamp).toMillis();\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n {this.state.loading ? (\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n ) : (\n <div className=\"header-text horizontal middle\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"36px\" width=\"36px\" />\n <h3 className=\"horizontal middle space-between flex-1\">\n {kind} {name}\n </h3>\n </div>\n )}\n {!this.state.loading && SETTINGS.kubernetesAdHocInfraWritesEnabled && (\n <div className=\"actions\">\n <Dropdown className=\"dropdown\" id=\"resource-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">\n <span>{kind} Actions</span>\n </Dropdown.Toggle>\n <Dropdown.Menu>\n <li key=\"action-edit\" id=\"resource-action-edit\">\n <a onClick={this.handleEditClick}>Edit</a>\n </li>\n <li key=\"action-delete\" id=\"resource-action-delete\">\n <a onClick={this.deletedRawResource}>Delete</a>\n </li>\n </Dropdown.Menu>\n </Dropdown>\n </div>\n )}\n </div>\n {!this.state.loading && (\n <div className=\"content\">\n <CollapsibleSection heading=\"Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(creationUnixMs)}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={account} />\n </dd>\n <dt>API Version</dt>\n <dd>{apiVersion}</dd>\n <dt>Kind</dt>\n <dd>{kind}</dd>\n <dt>Namespace</dt>\n <dd>{RawResourceUtils.namespaceDisplayName(region)}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection key=\"status\" heading=\"status\" defaultExpanded={true}>\n <ul>\n {(manifest?.manifest?.status?.conditions ?? []).map((condition: IKubernetesManifestCondition) => (\n <li key={condition.type + condition.lastTransitionTime} style={{ marginBottom: '10px' }}>\n <ManifestCondition condition={condition} />\n </li>\n ))}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection key=\"events\" heading=\"events\" defaultExpanded={true}>\n <ManifestEvents manifest={manifest} />\n </CollapsibleSection>\n <CollapsibleSection key=\"labels\" heading=\"labels\" defaultExpanded={true}>\n <ManifestLabels manifest={get(manifest, ['manifest'], {})} />\n </CollapsibleSection>\n </div>\n )}\n </div>\n );\n }\n}\n","import { module } from 'angular';\n\n//import { StateParams } from '@uirouter/angularjs';\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\n\nimport { K8sResources } from './component/K8sResources';\nimport { K8sResourcesFilters } from './component/K8sResourcesFilters';\nimport { RawResourceDetails } from './component/group/RawResourceDetails';\n\nexport interface IKubernetesRawResourceStateParams {\n account: string;\n name: string;\n region: string;\n}\n\nexport const KUBERNETS_RAW_RESOURCE_STATES = 'spinnaker.kubernetes.rawresource.states';\nmodule(KUBERNETS_RAW_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const rawResourceDetails: INestedState = {\n name: 'rawResourceDetails',\n url: '/rawResourceDetails/:account/:region/:name',\n views: {\n 'detail@../insight': {\n component: RawResourceDetails,\n $type: 'react',\n },\n },\n resolve: {\n account: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.account],\n name: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.name],\n region: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.region],\n },\n data: {\n pageTitleDetails: {\n title: 'Raw Resource Details',\n nameParam: 'name',\n accountParam: 'account',\n },\n history: {\n type: 'rawResources',\n },\n },\n };\n const kubernetes: INestedState = {\n url: `/kubernetes`,\n name: 'k8s',\n views: {\n nav: { component: K8sResourcesFilters, $type: 'react' },\n master: { component: K8sResources, $type: 'react' },\n },\n data: {\n pageTitleSection: {\n title: 'Kubernetes',\n },\n },\n children: [],\n };\n\n applicationStateProvider.addInsightState(kubernetes);\n applicationStateProvider.addInsightDetailState(rawResourceDetails);\n },\n]);\n","import { module } from 'angular';\n\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE } from './rawResource.dataSource';\nimport { KUBERNETS_RAW_RESOURCE_STATES } from './rawResource.states';\n\nexport const KUBERNETS_RAW_RESOURCE_MODULE = 'spinnaker.kubernetes.rawresource';\n\nmodule(KUBERNETS_RAW_RESOURCE_MODULE, [KUBERNETS_RAW_RESOURCE_DATA_SOURCE, KUBERNETS_RAW_RESOURCE_STATES]);\n","import { UISref } from '@uirouter/react';\nimport { get } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { AccountTag, CloudProviderLogo, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport { ManifestLabels } from '../manifest/ManifestLabels';\nimport { KubernetesManifestService } from '../manifest/manifest.service';\nimport { ManifestCondition } from '../manifest/status/ManifestCondition';\nimport { ManifestEvents } from '../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport interface IKubernetesResourceDetailsProps {\n app: any;\n kubernetesResource: any;\n}\n\nexport interface IKubernetesResourceDetailsState {\n manifest?: IManifest;\n loading: boolean;\n}\n\nexport class KubernetesResourceDetails extends React.Component<\n IKubernetesResourceDetailsProps,\n IKubernetesResourceDetailsState\n> {\n private unsubscribeManifest?: () => void;\n\n constructor(props: IKubernetesResourceDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n manifest: null,\n };\n }\n\n public componentDidMount() {\n const { kubernetesResource } = this.props;\n const params = {\n account: kubernetesResource.accountId,\n location: kubernetesResource.region,\n name: kubernetesResource.kubernetesResource,\n };\n this.unsubscribeManifest = KubernetesManifestService.subscribe(this.props.app, params, (manifest) => {\n if (this.unsubscribeManifest != null) {\n this.setState({ manifest, loading: false });\n }\n });\n }\n\n public componentWillUnmount() {\n if (this.unsubscribeManifest) {\n this.unsubscribeManifest();\n this.unsubscribeManifest = null;\n }\n }\n\n public render() {\n const { manifest } = this.state;\n const metadata = get(manifest, ['manifest', 'metadata'], null);\n const creationUnixMs =\n get(metadata, 'creationTimestamp') && DateTime.fromISO(metadata.creationTimestamp).toMillis();\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <a className=\"btn btn-link\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </a>\n </div>\n {this.state.loading ? (\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n ) : (\n <div className=\"header-text horizontal middle\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"36px\" width=\"36px\" />\n <h3 className=\"horizontal middle space-between flex-1\">{get(metadata, ['name'], '')}</h3>\n </div>\n )}\n </div>\n {!this.state.loading && (\n <div className=\"content\">\n <CollapsibleSection heading=\"Information\">\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(creationUnixMs)}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={get(manifest, ['account'], '')} />\n </dd>\n <dt>Namespace</dt>\n <dd>{get(metadata, ['namespace'], '')}</dd>\n <dt>Kind</dt>\n <dd>{get(manifest, ['manifest', 'kind'], '')}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection key=\"status\" heading=\"status\" defaultExpanded={true}>\n <ul>\n {get(manifest, ['manifest', 'status', 'conditions'], []).map((condition) => (\n <li key={condition.type + condition.lastTransitionTime} style={{ marginBottom: '10px' }}>\n <ManifestCondition condition={condition} />\n </li>\n ))}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection key=\"events\" heading=\"events\" defaultExpanded={true}>\n <ManifestEvents manifest={manifest} />\n </CollapsibleSection>\n <CollapsibleSection key=\"labels\" heading=\"labels\" defaultExpanded={true}>\n <ManifestLabels manifest={get(manifest, ['manifest'], {})} />\n </CollapsibleSection>\n </div>\n )}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\nimport { KubernetesResourceDetails } from './ResourceDetails';\n\nexport interface IKubernetesResourceStateParams {\n provider: string;\n accountId: string;\n region: string;\n kubernetesResource: string;\n}\n\nexport const KUBERNETES_RESOURCE_STATES = 'spinnaker.core.kubernetesResource.states';\nmodule(KUBERNETES_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const kubernetesResourceDetails: INestedState = {\n name: 'kubernetesResource',\n url: '/manifest/:provider/:accountId/:region/:kubernetesResource',\n views: {\n 'detail@../insight': {\n component: KubernetesResourceDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams.accountId],\n kubernetesResource: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams],\n },\n data: {\n pageTitleDetails: {\n title: 'Generic Kubernetes Resource Details',\n nameParam: 'kubernetesResource',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n history: {\n type: 'kubernetesResource',\n },\n },\n };\n\n applicationStateProvider.addInsightDetailState(kubernetesResourceDetails);\n },\n]);\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport type { Application, IManifest, ISecurityGroupDetail, SecurityGroupReader } from '@spinnaker/core';\nimport { ManifestReader, SECURITY_GROUP_READER, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesSecurityGroup } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface ISecurityGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesSecurityGroupDetailsController implements IController {\n public state = { loading: true };\n public securityGroup: IKubernetesSecurityGroup;\n public manifest: IManifest;\n\n public static $inject = [\n '$uibModal',\n '$state',\n '$scope',\n 'securityGroupReader',\n 'resolvedSecurityGroup',\n 'app',\n '$q',\n ];\n constructor(\n private $uibModal: IModalService,\n private $state: StateService,\n private $scope: IScope,\n private securityGroupReader: SecurityGroupReader,\n resolvedSecurityGroup: ISecurityGroupFromStateParams,\n private app: Application,\n private $q: IQService,\n ) {\n const dataSource = app.getDataSource('securityGroups');\n dataSource\n .ready()\n .then(() => {\n this.extractSecurityGroup(resolvedSecurityGroup);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractSecurityGroup(resolvedSecurityGroup));\n })\n .catch(() => this.autoClose());\n }\n\n public deleteSecurityGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.securityGroup.name,\n namespace: this.securityGroup.region,\n account: this.securityGroup.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editSecurityGroup(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.securityGroup.moniker,\n this.securityGroup.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractSecurityGroup({ accountId, name, region }: ISecurityGroupFromStateParams): void {\n this.$q\n .all([\n this.securityGroupReader.getSecurityGroupDetails(\n this.app,\n accountId,\n 'kubernetes',\n region,\n '', // unused vpc id\n name,\n ),\n ManifestReader.getManifest(accountId, region, name),\n ])\n .then(([securityGroup, manifest]: [ISecurityGroupDetail, IManifest]) => {\n if (!securityGroup) {\n return this.autoClose();\n }\n this.securityGroup = securityGroup as IKubernetesSecurityGroup;\n this.manifest = manifest;\n this.state.loading = false;\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 KUBERNETES_SECURITY_GROUP_DETAILS_CTRL = 'spinnaker.kubernetes.securityGroupDetails.controller';\nmodule(KUBERNETES_SECURITY_GROUP_DETAILS_CTRL, [SECURITY_GROUP_READER]).controller(\n 'kubernetesV2SecurityGroupDetailsCtrl',\n KubernetesSecurityGroupDetailsController,\n);\n","import type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class KubernetesSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\n\nimport type { ISecurityGroup } from '@spinnaker/core';\n\nclass KubernetesV2SecurityGroupTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeSecurityGroup(securityGroup: ISecurityGroup): PromiseLike<ISecurityGroup> {\n return this.$q.resolve(securityGroup);\n }\n}\n\nexport const KUBERNETES_SECURITY_GROUP_TRANSFORMER = 'spinnaker.kubernetes.securityGroupTransformer';\nmodule(KUBERNETES_SECURITY_GROUP_TRANSFORMER, []).service(\n 'kubernetesV2SecurityGroupTransformer',\n KubernetesV2SecurityGroupTransformer,\n);\n","import type { Application, IManifest, ITask } from '@spinnaker/core';\nimport { TaskExecutor } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroup } from '../../interfaces';\n\nexport class ManifestTrafficService {\n public static readonly ENABLE_MANIFEST_OPERATION = 'enableManifest';\n public static readonly DISABLE_MANIFEST_OPERATION = 'disableManifest';\n\n public static enable = (manifest: IManifest, application: Application, reason?: string): PromiseLike<ITask> => {\n return TaskExecutor.executeTask({\n job: [\n {\n account: manifest.account,\n cloudProvider: 'kubernetes',\n location: manifest.location,\n manifestName: manifest.name,\n type: ManifestTrafficService.ENABLE_MANIFEST_OPERATION,\n reason,\n },\n ],\n application,\n description: `Enable Manifest: ${manifest.name}`,\n });\n };\n\n public static disable = (manifest: IManifest, application: Application, reason?: string): PromiseLike<ITask> => {\n return TaskExecutor.executeTask({\n job: [\n {\n account: manifest.account,\n cloudProvider: 'kubernetes',\n location: manifest.location,\n manifestName: manifest.name,\n type: ManifestTrafficService.DISABLE_MANIFEST_OPERATION,\n reason,\n },\n ],\n application,\n description: `Disable Manifest: ${manifest.name}`,\n });\n };\n\n public static canDisableServerGroup = (serverGroup: IKubernetesServerGroup): boolean => {\n return (\n ManifestTrafficService.hasLoadBalancers(serverGroup) &&\n !ManifestTrafficService.isManaged(serverGroup) &&\n !serverGroup.disabled\n );\n };\n\n public static canEnableServerGroup = (serverGroup: IKubernetesServerGroup): boolean => {\n return (\n ManifestTrafficService.hasLoadBalancers(serverGroup) &&\n !ManifestTrafficService.isManaged(serverGroup) &&\n serverGroup.disabled\n );\n };\n\n private static hasLoadBalancers = (serverGroup: IKubernetesServerGroup): boolean => {\n return serverGroup.loadBalancers?.length > 0;\n };\n\n private static isManaged = (serverGroup: IKubernetesServerGroup): boolean => {\n return serverGroup.serverGroupManagers && serverGroup.serverGroupManagers.length > 0;\n };\n}\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport type { Application, IManifest, IOwnerOption, IServerGroup } from '@spinnaker/core';\nimport {\n ClusterTargetBuilder,\n ConfirmationModalService,\n ManifestReader,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n SETTINGS,\n} from '@spinnaker/core';\n\nimport type { IKubernetesServerGroup } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestTrafficService } from '../../manifest/traffic/ManifestTrafficService';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface IServerGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesServerGroupDetailsController implements IController {\n public state = { loading: true };\n public serverGroup: IKubernetesServerGroup;\n public manifest: IManifest;\n public entityTagTargets: IOwnerOption[];\n\n public static $inject = ['serverGroup', 'app', '$uibModal', '$scope', '$state', '$q'];\n constructor(\n serverGroup: IServerGroupFromStateParams,\n public app: Application,\n private $uibModal: IModalService,\n private $scope: IScope,\n private $state: StateService,\n private $q: IQService,\n ) {\n const dataSource = this.app.getDataSource('serverGroups');\n dataSource\n .ready()\n .then(() => {\n this.extractServerGroup(serverGroup);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractServerGroup(serverGroup));\n })\n .catch(() => this.autoClose());\n }\n\n private ownerReferences(): any[] {\n const manifest = this.manifest.manifest;\n if (\n manifest != null &&\n manifest.hasOwnProperty('metadata') &&\n manifest.metadata.hasOwnProperty('ownerReferences') &&\n Array.isArray(manifest.metadata.ownerReferences)\n ) {\n return manifest.metadata.ownerReferences;\n } else {\n return [] as any[];\n }\n }\n\n private ownerIsController(ownerReference: any): boolean {\n return ownerReference.hasOwnProperty('controller') && ownerReference.controller === true;\n }\n\n private lowerCaseFirstLetter(s: string): string {\n return s.charAt(0).toLowerCase() + s.slice(1);\n }\n\n public manifestController(): string {\n const controller = this.ownerReferences().find(this.ownerIsController);\n if (typeof controller === 'undefined') {\n return null;\n } else {\n return this.lowerCaseFirstLetter(controller.kind) + ' ' + controller.name;\n }\n }\n\n public canScaleServerGroup(): boolean {\n return this.serverGroup.kind !== 'DaemonSet' && this.manifestController() === null;\n }\n\n public scaleServerGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/scale/scale.html'),\n controller: 'kubernetesV2ManifestScaleCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroup.name,\n namespace: this.serverGroup.namespace,\n account: this.serverGroup.account,\n },\n currentReplicas: this.manifest.manifest.spec.replicas,\n application: this.app,\n },\n });\n }\n\n public canEditServerGroup(): boolean {\n return this.manifestController() === null;\n }\n\n public editServerGroup(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.serverGroup.moniker,\n this.serverGroup.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n public deleteServerGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroup.name,\n namespace: this.serverGroup.namespace,\n account: this.serverGroup.account,\n },\n manifestController: () => this.manifestController(),\n application: this.app,\n },\n });\n }\n\n public canDisable = () => ManifestTrafficService.canDisableServerGroup(this.serverGroup);\n\n public disableServerGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really disable ${this.manifest.name}?`,\n buttonText: 'Disable',\n askForReason: true,\n submitJustWithReason: true,\n submitMethod: ({ reason }: { reason: string }) => ManifestTrafficService.disable(this.manifest, this.app, reason),\n taskMonitorConfig: {\n application: this.app,\n title: `Disabling ${this.manifest.name}`,\n onTaskComplete: () => this.app.getDataSource('serverGroups').refresh(),\n },\n });\n };\n\n public canEnable = () => ManifestTrafficService.canEnableServerGroup(this.serverGroup);\n\n public enableServerGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really enable ${this.manifest.name}?`,\n buttonText: 'Enable',\n askForReason: true,\n submitJustWithReason: true,\n submitMethod: ({ reason }: { reason: string }) => ManifestTrafficService.enable(this.manifest, this.app, reason),\n taskMonitorConfig: {\n application: this.app,\n title: `Enabling ${this.manifest.name}`,\n onTaskComplete: () => this.app.getDataSource('serverGroups').refresh(),\n },\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 private extractServerGroup({ accountId, name, region }: IServerGroupFromStateParams): void {\n this.$q\n .all([\n ServerGroupReader.getServerGroup(this.app.name, accountId, region, name),\n ManifestReader.getManifest(accountId, region, name),\n ])\n .then(([serverGroupDetails, manifest]: [IServerGroup, IManifest]) => {\n if (!serverGroupDetails) {\n return this.autoClose();\n }\n this.serverGroup = serverGroupDetails as IKubernetesServerGroup;\n this.entityTagTargets = this.configureEntityTagTargets();\n this.manifest = manifest;\n this.state.loading = false;\n });\n }\n\n private configureEntityTagTargets(): IOwnerOption[] {\n return ClusterTargetBuilder.buildClusterTargets(this.serverGroup);\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_DETAILS_CTRL = 'spinnaker.kubernetes.serverGroup.details.controller';\n\nmodule(KUBERNETES_SERVER_GROUP_DETAILS_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'kubernetesV2ServerGroupDetailsCtrl',\n KubernetesServerGroupDetailsController,\n);\n","import type { IController } from 'angular';\nimport { copy, equals, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application, ICapacity, ServerGroupWriter } from '@spinnaker/core';\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\nimport type { IKubernetesServerGroup } from '../../../interfaces';\n\ninterface IResizeCommand {\n capacity: ICapacity;\n reason: string;\n}\n\nclass KubernetesServerGroupResizeController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IResizeCommand;\n public current: ICapacity;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['serverGroup', '$uibModalInstance', 'serverGroupWriter', 'application'];\n constructor(\n public serverGroup: IKubernetesServerGroup,\n private $uibModalInstance: IModalServiceInstance,\n private serverGroupWriter: ServerGroupWriter,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Resizing ${this.serverGroup.name}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.current = this.serverGroup.capacity;\n this.command = {\n capacity: copy(this.current),\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return (\n this.verification.verified && this.command.capacity.desired >= 0 && !equals(this.command.capacity, this.current)\n );\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public resize(): void {\n this.taskMonitor.submit(() => {\n const payload = {\n capacity: this.command.capacity,\n serverGroupName: this.serverGroup.name,\n account: this.serverGroup.account,\n region: this.serverGroup.region,\n interestingHealthProviderNames: ['KubernetesPod'],\n reason: this.command.reason,\n };\n\n return this.serverGroupWriter.resizeServerGroup(this.serverGroup, this.application, payload);\n });\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_RESIZE_CTRL = 'spinnaker.kubernetes.serverGroup.details.resize.controller';\n\nmodule(KUBERNETES_SERVER_GROUP_RESIZE_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'kubernetesV2ServerGroupResizeCtrl',\n KubernetesServerGroupResizeController,\n);\n","import { module } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\nimport type { IKubernetesManifestCommandData } from '../manifest/manifestCommandBuilder.service';\nimport { KubernetesManifestCommandBuilder } from '../manifest/manifestCommandBuilder.service';\n\nexport class KubernetesV2ServerGroupCommandBuilder {\n public buildNewServerGroupCommand(app: Application): PromiseLike<IKubernetesManifestCommandData> {\n return KubernetesManifestCommandBuilder.buildNewManifestCommand(app);\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.kubernetes.serverGroup.commandBuilder.service';\n\nmodule(KUBERNETES_SERVER_GROUP_COMMAND_BUILDER, []).service(\n 'kubernetesV2ServerGroupCommandBuilder',\n KubernetesV2ServerGroupCommandBuilder,\n);\n","import { module } from 'angular';\nimport type { Application } from '@spinnaker/core';\nimport type { IKubernetesServerGroup, IKubernetesServerGroupManager } from '../interfaces';\n\nexport class KubernetesV2ServerGroupTransformer {\n public normalizeServerGroup(\n serverGroup: IKubernetesServerGroup,\n application: Application,\n ): PromiseLike<IKubernetesServerGroup> {\n return application\n .getDataSource('serverGroupManagers')\n .ready()\n .then((sgManagers: IKubernetesServerGroupManager[]) => {\n (serverGroup.serverGroupManagers || []).forEach((managerRef) => {\n const sgManager = sgManagers.find(\n (manager: IKubernetesServerGroupManager) =>\n managerRef.account == manager.account &&\n managerRef.location == manager.region &&\n `${manager.kind} ${managerRef.name}` == manager.name,\n );\n if (sgManager) {\n managerRef.name = sgManager.name;\n }\n });\n return serverGroup;\n });\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_TRANSFORMER = 'spinnaker.kubernetes.serverGroup.transformer.service';\nmodule(KUBERNETES_SERVER_GROUP_TRANSFORMER, []).service(\n 'kubernetesV2ServerGroupTransformer',\n KubernetesV2ServerGroupTransformer,\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 { orderBy } from 'lodash';\n\nimport type {\n Application,\n IManifest,\n IOwnerOption,\n IServerGroupManager,\n IServerGroupManagerStateParams,\n} from '@spinnaker/core';\nimport { ClusterTargetBuilder, ManifestReader, NameUtils, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroupManager } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\nclass KubernetesServerGroupManagerDetailsController implements IController {\n public serverGroupManager: IKubernetesServerGroupManager;\n public state = { loading: true };\n public manifest: IManifest;\n public entityTagTargets: IOwnerOption[];\n\n public static $inject = ['serverGroupManager', '$scope', '$uibModal', 'app', '$state'];\n constructor(\n serverGroupManager: IServerGroupManagerStateParams,\n private $scope: IScope,\n private $uibModal: IModalService,\n public app: Application,\n private $state: StateService,\n ) {\n const dataSource = this.app.getDataSource('serverGroupManagers');\n dataSource\n .ready()\n .then(() => {\n this.extractServerGroupManager(serverGroupManager);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractServerGroupManager(serverGroupManager));\n })\n .catch(() => this.autoClose());\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n }\n\n public pauseRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/pause.html'),\n controller: 'kubernetesV2ManifestPauseRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n },\n });\n }\n\n public resumeRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/resume.html'),\n controller: 'kubernetesV2ManifestResumeRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n },\n });\n }\n\n public canUndoRolloutServerGroupManager(): boolean {\n return (\n this.serverGroupManager && this.serverGroupManager.serverGroups && this.serverGroupManager.serverGroups.length > 0\n );\n }\n\n public undoRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/undo.html'),\n controller: 'kubernetesV2ManifestUndoRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n revisions: () => {\n const [, ...rest] = orderBy(this.serverGroupManager.serverGroups, ['moniker.sequence'], ['desc']);\n return rest.map((serverGroup, index) => ({\n label: `${NameUtils.getSequence(serverGroup.moniker.sequence)}${index > 0 ? '' : ' - previous revision'}`,\n revision: serverGroup.moniker.sequence,\n }));\n },\n application: this.app,\n },\n });\n }\n\n public scaleServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/scale/scale.html'),\n controller: 'kubernetesV2ManifestScaleCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n currentReplicas: this.manifest.manifest.spec.replicas,\n application: this.app,\n },\n });\n }\n\n public editServerGroupManager(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.serverGroupManager.moniker,\n this.serverGroupManager.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n public deleteServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n private extractServerGroupManager({ accountId, region, serverGroupManager }: IServerGroupManagerStateParams): void {\n const serverGroupManagerDetails = this.app\n .getDataSource('serverGroupManagers')\n .data.find(\n (manager: IServerGroupManager) =>\n manager.name === serverGroupManager && manager.region === region && manager.account === accountId,\n );\n\n if (!serverGroupManagerDetails) {\n return this.autoClose();\n }\n\n ManifestReader.getManifest(accountId, region, serverGroupManager).then((manifest: IManifest) => {\n this.manifest = manifest;\n this.serverGroupManager = serverGroupManagerDetails;\n this.entityTagTargets = this.configureEntityTagTargets();\n this.state.loading = false;\n });\n }\n\n private configureEntityTagTargets(): IOwnerOption[] {\n return ClusterTargetBuilder.buildManagerClusterTargets(this.serverGroupManager);\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 KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL =\n 'spinnaker.kubernetes.serverGroupManager.details.controller';\nmodule(KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL, []).controller(\n 'kubernetesV2ServerGroupManagerDetailsCtrl',\n KubernetesServerGroupManagerDetailsController,\n);\n","import { ApplicationNameValidator } from '@spinnaker/core';\n\nexport class KubernetesApplicationNameValidator {\n // general k8s resource restriction: 253 characters - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n // safe bet is 63 characters - (see also RFC 1035 or RFC 1123 - both setting DNS label maximum to 63 chars)\n // for service names: - https://github.com/kubernetes/kubernetes/pull/29523 (until K8s 1.4.0 it was 24 characters https://github.com/kubernetes/kubernetes/issues/12463)\n // or annotations: - https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set\n private static MAX_RESOURCE_NAME_LENGTH = 63;\n\n private static validateSpecialCharacters(name: string, errors: string[]): void {\n const alphanumWithDashPattern = /^([a-zA-Z][a-zA-Z0-9-]*)?$/;\n if (!alphanumWithDashPattern.test(name)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters, digits, or dashes. ' +\n 'No special characters are allowed.',\n );\n }\n }\n\n private static validateLength(name: string, errors: string[]): void {\n if (name.length > KubernetesApplicationNameValidator.MAX_RESOURCE_NAME_LENGTH) {\n errors.push(\n `The maximum length for an application in Kubernetes is ${KubernetesApplicationNameValidator.MAX_RESOURCE_NAME_LENGTH} characters.`,\n );\n }\n }\n\n public validate(name = '') {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (name && name.length) {\n KubernetesApplicationNameValidator.validateSpecialCharacters(name, errors);\n KubernetesApplicationNameValidator.validateLength(name, errors);\n }\n\n return {\n warnings,\n errors,\n };\n }\n}\n\nApplicationNameValidator.registerValidator('kubernetes', new KubernetesApplicationNameValidator());\n","import { module } from 'angular';\n\nimport {\n CloudProviderRegistry,\n SETTINGS,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n YAML_EDITOR_COMPONENT,\n} from '@spinnaker/core';\n\nimport './help/kubernetes.help';\nimport { KUBERNETES_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';\nimport { KUBERNETES_LOAD_BALANCER_DETAILS_CTRL } from './loadBalancer/details/details.controller';\nimport { KUBERNETES_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/transformer';\nimport kubernetesLogo from './logo/kubernetes.logo.svg';\nimport { KUBERNETES_ANNOTATION_CUSTOM_SECTIONS } from './manifest/annotationCustomSections.component';\nimport { KUBERNETES_MANIFEST_ARTIFACT } from './manifest/artifact/artifact.component';\nimport { KUBERNETES_MANIFEST_DELETE_CTRL } from './manifest/delete/delete.controller';\nimport { JSON_EDITOR_COMPONENT } from './manifest/editor/json/jsonEditor.component';\nimport { KUBERNETES_MANIFEST_EVENTS } from './manifest/manifestEvents.component';\nimport { KUBERNETES_MANIFEST_IMAGE_DETAILS } from './manifest/manifestImageDetails.component';\nimport { KUBERNETES_MANIFEST_LABELS } from './manifest/manifestLabels.component';\nimport { KUBERNETES_MANIFEST_QOS } from './manifest/manifestQos.component';\nimport { KUBERNETES_MANIFEST_RESOURCES } from './manifest/manifestResources.component';\nimport { KUBERNETES_ROLLING_RESTART } from './manifest/rollout/RollingRestart';\nimport { KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL } from './manifest/rollout/pause.controller';\nimport { KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL } from './manifest/rollout/resume.controller';\nimport { KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL } from './manifest/rollout/undo.controller';\nimport { KUBERNETES_MANIFEST_SCALE_CTRL } from './manifest/scale/scale.controller';\nimport { KUBERNETES_MANIFEST_SELECTOR } from './manifest/selector/selector.component';\nimport { KUBERNETES_MANIFEST_CONDITION } from './manifest/status/condition.component';\nimport { KUBERNETES_MANIFEST_STATUS } from './manifest/status/status.component';\nimport { ManifestWizard } from './manifest/wizard/ManifestWizard';\nimport './pipelines/stages';\nimport { KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE } from './pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceStage';\nimport { KUBERNETES_SCALE_MANIFEST_STAGE } from './pipelines/stages/scaleManifest/scaleManifestStage';\nimport { KUBERNETES_DISABLE_MANIFEST_STAGE } from './pipelines/stages/traffic/disableManifest.stage';\nimport { KUBERNETES_ENABLE_MANIFEST_STAGE } from './pipelines/stages/traffic/enableManifest.stage';\nimport { KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE } from './pipelines/stages/undoRolloutManifest/undoRolloutManifestStage';\nimport './pipelines/validation/manifestSelector.validator';\nimport { KUBERNETS_RAW_RESOURCE_MODULE } from './rawResource';\nimport { KUBERNETES_RESOURCE_STATES } from './resources/resources.state';\nimport { KUBERNETES_SECURITY_GROUP_DETAILS_CTRL } from './securityGroup/details/details.controller';\nimport { KubernetesSecurityGroupReader } from './securityGroup/securityGroup.reader';\nimport { KUBERNETES_SECURITY_GROUP_TRANSFORMER } from './securityGroup/transformer';\nimport { KUBERNETES_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';\nimport { KUBERNETES_SERVER_GROUP_RESIZE_CTRL } from './serverGroup/details/resize/resize.controller';\nimport { KUBERNETES_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/serverGroupCommandBuilder.service';\nimport { KUBERNETES_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroupTransformer.service';\nimport { KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL } from './serverGroupManager/details/details.controller';\nimport './validation/applicationName.validator';\n\nimport './logo/kubernetes.logo.less';\n\nexport const KUBERNETES_MODULE = 'spinnaker.kubernetes';\n\nconst requires = [\n KUBERNETES_INSTANCE_DETAILS_CTRL,\n KUBERNETES_LOAD_BALANCER_DETAILS_CTRL,\n KUBERNETES_SECURITY_GROUP_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_COMMAND_BUILDER,\n KUBERNETES_SERVER_GROUP_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_TRANSFORMER,\n KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_RESIZE_CTRL,\n KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL,\n KUBERNETES_MANIFEST_DELETE_CTRL,\n KUBERNETES_MANIFEST_SCALE_CTRL,\n KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_STATUS,\n KUBERNETES_MANIFEST_CONDITION,\n KUBERNETES_MANIFEST_ARTIFACT,\n KUBERNETES_LOAD_BALANCER_TRANSFORMER,\n KUBERNETES_SECURITY_GROUP_TRANSFORMER,\n KUBERNETES_SCALE_MANIFEST_STAGE,\n KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE,\n KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE,\n KUBERNETES_MANIFEST_SELECTOR,\n KUBERNETES_MANIFEST_LABELS,\n KUBERNETES_MANIFEST_EVENTS,\n KUBERNETES_MANIFEST_RESOURCES,\n KUBERNETES_MANIFEST_QOS,\n KUBERNETES_ANNOTATION_CUSTOM_SECTIONS,\n KUBERNETES_MANIFEST_IMAGE_DETAILS,\n KUBERNETES_RESOURCE_STATES,\n YAML_EDITOR_COMPONENT,\n JSON_EDITOR_COMPONENT,\n KUBERNETES_ENABLE_MANIFEST_STAGE,\n KUBERNETES_DISABLE_MANIFEST_STAGE,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n KUBERNETES_ROLLING_RESTART,\n];\n\nif (SETTINGS.feature.kubernetesRawResources) {\n requires.push(KUBERNETS_RAW_RESOURCE_MODULE);\n}\n\nmodule(KUBERNETES_MODULE, requires).config(() => {\n CloudProviderRegistry.registerProvider('kubernetes', {\n name: 'Kubernetes',\n adHocInfrastructureWritesEnabled: SETTINGS.kubernetesAdHocInfraWritesEnabled,\n logo: {\n path: kubernetesLogo,\n },\n serverGroup: {\n CloneServerGroupModal: ManifestWizard,\n commandBuilder: 'kubernetesV2ServerGroupCommandBuilder',\n detailsController: 'kubernetesV2ServerGroupDetailsCtrl',\n detailsTemplateUrl: require('./serverGroup/details/details.html'),\n transformer: 'kubernetesV2ServerGroupTransformer',\n },\n serverGroupManager: {\n detailsTemplateUrl: require('./serverGroupManager/details/details.html'),\n detailsController: 'kubernetesV2ServerGroupManagerDetailsCtrl',\n },\n loadBalancer: {\n CreateLoadBalancerModal: ManifestWizard,\n detailsController: 'kubernetesV2LoadBalancerDetailsCtrl',\n detailsTemplateUrl: require('./loadBalancer/details/details.html'),\n transformer: 'kubernetesV2LoadBalancerTransformer',\n },\n securityGroup: {\n reader: KubernetesSecurityGroupReader,\n CreateSecurityGroupModal: ManifestWizard,\n detailsController: 'kubernetesV2SecurityGroupDetailsCtrl',\n detailsTemplateUrl: require('./securityGroup/details/details.html'),\n transformer: 'kubernetesV2SecurityGroupTransformer',\n },\n instance: {\n detailsController: 'kubernetesV2InstanceDetailsCtrl',\n detailsTemplateUrl: require('./instance/details/details.html'),\n },\n unsupportedStageTypes: [\n 'deploy',\n 'destroyServerGroup',\n 'disableCluster',\n 'disableServerGroup',\n 'enableServerGroup',\n 'findImage',\n 'resizeServerGroup',\n 'rollbackCluster',\n 'runJob',\n 'scaleDown',\n 'scaleDownCluster',\n 'shrinkCluster',\n 'upsertLoadBalancers',\n ],\n });\n});\n"],"names":["helpContents","kubernetes.serverGroup.stack","kubernetes.serverGroup.detail","kubernetes.serverGroup.containers","kubernetes.serverGroup.initContainers","kubernetes.serverGroup.terminationGracePeriodSeconds","kubernetes.serverGroup.autoscaling.enabled","kubernetes.serverGroup.autoscaling.min","kubernetes.serverGroup.autoscaling.max","kubernetes.serverGroup.autoscaling.desired","kubernetes.serverGroup.autoscaling.cpuTarget","kubernetes.serverGroup.useSourceCapacity.enabled","kubernetes.serverGroup.deployment.enabled","kubernetes.serverGroup.deployment.strategy","kubernetes.serverGroup.deployment.minReadySeconds","kubernetes.serverGroup.deployment.revisionHistoryLimit","kubernetes.serverGroup.deployment.maxSurge","kubernetes.serverGroup.deployment.maxUnavailable","kubernetes.serverGroup.tolerations.key","kubernetes.serverGroup.tolerations.value","kubernetes.serverGroup.tolerations.operator","kubernetes.serverGroup.tolerations.effect","kubernetes.serverGroup.tolerations.tolerationSeconds","kubernetes.job.parallelism","kubernetes.job.completions","kubernetes.job.deadlineSeconds","kubernetes.containers.image","kubernetes.containers.registry","kubernetes.containers.command","kubernetes.containers.name","kubernetes.containers.pullpolicy","kubernetes.containers.cpu","kubernetes.containers.lifecycle.postStart","kubernetes.containers.lifecycle.preStop","kubernetes.containers.execAction.command","kubernetes.containers.httpGetAction.path","kubernetes.containers.httpGetAction.port","kubernetes.containers.httpGetAction.host","kubernetes.containers.httpGetAction.uriScheme","kubernetes.containers.httpGetAction.httpHeaders","kubernetes.containers.memory","kubernetes.containers.requests","kubernetes.containers.ports.name","kubernetes.containers.ports.containerPort","kubernetes.containers.ports.hostPort","kubernetes.containers.ports.hostIp","kubernetes.containers.ports.protocol","kubernetes.containers.limits","kubernetes.containers.probes.type","kubernetes.containers.probes.initialDelay","kubernetes.containers.probes.timeout","kubernetes.containers.probes.period","kubernetes.containers.probes.successThreshold","kubernetes.containers.probes.failureThreshold","kubernetes.containers.volumemounts.name","kubernetes.containers.volumemounts.mountPath","kubernetes.containers.volumemounts.subPath","kubernetes.namespace","kubernetes.loadBalancer.detail","kubernetes.loadBalancer.stack","kubernetes.service.ports.name","kubernetes.service.ports.port","kubernetes.service.ports.nodePort","kubernetes.service.ports.targetPort","kubernetes.service.ports.protocol","kubernetes.service.type","kubernetes.service.sessionAffinity","kubernetes.service.clusterIp","kubernetes.service.loadBalancerIp","kubernetes.service.externalIps","kubernetes.pod.dnsPolicy","kubernetes.pod.volume","kubernetes.pod.emptydir.medium","kubernetes.pod.volume.persistentvolumeclaim.claim","kubernetes.pod.volume.hostpath.path","kubernetes.pod.volume.secret.secretName","kubernetes.pod.volume.awsElasticBlockStore.volumeId","kubernetes.pod.volume.awsElasticBlockStore.fsType","kubernetes.pod.volume.awsElasticBlockStore.partition","kubernetes.pod.volume.nfs.server","kubernetes.pod.volume.nfs.path","kubernetes.ingress.backend.port","kubernetes.ingress.backend.service","kubernetes.ingress.rules.service","kubernetes.ingress.rules.host","kubernetes.ingress.rules.path","kubernetes.ingress.rules.port","kubernetes.ingress.tls.host","kubernetes.ingress.tls.secret","kubernetes.manifest.account","kubernetes.manifest.cluster","kubernetes.manifest.stackdetail","kubernetes.manifest.delete.gracePeriod","kubernetes.manifest.delete.cascading","kubernetes.manifest.source","kubernetes.manifest.rolloutStrategyOptions","kubernetes.manifest.rolloutStrategy","kubernetes.manifest.expectedArtifact","kubernetes.manifest.requiredArtifactsToBind","kubernetes.manifest.skipExpressionEvaluation","kubernetes.manifest.undoRollout.revisionsBack","kubernetes.manifest.patch.record","kubernetes.manifest.patch.mergeStrategy","kubernetes.runJob.captureSource","kubernetes.runJob.captureSource.containerName","ManifestSource","ManifestSource2","Object","keys","forEach","key","HelpContentsRegistry","register","command","moniker","app","input","cloneDeep","sourceManifest","sourceMoniker","sourceAccount","has","load","metadata","annotations","dataToFetch","accounts","AccountService","getAllAccountDetailsForProvider","artifactAccounts","getArtifactAccounts","$q","all","then","backingData","account","some","a","name","find","length","manifestArtifactAccount","artifactAccountData","cloudProvider","manifest","manifests","Array","isArray","relationships","loadBalancers","securityGroups","versioned","source","TEXT","onAccountSelect","selectedAccount","className","HelpField","id","AccountSelectInput","value","onChange","evt","target","readOnly","provider","React","Component","[object Object]","formik","this","props","values","setFieldValue","ManifestBasicSettings","accountUpdated","rawManifest","concat","filter","x","setState","first","rest","state","dump","e","YamlEditor","handleChange","c","KubernetesManifestCommandBuilder","copyAndCleanCommand","taskMonitor","submit","ManifestWriter","deployManifest","application","buildNewManifestCommand","assign","loaded","TaskMonitor","title","isNew","modalInstance","modalInstanceEmulation","dismissModal","ReactModal","show","_ManifestWizard","dialogClassName","WizardModal","heading","initialValues","loading","closeModal","submitButtonLabel","render","nextIdx","wizard","WizardPage","label","order","innerRef","WizardManifestBasicSettings","ref","ManifestEntry","ManifestWizard","defaultProps","noop","instance","$uibModal","$scope","$state","ready","extractInstance","onRefresh","isDisabled","SETTINGS","kubernetesAdHocInfraWritesEnabled","catch","autoClose","open","templateUrl","controller","controllerAs","resolve","coordinates","namespace","manifestController","builtCommand","instanceFromState","instanceId","retrieveInstance","fetchInstance","consoleOutputInstance","region","zone","humanReadableName","ManifestReader","getManifest","InstanceReader","getInstanceDetails","instanceDetails","instanceManager","flattenDeep","getDataSource","data","map","loadBalancer","serverGroups","dataSource","instances","possibleMatch","recentHistoryExtraData","category","serverGroup","i","addExtraDataToLatest","$$destroyed","params","allowModalToStayOpen","go","location","KubernetesInstanceDetailsController","$inject","module","extractLoadBalancer","accountId","test","KubernetesLoadBalancerDetailsController","KUBERNETES_LOAD_BALANCER_DETAILS_CTRL","type","instanceCounts","buildInstanceCounts","chain","flatten","reduce","acc","camelCase","health","up","down","outOfService","succeeded","failed","unknown","starting","detachedInstances","KubernetesV2LoadBalancerTransformer","service","$sce","$interpolate","get","populateCustomSections","customSections","memo","annotationKey","entry","annotationToEntry","push","sectionTitle","entriesHtmlText","partition","section","isHtml","content","parsed","parseAnnotationKey","resource","includes","replace","trim","sanitizeContent","keyParts","exec","unsanitized","sanitized","DOMPurify","sanitize","ADD_ATTR","trustAsHtml","KubernetesAnnotationCustomSections","kubernetesAnnotationCustomSectionsComponent","bindings","template","component","kubernetesManifestArtifactComponent","artifact","KUBERNETES_MANIFEST_ARTIFACT","kubernetesDeletManifestOptionsFormComponent","options","$uibModalInstance","verified","manifestName","reason","cascading","verification","dismiss","payload","copy","orphanDependants","deleteManifest","KubernetesManifestDeleteController","KUBERNETES_MANIFEST_DELETE_CTRL","raw","obj","JSON","parse","$log","warn","AceEditor","mode","theme","style","width","fontSize","showGutter","cursorStart","showPrintMargin","minLines","maxLines","highlightActiveLine","setOptions","firstLineNumber","tabSize","showLineNumbers","showFoldWidgets","editorProps","$blockScrolling","Infinity","react2angular","withErrorBoundary","JsonEditor","events","firstTimestamp","lastTimestamp","firstEpochMilliseconds","lastEpochMilliseconds","DateTime","fromISO","toMillis","String","count","pillStyle","relativeTime","message","JobManifestPodLogs","podNamesProviders","JobEventBasedPodNameProvider","linkName","ManifestEvents","normalizeImage","image","styleInject","css","insertAt","document","head","getElementsByTagName","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","containers","sortBy","spec","initContainers","hasBothContainerTypes","container","labels","ManifestLabels","href","qosClass","qosStyle","HoverablePopover","description","ManifestQos","metrics","containerToMetricMap","val","containerName","ManifestResources","serverGroupManager","onClick","rollingRestartParameters","confirm","askForReason","header","submitMethod","rollingRestartManifest","taskMonitorConfig","pauseRolloutManifest","KubernetesManifestPauseRolloutController","KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL","resumeRolloutManifest","KubernetesManifestResumeRolloutController","revisions","revision","undoRolloutManifest","KubernetesManifestUndoRolloutController","KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL","kubernetesScaleManifestSettingsFormComponent","settings","currentReplicas","replicas","scaleManifest","KubernetesManifestScaleController","KUBERNETES_MANIFEST_SCALE_CTRL","SelectorMode","SelectorMode2","SelectorModeDataMap","Static","selectorDefaults","cluster","criteria","kind","kinds","labelSelectors","Dynamic","Label","selectors","SearchService","search","q","response","results","result","kubernetesKind","uniqBy","valueOf","LabelKeyOptions","idx","property","onLabelSelectorsChange","ls","_ls","selector","Select","clearable","option","_LabelEditor","convertValueStringToArray","placeholder","join","removeField","colSpan","addField","LabelEditor","split","v","parseSpinnakerName","spinnakerName","handleKindChange","static","setStateAndUpdateStage","dynamic","Subject","cb","loadAccounts","search$","pipe","tap","switchMap","observableFrom","takeUntil","destroy$","subscribe","resources","getSelectedMode","handleNameChange","next","providers","kubernetes","defaults","handleAccountChange","details","namespaces","sort","entries","spinnakerKindMap","spinnakerKind","includeSpinnakerKinds","isExpression","every","ns","selectedNamespace","modeDelegate","selectedName","ManifestKindSearchService","handleModeChange","clusterName","handlers","handler","handles","text","applications","includeServerGroupsWithManagers","isEmpty","AppListExtractor","getClusters","accountAndNamespaceFilter","clusterFilterForCredentialsAndRegion","hasServerGroupManagers","serverGroupManagerFilter","nameToParseKind","kindFilter","getKind","StaticManifestSelectorHandler","DynamicManifestSelectorHandler","LabelManifestSelectorHandler","TargetSelect","NgReact","selectedMode","modes","resourceNames","selectedKinds","KindField","StageConfigField","Creatable","k","promptTextCreator","handleNamespaceChange","htmlFor","handleModeSelect","checked","isLoading","r","ScopeClusterSelector","clusters","getFilteredClusters","model","handleClusterChange","handleCriteriaChange","StageConstants","MANIFEST_CRITERIA_OPTIONS","multi","handleKindsChange","o","handleLabelSelectorsChange","ManifestSelector","condition","transitionTime","lastTransitionTime","status","marginRight","isValid","KUBERNETES_MANIFEST_CONDITION","ManifestCondition","kubernetesManifestStatusComponent","KUBERNETES_MANIFEST_STATUS","SelectorKind","SelectorKind2","onOptionsChange","integerValue","parseInt","gracePeriodSeconds","isNaN","helpKey","onCascadingChange","min","onGracePeriodChange","Number","isInteger","DeleteManifestOptionsForm","stage","stageFieldUpdated","mapCriteriaToLabel","formatLabelSelectors","ANY","EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","EXISTS","NOT_EXISTS","formatted","ManifestCoordinates","manifestNamesByNamespace","names","formatManifestNames","manifestExecutionDetails","stageName","_a","current","context","ExecutionDetailsSection","StageFailureMessage","failureMessage","manifestSelectorValidators","required","field","fieldName","fieldLabel","validate","_pipeline","Registry","pipeline","registerStage","DeleteManifestStageConfig","executionDetailsSections","ExecutionDetailsTasks","accountExtractor","configAccountExtractor","validators","selectedManifest","onManifestSelected","kindLabel","robotToHuman","AccountTag","_ManifestCopier","getState","Modal","onHide","ModalClose","onDismiss","Header","Title","Body","TetheredSelect","valueRenderer","manifestValueRenderer","optionRenderer","manifestOptionRenderer","valueKey","manifestChanged","useManifest","ManifestCopier","s","serverGroupManagers","grouped","groupBy","latest","pop","indexOf","MAX_SAFE_INTEGER","handleCopy","toggle","handleManifestSelected","paddingLeft","index","binding","slice","onChangeBindings","splice","renderSelect","expectedArtifactId","StageArtifactSelector","onArtifactEdited","onChangeBinding","onExpectedArtifactSelected","expectedArtifact","excludedArtifactIds","b","excludedArtifactTypePatterns","ArtifactTypePatterns","FRONT50_PIPELINE_TEMPLATE","onRemoveBinding","createable","selectedAccountDetails","n","componentProps","getNamespaceOptions","toString","strategyRedBlack","rolloutStrategies","providerRestricted","defaultTrafficManagementConfig","enabled","services","enableTraffic","strategy","updatedConfig","config","onConfigChange","Markdown","tag","fetchServices","prevProps","fieldColumns","NamespaceSelector","getServiceOptions","disabled","strategyOptionRenderer","DOCKER_IMAGE","KUBERNETES","MAVEN_FILE","ARTIFACT","capitalize","yamlDocumentsToString","requiredArtifactIds","requiredArtifacts","isTextManifest","overrideNamespace","accountName","CheckboxInput","overrideNamespaceChange","namespaceOverride","RadioButtonInput","getSourceOptions","CopyFromTemplateButton","handleRawManifestChange","StageArtifactSelectorDelegate","manifestArtifact","excludedManifestArtifactTypes","manifestArtifactId","onManifestArtifactEdited","onManifestArtifactSelected","skipExpressionEvaluation","ManifestBindArtifactsSelector","getRequiredArtifacts","onRequiredArtifactsChanged","ManifestDeploymentOptions","trafficManagement","initialStageConfig","fetchAccounts","FormikStageConfig","updateStage","DeployManifestStageForm","STATUS_PILLS","available","stable","paused","statusKey","statusDescription","statusClass","isStable","isUnstableWithMessage","url","loadUrl","kindMap","toLowerCase","stateKey","resourceRegion","reg","getAccountDetails","spinnakerKindFromKubernetesKind","spinnakerKindStateMap","getStateParams","ReactInjector","canOpen","CopyToClipboard","displayText","toolTip","DeployManifestStatusPills","ManifestYaml","manifestText","modalTitle","ManifestDetailsLink","fn","updateManifest","_KubernetesManifestService","apiVersion","scopedKind","parts","BUILT_IN_GROUPS","apiGroup","isCRDGroup","KubernetesManifestService","subscriptions","manifestIds","componentDidUpdate","unsubscribeAll","_prevProps","prevState","m","manifestIdentifier","unsubscribe","subscribeToManifestUpdates","stageManifestToIManifest","stageManifestToManifestParams","updated","findIndex","sub","subscription","artifacts","sectionName","currentSection","uid","ManifestStatus","DeployStatus","DeployManifestStageConfig","ExecutionArtifactTab","producesArtifacts","supportsCustomTimeout","replicaSetManifests","maxVersionHistory","artifactExtractor","ExpectedArtifactService","accumulateArtifacts","artifactRemover","ArtifactReferenceService","removeArtifactFromFields","PatchManifestOptionsForm","record","onRecordChange","onStrategyChange","EMBEDDED_BASE64","patchBody","onManifestSelectorChange","mergeStrategy","PatchManifestStageForm","PatchStatus","PatchManifestStageConfig","credentials","updateStageField","event","consumeArtifactSource","propertyFile","consumeArtifactId","consumeArtifact","consumeArtifactAccount","artifactAccount","initRawManifest","updatePropertyFile","onArtifactSelected","outputSource","logSourceForm","artifactForm","accountChanged","outputOptions","sourceChanged","podsStatuses","p","startTime","deployedName","externalLink","pods","createdPodNames","DefaultPodNameProvider","jobStatus","JobStageExecutionLogs","RunJobExecutionDetails","alias","addAliasToConfig","KubernetesV2RunJobStageConfig","restartable","_validator","_config","$applyAsync","$parent","defaultSelection","KubernetesV2FindArtifactsFromResourceConfigCtrl","STAGE_NAME","defaultOptions","KubernetesV2ScaleManifestConfigCtrl","EXECUTION_ARTIFACT_TAB","ManifestTrafficStageConfig","numRevisionsBack","KubernetesV2UndoRolloutManifestConfigCtrl","PipelineConfigValidator","registerValidator","fetchK8sResources","REST","path","formatK8sResources","_","run","registerDataSource","INFRASTRUCTURE_KEY","sref","primary","icon","iconName","loader","onLoad","providerField","credentialsField","regionField","defaultData","_RawResourceUtils","GLOBAL_LABEL","RawResourceUtils","_FiltersPubSub","intances","subscriber","subscribers","FiltersPubSub","UISrefActive","class","UISref","to","CloudProviderLogo","height","displayName","namespaceDisplayName","onHeaderClick","bind","children","groups","buildGroupByModel","RawResourceGroup","groupTitle","RawResource","resourceKey","getInstance","onFilterChange","filters","rawResources","filterPubSub","localeCompare","opts","FormField","groupByChanged","charAt","toUpperCase","substr","ReactSelectInput","inputClassName","stringOptions","matchFilters","RawResourceGroups","accountMatch","kindMatch","namespaceMatch","displayNamespaces","displayNs","FilterSection","expanded","FilterCheckbox","sortFilterType","onCheckbox","onNsCheckbox","publish","Overridable","buttonText","log","action","editRawResource","$stateParams","unsubscribeManifest","nextProps","props$","creationUnixMs","creationTimestamp","Spinner","size","Dropdown","Toggle","Menu","handleEditClick","deletedRawResource","CollapsibleSection","defaultExpanded","timestamp","conditions","marginBottom","APPLICATION_STATE_PROVIDER","applicationStateProvider","rawResourceDetails","views","detail@../insight","RawResourceDetails","$type","pageTitleDetails","nameParam","accountParam","history","nav","K8sResourcesFilters","master","K8sResources","pageTitleSection","addInsightState","addInsightDetailState","KUBERNETS_RAW_RESOURCE_MODULE","kubernetesResource","kubernetesResourceDetails","KubernetesResourceDetails","regionParam","securityGroupReader","resolvedSecurityGroup","extractSecurityGroup","securityGroup","getSecurityGroupDetails","KubernetesSecurityGroupDetailsController","KUBERNETES_SECURITY_GROUP_DETAILS_CTRL","SECURITY_GROUP_READER","indexedSecurityGroups","securityGroupId","KubernetesV2SecurityGroupTransformer","ManifestTrafficService","ENABLE_MANIFEST_OPERATION","DISABLE_MANIFEST_OPERATION","enable","TaskExecutor","executeTask","job","_ManifestTrafficService","disable","canDisableServerGroup","hasLoadBalancers","isManaged","canEnableServerGroup","submitJustWithReason","onTaskComplete","refresh","extractServerGroup","hasOwnProperty","ownerReferences","ownerReference","ownerIsController","lowerCaseFirstLetter","ServerGroupReader","getServerGroup","serverGroupDetails","entityTagTargets","configureEntityTagTargets","ClusterTargetBuilder","buildClusterTargets","KubernetesServerGroupDetailsController","KUBERNETES_SERVER_GROUP_DETAILS_CTRL","SERVER_GROUP_WRITER","serverGroupWriter","capacity","desired","equals","serverGroupName","interestingHealthProviderNames","resizeServerGroup","KubernetesServerGroupResizeController","KUBERNETES_SERVER_GROUP_RESIZE_CTRL","KUBERNETES_SERVER_GROUP_COMMAND_BUILDER","KubernetesV2ServerGroupCommandBuilder","sgManagers","managerRef","sgManager","manager","KUBERNETES_SERVER_GROUP_TRANSFORMER","KubernetesV2ServerGroupTransformer","extractServerGroupManager","orderBy","NameUtils","getSequence","sequence","serverGroupManagerDetails","buildManagerClusterTargets","KubernetesServerGroupManagerDetailsController","KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL","errors","_KubernetesApplicationNameValidator","MAX_RESOURCE_NAME_LENGTH","validateSpecialCharacters","validateLength","warnings","KubernetesApplicationNameValidator","ApplicationNameValidator","KUBERNETES_MODULE","requires","YAML_EDITOR_COMPONENT","STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT","feature","kubernetesRawResources","registerProvider","adHocInfrastructureWritesEnabled","logo","CloneServerGroupModal","commandBuilder","detailsController","detailsTemplateUrl","transformer","CreateLoadBalancerModal","reader","KubernetesSecurityGroupReader","CreateSecurityGroupModal","unsupportedStageTypes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/help/kubernetes.help.ts","../src/manifest/ManifestSource.ts","../src/manifest/manifestCommandBuilder.service.ts","../src/manifest/wizard/BasicSettings.tsx","../src/manifest/wizard/ManifestEntry.tsx","../src/manifest/wizard/ManifestWizard.tsx","../src/instance/details/details.controller.ts","../src/loadBalancer/details/details.controller.ts","../src/loadBalancer/transformer.ts","../src/manifest/annotationCustomSections.component.ts","../src/manifest/artifact/artifact.component.ts","../src/manifest/delete/deleteOptionsForm.component.ts","../src/manifest/delete/delete.controller.ts","../src/manifest/editor/json/JsonEditor.tsx","../src/manifest/editor/json/jsonEditor.component.ts","../src/pipelines/stages/deployManifest/manifestStatus/ManifestEvents.tsx","../src/manifest/manifestEvents.component.ts","../src/manifest/ManifestImageDetails.tsx","../../../node_modules/style-inject/dist/style-inject.es.js","../src/manifest/manifestImageDetails.component.ts","../src/manifest/ManifestLabels.tsx","../src/manifest/manifestLabels.component.ts","../src/manifest/ManifestQos.tsx","../src/manifest/manifestQos.component.ts","../src/manifest/ManifestResources.tsx","../src/manifest/manifestResources.component.ts","../src/manifest/rollout/RollingRestart.tsx","../src/manifest/rollout/pause.controller.ts","../src/manifest/rollout/resume.controller.ts","../src/manifest/rollout/undo.controller.ts","../src/manifest/scale/scaleSettingsForm.component.ts","../src/manifest/scale/scale.controller.ts","../src/manifest/selector/IManifestSelector.ts","../src/manifest/ManifestKindSearch.tsx","../src/manifest/selector/labelEditor/LabelEditor.tsx","../src/manifest/selector/IManifestLabelSelector.ts","../src/manifest/selector/ManifestSelector.tsx","../src/manifest/selector/selector.component.ts","../src/manifest/status/ManifestCondition.tsx","../src/manifest/status/condition.component.ts","../src/manifest/status/status.component.ts","../src/pipelines/stages/ManifestCoordinates.tsx","../src/pipelines/stages/deleteManifest/DeleteManifestOptionsForm.tsx","../src/pipelines/stages/deleteManifest/DeleteManifestStageConfig.tsx","../src/pipelines/stages/ManifestExecutionDetails.tsx","../src/pipelines/stages/validators/manifestSelectorValidators.ts","../src/pipelines/stages/deleteManifest/deleteManifestStage.ts","../src/pipelines/stages/deployManifest/ManifestCopier.tsx","../src/pipelines/stages/deployManifest/CopyFromTemplateButton.tsx","../src/pipelines/stages/deployManifest/ManifestBindArtifactsSelector.tsx","../src/pipelines/stages/deployManifest/NamespaceSelector.tsx","../src/rolloutStrategy/highlander.strategy.ts","../src/rolloutStrategy/redblack.strategy.ts","../src/rolloutStrategy/index.ts","../src/rolloutStrategy/none.strategy.ts","../src/pipelines/stages/deployManifest/ManifestDeploymentOptions.tsx","../src/pipelines/stages/deployManifest/DeployManifestStageForm.tsx","../src/pipelines/stages/deployManifest/DeployManifestStageConfig.tsx","../src/pipelines/stages/deployManifest/deployManifest.validator.ts","../src/pipelines/stages/deployManifest/manifestStatus/DeployStatusPills.tsx","../src/pipelines/stages/deployManifest/manifestStatus/ManifestDetailsLink.tsx","../src/pipelines/stages/deployManifest/manifestStatus/ManifestStatus.tsx","../src/manifest/manifest.service.ts","../src/pipelines/stages/deployManifest/manifestStatus/DeployStatus.tsx","../src/pipelines/stages/deployManifest/deployManifestStage.ts","../src/pipelines/stages/patchManifest/PatchManifestOptionsForm.tsx","../src/pipelines/stages/patchManifest/PatchManifestStageForm.tsx","../src/pipelines/stages/patchManifest/PatchManifestStageConfig.tsx","../src/pipelines/stages/patchManifest/patchManifestStage.ts","../src/pipelines/stages/runJob/KubernetesV2RunJobStageConfig.tsx","../src/pipelines/stages/runJob/RunJobExecutionDetails.tsx","../src/pipelines/stages/runJob/runJobStage.ts","../src/pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceConfig.controller.ts","../src/pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceStage.ts","../src/pipelines/stages/scaleManifest/scaleManifestConfig.controller.ts","../src/pipelines/stages/scaleManifest/scaleManifestStage.ts","../src/pipelines/stages/traffic/ManifestTrafficStageConfig.tsx","../src/pipelines/stages/traffic/disableManifest.stage.ts","../src/pipelines/stages/traffic/enableManifest.stage.ts","../src/pipelines/stages/undoRolloutManifest/undoRolloutManifestConfig.controller.ts","../src/pipelines/stages/undoRolloutManifest/undoRolloutManifestStage.ts","../src/pipelines/validation/manifestSelector.validator.ts","../src/rawResource/rawResource.dataSource.ts","../src/rawResource/component/RawResourceUtils.ts","../src/rawResource/controller/FiltersPubSub.ts","../src/rawResource/component/group/RawResource.tsx","../src/rawResource/component/group/RawResouceGroup.tsx","../src/rawResource/component/group/RawResourceGroups.tsx","../src/rawResource/component/K8sResources.tsx","../src/rawResource/component/K8sResourcesFilters.tsx","../src/rawResource/component/group/RawResourceDetails.tsx","../src/rawResource/rawResource.states.ts","../src/rawResource/rawResource.module.ts","../src/resources/ResourceDetails.tsx","../src/resources/resources.state.ts","../src/securityGroup/details/details.controller.ts","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/transformer.ts","../src/manifest/traffic/ManifestTrafficService.ts","../src/serverGroup/details/details.controller.ts","../src/serverGroup/details/resize/resize.controller.ts","../src/serverGroup/serverGroupCommandBuilder.service.ts","../src/serverGroup/serverGroupTransformer.service.ts","../src/serverGroupManager/details/details.controller.ts","../src/validation/applicationName.validator.ts","../src/kubernetes.module.ts"],"sourcesContent":["import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'kubernetes.serverGroup.stack':\n '(Optional) One of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'kubernetes.serverGroup.detail':\n '(Optional) A string of free-form alphanumeric characters and hyphens to describe any other variables.',\n 'kubernetes.serverGroup.containers': `\n (Required) Select at least one image to run in this server group (pod).\n If multiple images are selected, they will be colocated and replicated equally.`,\n 'kubernetes.serverGroup.initContainers': `\n (Optional) Select at least one image to run in this server group as an init container (pod).`,\n 'kubernetes.serverGroup.terminationGracePeriodSeconds':\n '(Required) Termination grace period in <b>seconds</b>. You can customize the termination grace period setting (terminationGracePeriodSeconds). Because server groups (pods) represent running processes on nodes in the cluster, it is important to allow those processes to gracefully terminate when they are no longer needed (vs. being violently killed and having no chance to clean up). Default is <b>30</b> seconds.',\n 'kubernetes.serverGroup.autoscaling.enabled':\n 'If selected, a horizontal autoscaler will be attached to this replica set.',\n 'kubernetes.serverGroup.autoscaling.min': 'The smallest number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.max': 'The largest number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.desired': 'The initial number of pods to be deployed.',\n 'kubernetes.serverGroup.autoscaling.cpuTarget': 'The target CPU utilization to be achieved by the autoscaler.',\n 'kubernetes.serverGroup.useSourceCapacity.enabled': 'Use same number of pods as current.',\n 'kubernetes.serverGroup.deployment.enabled': 'Check this box if you want to spawn a deployment for this replica set.',\n 'kubernetes.serverGroup.deployment.strategy': `\n <p><b>RollingUpdate</b> Deploy new pods in groups while killing old ones off.</p>\n <p><b>Recreate</b> Recreate the entire replica set.</p>`,\n 'kubernetes.serverGroup.deployment.minReadySeconds':\n 'The minimum time the deployment object will wait after a pod becomes healthy.',\n 'kubernetes.serverGroup.deployment.revisionHistoryLimit':\n \"(Optional) How many old replica sets to keep around. Leave empty if you don't want any to be deleted.\",\n 'kubernetes.serverGroup.deployment.maxSurge':\n '(Optional) Either a number or a percentage (1 vs. 10%) representing the maximum number of new pods to deploy during a rollout.',\n 'kubernetes.serverGroup.deployment.maxUnavailable':\n '(Optional) Either a number or a percentage (1 vs. 10%) representing the maximum number of pods to destroy during a rollout.',\n 'kubernetes.serverGroup.tolerations.key':\n 'Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys.',\n 'kubernetes.serverGroup.tolerations.value':\n 'Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string.',\n 'kubernetes.serverGroup.tolerations.operator':\n \"Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category.\",\n 'kubernetes.serverGroup.tolerations.effect':\n 'Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute.',\n 'kubernetes.serverGroup.tolerations.tolerationSeconds':\n 'TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system.',\n 'kubernetes.job.parallelism': '(Required) The number of concurrent pods to run.',\n 'kubernetes.job.completions':\n '(Required) The number of sucessful completions required for the job to be considered a success.',\n 'kubernetes.job.deadlineSeconds': '(Optional) The number of seconds until the job is considered a failure.',\n 'kubernetes.containers.image': 'The image selected under Basic Settings whose container is to be configured.',\n 'kubernetes.containers.registry': 'The registry the selected image will be pulled from.',\n 'kubernetes.containers.command': 'The list of commands which to overwrite the docker ENTRYPOINT array.',\n 'kubernetes.containers.name':\n '(Required) The name of the container associated with the above image. Used for resource identification',\n 'kubernetes.containers.pullpolicy': `\n <p>Sets the policy used to determine when to pull (download) the selected container image.</p>\n <p><i><b>Warning</b> - This shouldn't be modified for most production pipelines as it encourages aliasing tags,\n preventing proper rollbacks and determining an image's source.</i></p>\n <p><b>IFNOTPRESENT</b>: (Default) Pulls the image only when it is not present on the host machine.</p>\n <p><b>ALWAYS</b>: Always pulls the image, regardless of if it is present or not.</p>\n <p><b>NEVER</b>: Never pulls the image, regardless of if it is present or not.</p>`,\n 'kubernetes.containers.cpu': `\n (Optional) The relative CPU shares to allocate this container. If set, it is multiplied by 1024, then\n passed to Docker as the --cpu-shares flag. Otherwise the default of 1 (1024) is used`,\n 'kubernetes.containers.lifecycle.postStart': `\n Called immediately after a container is created. If the handler fails, the container is terminated\n and restarted according to its restart policy.`,\n 'kubernetes.containers.lifecycle.preStop': `\n Called immediately before a container is terminated. The container is terminated after the handler completes.\n The reason for termination is passed to the handler. Regardless of the outcome of the handler, the container is eventually terminated.`,\n 'kubernetes.containers.execAction.command': `\n Command to execute inside the container. The working directory for the command is root within the container's filesystem.\n An exit status of 0 is treated as live/healthy; non-zero is unhealthy.`,\n 'kubernetes.containers.httpGetAction.path': 'Path to access on the HTTP server',\n 'kubernetes.containers.httpGetAction.port': 'Number of the port to access on the container.',\n 'kubernetes.containers.httpGetAction.host': 'Host name to connect to, defaults to the pod IP.',\n 'kubernetes.containers.httpGetAction.uriScheme': 'Scheme to use for connecting to the host.',\n 'kubernetes.containers.httpGetAction.httpHeaders': 'Custom headers to set in the request.',\n 'kubernetes.containers.memory': `\n (Optional) The relative memory in megabytes to allocate this container. If set, it is converted to an integer\n and passed to Docker as the --memory flag`,\n 'kubernetes.containers.requests': `\n (Optional) This is used for scheduling. It assures that this container will always be scheduled on a machine ' +\n with at least this much of the resource available.`,\n 'kubernetes.containers.ports.name': '(Optional) A name for this port. Can be found using DNS lookup if specified.',\n 'kubernetes.containers.ports.containerPort': '(Required) The port to expose on this container.',\n 'kubernetes.containers.ports.hostPort':\n '(Optional) The port to expose on <b>Host IP</b>. Most containers do not need this',\n 'kubernetes.containers.ports.hostIp':\n '(Optional) The IP to bind the external port to. Most containers do not need this.',\n 'kubernetes.containers.ports.protocol': '(Required) The protocol for this port.',\n 'kubernetes.containers.limits': '(Optional) This provides a hard limit on this resource for the given container.',\n 'kubernetes.containers.probes.type': `\n <p><b>HTTP</b> Hit the probe at the specified port and path.</p>\n <p><b>EXEC</b> Execute the specified commands on the container.</p>\n <p><b>TCP</b> Connect to the container at the specified port.</p>`,\n 'kubernetes.containers.probes.initialDelay': 'How long to wait after startup before running this probe.',\n 'kubernetes.containers.probes.timeout': 'How long to wait on the result of this probe.',\n 'kubernetes.containers.probes.period': 'How long between probe executions.',\n 'kubernetes.containers.probes.successThreshold':\n 'How many executions need to succeed before the probe is declared healthy.',\n 'kubernetes.containers.probes.failureThreshold':\n 'How many executions need to fail before the probe is declared unhealthy.',\n 'kubernetes.containers.volumemounts.name': 'The <b>Volume Source</b> configured above to claim.',\n 'kubernetes.containers.volumemounts.mountPath': 'The directory to mount the specified <b>Volume Source</b> to.',\n 'kubernetes.containers.volumemounts.subPath':\n 'This will mount the sub path in the referenced volume rather than the root path.',\n 'kubernetes.namespace':\n 'The namespace you have configured with the above selected account. This will often be referred to as <b>Region</b> in Spinnaker.',\n 'kubernetes.loadBalancer.detail':\n '(Optional) A string of free-form alphanumeric characters; by convention, we recommend using \"frontend\".',\n 'kubernetes.loadBalancer.stack':\n '(Optional) One of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.',\n 'kubernetes.service.ports.name': '(Optional) A name for this port. Can be found using DNS lookup if specified.',\n 'kubernetes.service.ports.port': 'The port this service will expose to resources internal to the cluster.',\n 'kubernetes.service.ports.nodePort': `\n (Optional) A port to open on every node in the cluster. This allows you to receive external traffic without\n having to provision a cloud load balancer. <b>Type</b> in <b>Advanced Settings</b> cannot be set to <b>ClusterIP</b> for this to work.`,\n 'kubernetes.service.ports.targetPort':\n '(Optional) The port to forward incoming traffic to for pods associated with this load balancer.',\n 'kubernetes.service.ports.protocol': 'The protocol this port listens to.',\n 'kubernetes.service.type': `\n <b>ClusterIP</b> means this is an internal load balancer only. <b>LoadBalancer</b> provisions a cloud load balancer if possible\n at address <b>Load Balancer IP</b>. <b>NodePort</b> means this load balancer forwards traffic from ports with <b>Node Port</b> specified.`,\n 'kubernetes.service.sessionAffinity': `\n <b>None</b> means incoming connections are not associated with the pods they are routed to. <b>ClientIP</b>\n associates connections with pods by incoming IP address.`,\n 'kubernetes.service.clusterIp': `\n (Optional) If specified, and available, this internal IP address will be the internal endpoint for this load balancer.\n If not specified, one will be assigned.`,\n 'kubernetes.service.loadBalancerIp': `\n If specified, and available, this external IP address will be the external endpoint for this load balancer\n when <b>Type</b> is set to <b>LoadBalancer</b>.`,\n 'kubernetes.service.externalIps': `\n IP addresses for which nodes in the cluster also accept traffic. This is not managed by Kubernetes and the\n responsibility of the user to configure.`,\n 'kubernetes.pod.dnsPolicy': `\n <p>Set DNS policy for containers within the pod.</p>\n <p>Defaults to <b>ClusterFirst</b>.</p>\n <p>To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to <b>ClusterFirstWithHostNet</b>.</p>`,\n 'kubernetes.pod.volume': `\n <p>A storage volume to be mounted and shared by containers in this pod. The lifecycle depends on the volume type selected.</p>\n <p><b>CONFIGMAP</b>: Intended to act as a reference to multiple properties files. Similar to the /etc directory, and the files within, on a Linux computer.</p>\n <p><b>EMPTYDIR</b>: A transient volume tied to the lifecycle of this pod.</p>\n <p><b>HOSTPATH</b>: A directory on the host node. Most pods do not need this.</p>\n <p><b>PERSISTENTVOLUMECLAIM</b>: An already created persistent volume claim to be bound by this pod.</p>\n <p><b>SECRET</b>: An already created kubernetes secret to be mounted in this pod.</p>`,\n 'kubernetes.pod.emptydir.medium': `\n The type of storage medium used by this volume type.\n <p><b>DEFAULT</b>: Depends on the storage mechanism backing this pod's Kubernetes installation.</p>\n <p><b>MEMORY</b>: A tmpfs (RAM-backed filesystem). Very fast, but usage counts against the memory resource limit, and contents are lost on reboot.</p>`,\n 'kubernetes.pod.volume.persistentvolumeclaim.claim': 'The name of the underlying persistent volume claim to request.',\n 'kubernetes.pod.volume.hostpath.path': \"The path on the host node's filesystem to mount.\",\n 'kubernetes.pod.volume.secret.secretName': 'The name of the secret to mount.',\n 'kubernetes.pod.volume.awsElasticBlockStore.volumeId':\n 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume).',\n 'kubernetes.pod.volume.awsElasticBlockStore.fsType':\n 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified.',\n 'kubernetes.pod.volume.awsElasticBlockStore.partition':\n 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as \"1\". Similarly, the volume partition for /dev/sda is \"0\" (or you can leave the property empty).',\n 'kubernetes.pod.volume.nfs.server': 'NFS (Network File System) server to be mount',\n 'kubernetes.pod.volume.nfs.path': 'The path in the NFS to mount',\n 'kubernetes.ingress.backend.port': 'The port for the specified load balancer.',\n 'kubernetes.ingress.backend.service':\n 'The load balancer (service) traffic not matching the below rules will be routed to.',\n 'kubernetes.ingress.rules.service': 'The load balancer (service) traffic matching this rule will be routed to.',\n 'kubernetes.ingress.rules.host':\n 'The fully qualified domain name of a network host. Any traffic routed to this host matches this rule. May not be an IP address, or contain port information.',\n 'kubernetes.ingress.rules.path': 'POSIX regex (IEE Std 1003.1) matched against the path of an incoming request.',\n 'kubernetes.ingress.rules.port': 'The port on the specifed load balancer to route traffic to.',\n 'kubernetes.ingress.tls.host':\n 'The fully qualified domain name of a network host. Any traffic routed to this host can be secured with TLS. May not be an IP address, or contain port information.',\n 'kubernetes.ingress.tls.secret':\n '(Optional) Name of the Kubernetes secret that will be used to secure TLS connections to the {{firewall}}. Note that Spinnaker will not create any secrets, they are assumed to exist.',\n 'kubernetes.manifest.account': `\n <p>A Spinnaker account corresponds to a physical Kubernetes cluster. If you are unsure which account to use, talk to your Spinnaker admin.</p>\n `,\n 'kubernetes.manifest.cluster': `\n <p>A cluster is a grouping of resources (often across multiple versions of a resource) within an application.</p>\n `,\n 'kubernetes.manifest.stackdetail': `\n <p>\n <b>Stack:</b> <i>(Optional)</i> A naming component used to optionally group manifests within Spinnaker. Typically used to create vertical stacks of resources that can be aggregated/filtered later.\n </p>\n <p>\n <b>Detail:</b> <i>(Optional)</i> A naming component used to store free-form text about your manifest, and can be used to aggregate/filter resources later.\n </p>\n `,\n 'kubernetes.manifest.delete.gracePeriod': `\n <p><i>(Optional)</i>The number of seconds given to the resource to terminate gracefully. Overrides what's set on the manifest if applicable.</p>\n `,\n 'kubernetes.manifest.delete.cascading': `\n <p>When set, delete all resources managed by this resource as well (all pods owned by a replica set). When unset, this may orphan resources.</p>\n `,\n 'kubernetes.manifest.source': `\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 'kubernetes.manifest.rolloutStrategyOptions': `\n <p>Allow Spinnaker to associate each ReplicaSet deployed in this stage with one or more Services and manage traffic based on your selected rollout strategy options.</p>\n `,\n 'kubernetes.manifest.rolloutStrategy': `\n <p>The rollout strategy tells Spinnaker what to do with the previous version(s) of the ReplicaSet in the cluster.</p>\n `,\n 'kubernetes.manifest.expectedArtifact':\n 'The artifact that is to be applied to the Kubernetes account for this stage. The artifact should represent a valid Kubernetes manifest.',\n 'kubernetes.manifest.requiredArtifactsToBind':\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-kubernetes-v2/#binding-artifacts-in-manifests\" target=\"_blank\">bound to the deployed manifest.</a>',\n 'kubernetes.manifest.skipExpressionEvaluation':\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 'kubernetes.manifest.undoRollout.revisionsBack': `\n <p>How many revisions to rollback from the current active revision. This is not a hard-coded revision to rollout.</p>\n <p>For example: If you specify \"1\", and this stage executes, the prior revision will be active upon success.</p>\n `,\n 'kubernetes.manifest.patch.record': `Record the applied patch in the <i>kubernetes.io/change-cause</i> annotation. If the annotation already exists, the contents are replaced.`,\n 'kubernetes.manifest.patch.mergeStrategy': `\n <p>The merge strategy to use when patching Kubernetes objects:</p>\n <p><b>strategic</b>: <i>(Default)</i> <a href=\"https://github.com/kubernetes/community/blob/master/contributors/devel/sig-api-machinery/strategic-merge-patch.md\" target=\"_blank\">Kubernetes Strategic merge patch.</a></p>\n <p><b>json</b>: <a href=\"https://tools.ietf.org/html/rfc6902\" target=\"_blank\">JSON Patch, RFC 6902</a></p>\n <p><b>merge</b>: <a href=\"https://tools.ietf.org/html/rfc7386\" target=\"_blank\">JSON Merge Patch, RFC 7386</a></p>\n `,\n 'kubernetes.runJob.captureSource':\n 'Source from which to capture Job output. Captured output will be available in the pipeline context for use in downstream stages.',\n 'kubernetes.runJob.captureSource.containerName': `Use logs from this container to capture output data.`,\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","export enum ManifestSource {\n TEXT = 'text',\n ARTIFACT = 'artifact',\n}\n","import { load } from 'js-yaml';\nimport { cloneDeep, has } from 'lodash';\nimport { $q } from 'ngimport';\n\nimport type { Application, IAccountDetails, IArtifactAccount, IMoniker } from '@spinnaker/core';\nimport { AccountService } from '@spinnaker/core';\n\nimport { ManifestSource } from './ManifestSource';\n\nconst LAST_APPLIED_CONFIGURATION = 'kubectl.kubernetes.io/last-applied-configuration';\n\nexport interface IKubernetesManifestCommandData {\n command: IKubernetesManifestCommand;\n metadata: IKubernetesManifestCommandMetadata;\n}\n\nexport interface IKubernetesManifestCommand {\n account: string;\n cloudProvider: string;\n manifest: any; // deprecated\n manifests: any[];\n relationships: IKubernetesManifestSpinnakerRelationships;\n moniker: IMoniker;\n manifestArtifactId?: string;\n manifestArtifactAccount?: string;\n source: ManifestSource;\n versioned?: boolean;\n}\n\nexport interface IKubernetesManifestCommandMetadata {\n backingData: any;\n}\n\nexport interface IKubernetesManifestSpinnakerRelationships {\n loadBalancers?: string[];\n securityGroups?: string[];\n}\n\nexport class KubernetesManifestCommandBuilder {\n // TODO(lwander) add explanatory error messages\n public static manifestCommandIsValid(command: IKubernetesManifestCommand): 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: IKubernetesManifestCommand): IKubernetesManifestCommand {\n const command = cloneDeep(input);\n return command;\n }\n\n public static buildNewManifestCommand(\n app: Application,\n sourceManifest?: any,\n sourceMoniker?: IMoniker,\n sourceAccount?: string,\n ): PromiseLike<IKubernetesManifestCommandData> {\n if (sourceManifest != null && has(sourceManifest, ['metadata', 'annotations', LAST_APPLIED_CONFIGURATION])) {\n sourceManifest = load(sourceManifest.metadata.annotations[LAST_APPLIED_CONFIGURATION]);\n }\n\n const dataToFetch = {\n accounts: AccountService.getAllAccountDetailsForProvider('kubernetes'),\n artifactAccounts: AccountService.getArtifactAccounts(),\n };\n\n // TODO(dpeach): if no callers of this method are Angular controllers,\n // $q.all may be safely replaced with Promise.all.\n return $q\n .all(dataToFetch)\n .then((backingData: { accounts: IAccountDetails[]; artifactAccounts: IArtifactAccount[] }) => {\n const { accounts, artifactAccounts } = 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\n let manifestArtifactAccount: string = null;\n const [artifactAccountData] = artifactAccounts;\n if (artifactAccountData) {\n manifestArtifactAccount = artifactAccountData.name;\n }\n\n const cloudProvider = 'kubernetes';\n const moniker = sourceMoniker || {\n app: app.name,\n };\n\n const relationships = {\n loadBalancers: [] as string[],\n securityGroups: [] as string[],\n };\n\n const versioned: any = null;\n\n return {\n command: {\n cloudProvider,\n manifest: null,\n manifests: Array.isArray(sourceManifest)\n ? sourceManifest\n : sourceManifest != null\n ? [sourceManifest]\n : null,\n relationships,\n moniker,\n account,\n versioned,\n manifestArtifactAccount,\n source: ManifestSource.TEXT,\n },\n metadata: {\n backingData,\n },\n } as IKubernetesManifestCommandData;\n });\n }\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 { IKubernetesManifestCommandData } 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=\"kubernetes.manifest.account\" />\n </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=\"kubernetes\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport interface IWizardManifestBasicSettingsProps {\n formik: FormikProps<IKubernetesManifestCommandData>;\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 type { FormikProps } from 'formik';\nimport { dump } from 'js-yaml';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { YamlEditor } from '@spinnaker/core';\n\nimport type { IKubernetesManifestCommandData } from '../manifestCommandBuilder.service';\n\nexport interface IManifestBasicSettingsProps {\n app: Application;\n formik: FormikProps<IKubernetesManifestCommandData>;\n}\n\nexport interface IManifestBasicSettingsState {\n rawManifest: string;\n}\n\nexport class ManifestEntry extends React.Component<IManifestBasicSettingsProps, IManifestBasicSettingsState> {\n constructor(props: IManifestBasicSettingsProps) {\n super(props);\n\n const { values } = this.props.formik;\n const [first = null, ...rest] = values.command.manifests || [];\n const manifest = rest && rest.length ? values.command.manifests : first;\n try {\n this.state = {\n rawManifest: manifest ? dump(manifest) : null,\n };\n } catch (e) {\n this.state = { rawManifest: null };\n }\n }\n\n private handleChange = (rawManifest: string, manifest: any) => {\n this.props.formik.setFieldValue(\n 'command.manifests',\n [].concat(manifest).filter((x) => !!x),\n );\n this.setState({ rawManifest });\n };\n\n public render() {\n return <YamlEditor value={this.state.rawManifest} onChange={this.handleChange} />;\n }\n}\n","import React from 'react';\n\nimport type { Application, IModalComponentProps } from '@spinnaker/core';\nimport { ManifestWriter, noop, ReactModal, TaskMonitor, WizardModal, WizardPage } from '@spinnaker/core';\n\nimport { WizardManifestBasicSettings } from './BasicSettings';\nimport { ManifestEntry } from './ManifestEntry';\nimport type { IKubernetesManifestCommandData } from '../manifestCommandBuilder.service';\nimport { KubernetesManifestCommandBuilder } from '../manifestCommandBuilder.service';\n\nexport interface IKubernetesManifestModalProps extends IModalComponentProps {\n title: string;\n application: Application;\n command: IKubernetesManifestCommandData;\n isNew?: boolean;\n}\n\nexport interface IKubernetesManifestModalState {\n command: IKubernetesManifestCommandData;\n loaded: boolean;\n taskMonitor: TaskMonitor;\n}\n\nexport class ManifestWizard extends React.Component<IKubernetesManifestModalProps, IKubernetesManifestModalState> {\n public static defaultProps: Partial<IKubernetesManifestModalProps> = {\n closeModal: noop,\n dismissModal: noop,\n };\n\n public static show(props: IKubernetesManifestModalProps): Promise<IKubernetesManifestCommandData> {\n const modalProps = { dialogClassName: 'wizard-modal modal-lg' };\n return ReactModal.show(ManifestWizard, props, modalProps);\n }\n\n constructor(props: IKubernetesManifestModalProps) {\n super(props);\n if (!props.command) {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(props.application).then((command) => {\n Object.assign(this.state.command, command);\n this.setState({ loaded: true });\n });\n }\n\n this.state = {\n loaded: !!props.command,\n command: props.command || ({} as IKubernetesManifestCommandData),\n taskMonitor: new TaskMonitor({\n application: props.application,\n title: `${this.props.isNew ? 'Deploying' : 'Updating'} your manifest`,\n modalInstance: TaskMonitor.modalInstanceEmulation(() => this.props.dismissModal()),\n }),\n };\n }\n\n private submit = (c: IKubernetesManifestCommandData): void => {\n const command = KubernetesManifestCommandBuilder.copyAndCleanCommand(c.command);\n const submitMethod = () => ManifestWriter.deployManifest(command, this.props.application);\n this.state.taskMonitor.submit(submitMethod);\n };\n\n public render() {\n const { application, dismissModal, isNew } = this.props;\n const { loaded, taskMonitor, command } = this.state;\n\n return (\n <WizardModal<IKubernetesManifestCommandData>\n heading={`${isNew ? 'Deploy' : 'Update'} Manifest`}\n initialValues={command}\n loading={!loaded}\n taskMonitor={taskMonitor}\n dismissModal={dismissModal}\n closeModal={this.submit}\n submitButtonLabel={isNew ? 'Create' : 'Edit'}\n render={({ formik, nextIdx, wizard }) => (\n <>\n <WizardPage\n label=\"Basic Settings\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <WizardManifestBasicSettings ref={innerRef} formik={formik} />}\n />\n\n <WizardPage\n label=\"Manifest\"\n wizard={wizard}\n order={nextIdx()}\n render={({ innerRef }) => <ManifestEntry ref={innerRef} formik={formik} app={application} />}\n />\n </>\n )}\n />\n );\n }\n}\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\nimport { flattenDeep } from 'lodash';\n\nimport type { Application, ILoadBalancer, IManifest } from '@spinnaker/core';\nimport { InstanceReader, ManifestReader, RecentHistoryService, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesInstance } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\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: IKubernetesInstance[];\n}\n\ninterface IConsoleOutputInstance {\n account: string;\n region: string;\n id: string;\n provider: string;\n}\n\ninterface InstanceIdentifier {\n account: string;\n id: string;\n name: string;\n namespace: string;\n}\n\nclass KubernetesInstanceDetailsController implements IController {\n public state = { loading: true };\n public instance: IKubernetesInstance;\n public manifest: IManifest;\n public consoleOutputInstance: IConsoleOutputInstance;\n public environment: string;\n\n public static $inject = ['instance', '$uibModal', '$q', '$scope', 'app', '$state'];\n constructor(\n instance: InstanceFromStateParams,\n private $uibModal: IModalService,\n private $q: IQService,\n private $scope: IScope,\n private app: Application,\n private $state: StateService,\n ) {\n this.app\n .ready()\n .then(() => {\n this.extractInstance(instance);\n this.app.onRefresh(this.$scope, () => this.extractInstance(instance));\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n })\n .catch(() => this.autoClose());\n }\n\n public deleteInstance(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.instance.name,\n namespace: this.instance.namespace,\n account: this.instance.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editInstance(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.instance.moniker,\n this.instance.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractInstance(instanceFromState: InstanceFromStateParams): void {\n const instanceId = this.retrieveInstance(instanceFromState);\n if (!instanceId) {\n return this.autoClose();\n }\n this.$q\n .all([\n this.fetchInstance(instanceId).then((instance: IKubernetesInstance) => {\n this.instance = instance;\n this.consoleOutputInstance = {\n account: instance.account,\n region: instance.zone,\n id: instance.humanReadableName,\n provider: instance.provider,\n };\n }),\n ManifestReader.getManifest(instanceId.account, instanceId.namespace, instanceId.name).then(\n (manifest: IManifest) => {\n this.manifest = manifest;\n },\n ),\n ])\n .then(() => {\n this.state.loading = false;\n });\n }\n\n private fetchInstance(instance: InstanceIdentifier): PromiseLike<IKubernetesInstance> {\n return InstanceReader.getInstanceDetails(instance.account, instance.namespace, instance.name).then(\n (instanceDetails: IKubernetesInstance) => {\n instanceDetails.id = instance.id;\n instanceDetails.name = instance.name;\n instanceDetails.provider = 'kubernetes';\n return instanceDetails;\n },\n );\n }\n\n private retrieveInstance(instanceFromState: InstanceFromStateParams): InstanceIdentifier {\n const instanceLocatorPredicate = (dataSource: InstanceManager) => {\n return dataSource.instances.some((possibleMatch) => possibleMatch.id === instanceFromState.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 if (!instanceManager) {\n return null;\n }\n const recentHistoryExtraData: { [key: string]: string } = {\n region: instanceManager.region,\n account: instanceManager.account,\n };\n\n if (instanceManager.category === 'serverGroup') {\n recentHistoryExtraData.serverGroup = instanceManager.name;\n }\n\n const instance = instanceManager.instances.find((i) => i.id === instanceFromState.instanceId);\n if (!instance) {\n return null;\n }\n\n RecentHistoryService.addExtraDataToLatest('instances', recentHistoryExtraData);\n\n return {\n id: instance.id,\n name: instance.name,\n namespace: instanceManager.region,\n account: instanceManager.account,\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 KUBERNETES_INSTANCE_DETAILS_CTRL = 'spinnaker.kubernetes.instanceDetails.controller';\n\nmodule(KUBERNETES_INSTANCE_DETAILS_CTRL, []).controller(\n 'kubernetesV2InstanceDetailsCtrl',\n KubernetesInstanceDetailsController,\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';\n\nimport type { Application, ILoadBalancer, IManifest } from '@spinnaker/core';\nimport { ManifestReader, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesLoadBalancer } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface ILoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesLoadBalancerDetailsController implements IController {\n public state = { loading: true };\n public manifest: IManifest;\n public loadBalancer: IKubernetesLoadBalancer;\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 const dataSource = this.app.getDataSource('loadBalancers');\n dataSource\n .ready()\n .then(() => {\n this.extractLoadBalancer(loadBalancer);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractLoadBalancer(loadBalancer));\n })\n .catch(() => this.autoClose());\n }\n\n public deleteLoadBalancer(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.loadBalancer.name,\n namespace: this.loadBalancer.namespace,\n account: this.loadBalancer.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editLoadBalancer(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.loadBalancer.moniker,\n this.loadBalancer.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractLoadBalancer({ accountId, name, region }: ILoadBalancerFromStateParams): void {\n const loadBalancer = this.app.getDataSource('loadBalancers').data.find((test: ILoadBalancer) => {\n return test.name === name && test.account === accountId && test.region === region;\n });\n\n if (!loadBalancer) {\n return this.autoClose();\n }\n\n ManifestReader.getManifest(accountId, region, name).then((manifest: IManifest) => {\n this.manifest = manifest;\n this.loadBalancer = loadBalancer;\n this.state.loading = false;\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 KUBERNETES_LOAD_BALANCER_DETAILS_CTRL = 'spinnaker.kubernetes.loadBalancerDetails.controller';\nmodule(KUBERNETES_LOAD_BALANCER_DETAILS_CTRL, []).controller(\n 'kubernetesV2LoadBalancerDetailsCtrl',\n KubernetesLoadBalancerDetailsController,\n);\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\nimport { camelCase, chain } from 'lodash';\n\nimport type { IInstanceCounts, IServerGroup } from '@spinnaker/core';\n\nimport type { IKubernetesLoadBalancer } from '../interfaces';\n\nclass KubernetesV2LoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeLoadBalancer(loadBalancer: IKubernetesLoadBalancer): PromiseLike<IKubernetesLoadBalancer> {\n loadBalancer.provider = loadBalancer.type;\n loadBalancer.instances = [];\n loadBalancer.instanceCounts = this.buildInstanceCounts(loadBalancer.serverGroups);\n (loadBalancer.serverGroups || []).forEach((serverGroup) => {\n serverGroup.cloudProvider = loadBalancer.provider;\n (serverGroup.instances || []).forEach((instance) => {\n instance.cloudProvider = loadBalancer.provider;\n });\n });\n return this.$q.resolve(loadBalancer);\n }\n\n private buildInstanceCounts(serverGroups: IServerGroup[]): IInstanceCounts {\n const instanceCounts = chain(serverGroups)\n .map((serverGroup) => serverGroup.instances)\n .flatten()\n .reduce(\n (acc: IInstanceCounts, instance: any) => {\n acc[camelCase(instance.health.state) as keyof IInstanceCounts]++;\n return acc;\n },\n {\n up: 0,\n down: 0,\n outOfService: 0,\n succeeded: 0,\n failed: 0,\n unknown: 0,\n starting: 0,\n },\n )\n .value();\n\n instanceCounts.outOfService += chain(serverGroups)\n .map((serverGroup) => serverGroup.detachedInstances)\n .flatten()\n .value().length;\n\n return instanceCounts;\n }\n}\n\nexport const KUBERNETES_LOAD_BALANCER_TRANSFORMER = 'spinnaker.kubernetes.loadBalancerTransformer';\nmodule(KUBERNETES_LOAD_BALANCER_TRANSFORMER, []).service(\n 'kubernetesV2LoadBalancerTransformer',\n KubernetesV2LoadBalancerTransformer,\n);\n","import type { IComponentOptions, IController, IInterpolateService, ISCEService } from 'angular';\nimport { module } from 'angular';\nimport DOMPurify from 'dompurify';\nimport { get, partition } from 'lodash';\n\ninterface IAnnotationsMap {\n [key: string]: string;\n}\n\ninterface ICustomSection {\n title: string;\n key: string;\n isHtml: boolean;\n content: string;\n}\n\ninterface ICustomSectionMap {\n [key: string]: ICustomSection[];\n}\n\nclass KubernetesAnnotationCustomSections implements IController {\n private resource: any;\n public manifest: any;\n public customSections: ICustomSectionMap;\n\n public static $inject = ['$sce', '$interpolate'];\n constructor(private $sce: ISCEService, private $interpolate: IInterpolateService) {}\n\n public $onInit() {\n const annotations: IAnnotationsMap = get(this, ['manifest', 'metadata', 'annotations']);\n if (annotations == null) {\n return;\n }\n this.populateCustomSections(annotations);\n }\n\n private populateCustomSections(annotations: IAnnotationsMap) {\n const customSections: ICustomSectionMap = Object.keys(annotations).reduce(\n (memo: ICustomSectionMap, annotationKey: string) => {\n const entry = this.annotationToEntry(annotations[annotationKey], annotationKey);\n if (entry != null && entry.title) {\n memo[entry.title] = memo[entry.title] || [];\n memo[entry.title].push(entry);\n }\n return memo;\n },\n {},\n );\n // Sort section contents such that text entries appear before HTML entries.\n this.customSections = Object.keys(customSections).reduce((memo: ICustomSectionMap, sectionTitle: string) => {\n const entriesHtmlText = partition(customSections[sectionTitle], (section) => section.isHtml);\n memo[sectionTitle] = entriesHtmlText[1].concat(entriesHtmlText[0]);\n return memo;\n }, {});\n }\n\n private annotationToEntry(content: string, annotationKey: string): ICustomSection {\n const parsed = this.parseAnnotationKey(annotationKey);\n if (parsed == null) {\n return null;\n }\n if (this.resource && content.includes('{{')) {\n content = this.$interpolate(content)({ ...this.resource, manifest: this.manifest });\n }\n return {\n title: parsed.title.replace(/-/g, ' ').trim(),\n key: parsed.key.replace(/-/g, ' ').trim(),\n content: parsed.isHtml ? this.sanitizeContent(content) : content,\n isHtml: parsed.isHtml,\n };\n }\n\n private parseAnnotationKey(annotationKey: string): { title: string; key: string; isHtml: boolean } {\n const keyParts = /([^.]+)\\.details\\.(html\\.)?spinnaker\\.io(?:\\/(.*))?/.exec(annotationKey);\n if (keyParts == null || keyParts.length !== 4) {\n return null;\n }\n return {\n title: keyParts[1] || '',\n key: keyParts[3] || '',\n isHtml: !!keyParts[2],\n };\n }\n\n private sanitizeContent(unsanitized: string): any {\n const sanitized = DOMPurify.sanitize(unsanitized, {\n ADD_ATTR: ['target'],\n });\n return this.$sce.trustAsHtml(sanitized);\n }\n}\n\nconst kubernetesAnnotationCustomSectionsComponent: IComponentOptions = {\n bindings: { manifest: '<', resource: '<' },\n controller: ['$sce', '$interpolate', KubernetesAnnotationCustomSections],\n controllerAs: 'ctrl',\n template: `\n <collapsible-section expanded=\"true\" ng-if=\"ctrl.manifest\" ng-repeat=\"(section, entries) in ctrl.customSections\" heading=\"{{ section }}\">\n <div ng-repeat=\"entry in entries\">\n <div ng-if=\"entry.isHtml\" ng-bind-html=\"entry.content\"></div>\n <div ng-if=\"!entry.isHtml\">\n <span ng-if=\"entry.key\" style=\"font-weight:bold\">{{ entry.key }}</span>\n <span>{{ entry.content }}</span>\n </div>\n </div>\n </collapsible-section>\n `,\n};\n\nexport const KUBERNETES_ANNOTATION_CUSTOM_SECTIONS = 'spinnaker.kubernetes.v2.manifest.annotation.custom.sections';\nmodule(KUBERNETES_ANNOTATION_CUSTOM_SECTIONS, []).component(\n 'kubernetesAnnotationCustomSections',\n kubernetesAnnotationCustomSectionsComponent,\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IArtifact } from '@spinnaker/core';\n\nclass KubernetesManifestArtifactCtrl implements IController {\n public artifact: IArtifact;\n}\n\nconst kubernetesManifestArtifactComponent: IComponentOptions = {\n bindings: { artifact: '<' },\n controller: KubernetesManifestArtifactCtrl,\n controllerAs: 'ctrl',\n template: `\n <span>\n <b>{{ctrl.artifact.type}}</b>\n <i>{{ctrl.artifact.reference}}</i>\n </span>\n `,\n};\n\nexport const KUBERNETES_MANIFEST_ARTIFACT = 'spinnaker.kubernetes.v2.manifest.artifact.component';\nmodule(KUBERNETES_MANIFEST_ARTIFACT, []).component('kubernetesManifestArtifact', kubernetesManifestArtifactComponent);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IDeleteOptions } from './delete.controller';\n\nclass KubernetesDeleteManifestOptionsFormCtrl implements IController {\n public options: IDeleteOptions;\n}\n\nconst kubernetesDeletManifestOptionsFormComponent: IComponentOptions = {\n bindings: { options: '=' },\n controller: KubernetesDeleteManifestOptionsFormCtrl,\n controllerAs: 'ctrl',\n template: `\n <div class=\"form-horizontal\">\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Cascading\n <help-field key=\"kubernetes.manifest.delete.cascading\"></help-field>\n </div>\n <div class=\"col-md-3\">\n <div class=\"input-group\">\n <input type=\"checkbox\"\n ng-model=\"ctrl.options.cascading\"/>\n </div>\n </div>\n </div>\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Grace Period\n <help-field key=\"kubernetes.manifest.delete.gracePeriod\"></help-field>\n </div>\n <div class=\"col-md-4\">\n <div class=\"input-group\">\n <input type=\"number\"\n class=\"form-control input-sm highlight-pristine\"\n ng-model=\"ctrl.options.gracePeriodSeconds\"\n min=\"0\"/>\n <span class=\"input-group-addon\">second<span ng-if=\"ctrl.options.gracePeriodSeconds !== 1\">s</span></span>\n </div>\n </div>\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM =\n 'spinnaker.kubernetes.v2.kubernetes.manifest.delete.options.component';\nmodule(KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM, []).component(\n 'kubernetesDeleteManifestOptionsForm',\n kubernetesDeletManifestOptionsFormComponent,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\nimport { KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM } from './deleteOptionsForm.component';\n\nexport interface IDeleteCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n options: IDeleteOptions;\n}\n\nexport interface IDeleteOptions {\n gracePeriodSeconds?: number;\n cascading: boolean;\n}\n\nclass KubernetesManifestDeleteController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IDeleteCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application', 'manifestController'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n public manifestController: string,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Deleting ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n options: {\n cascading: true,\n },\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public delete(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n // cascading is the kubectl term (more familiar) orphanDependants is the k8s server term\n payload.options.orphanDependants = !payload.options.cascading;\n delete payload.options.cascading;\n\n return ManifestWriter.deleteManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_DELETE_CTRL = 'spinnaker.kubernetes.v2.manifest.delete.controller';\n\nmodule(KUBERNETES_MANIFEST_DELETE_CTRL, [KUBERNETES_DELETE_MANIFEST_OPTIONS_FORM]).controller(\n 'kubernetesV2ManifestDeleteCtrl',\n KubernetesManifestDeleteController,\n);\n","import 'brace/mode/json';\nimport 'brace/theme/textmate';\nimport { $log } from 'ngimport';\nimport React from 'react';\nimport AceEditor from 'react-ace';\n\nexport interface IJsonEditorProps {\n value: string;\n onChange(raw: string, obj: any): void;\n}\n\nexport const JSON_EDITOR_TAB_SIZE = 2;\n\nexport class JsonEditor extends React.Component<IJsonEditorProps> {\n private handleChange = (raw: string) => {\n try {\n const obj = JSON.parse(raw);\n this.props.onChange\n ? this.props.onChange(raw, obj)\n : $log.warn('No `onChange` handler provided for JSON editor.');\n } catch (e) {\n this.props.onChange\n ? this.props.onChange(raw, null)\n : $log.warn('No `onChange` handler provided for JSON editor.');\n $log.warn(`Error loading JSON from string ${raw}: `, e);\n }\n };\n\n public render = () => {\n return (\n <AceEditor\n mode=\"json\"\n theme=\"textmate\"\n name=\"json-editor\"\n style={{ width: 'inherit' }}\n onChange={this.handleChange}\n fontSize={12}\n showGutter={true}\n cursorStart={0}\n showPrintMargin={false}\n minLines={50}\n maxLines={100}\n highlightActiveLine={true}\n value={this.props.value || undefined}\n setOptions={{\n firstLineNumber: 1,\n tabSize: JSON_EDITOR_TAB_SIZE,\n showLineNumbers: false,\n showFoldWidgets: false,\n }}\n editorProps={{ $blockScrolling: Infinity }}\n className=\"ace-editor\"\n />\n );\n };\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { JsonEditor } from './JsonEditor';\n\nexport const JSON_EDITOR_COMPONENT = 'spinnaker.kubernetes.jsonEditor.component';\nmodule(JSON_EDITOR_COMPONENT, []).component(\n 'jsonEditor',\n react2angular(withErrorBoundary(JsonEditor, 'jsonEditor'), ['onChange', 'value']),\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 - Kubernetes 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 { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestEvents } from '../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport const KUBERNETES_MANIFEST_EVENTS = 'spinnaker.kubernetes.v2.manifest.events';\nmodule(KUBERNETES_MANIFEST_EVENTS, []).component(\n 'kubernetesManifestEvents',\n react2angular(withErrorBoundary(ManifestEvents, 'kubernetesManifestEvents'), ['manifest']),\n);\n","import { has, sortBy } from 'lodash';\nimport React from 'react';\n\nimport { HelpField } from '@spinnaker/core';\n\nexport interface IContainer {\n name: string;\n image: string;\n}\n\nexport interface IManifestImageDetailsProps {\n manifest: {\n spec: {\n template: {\n spec: {\n containers: IContainer;\n initContainers: IContainer;\n };\n };\n };\n };\n}\n\n// From https://github.com/docker/distribution/blob/master/docs/spec/api.md\n// if an image doesn't have a colon, it doesn't have a tag or digest.\nconst normalizeImage = (image: string): string => {\n if (image && image.includes(':')) {\n return image;\n }\n return `${image}:latest`;\n};\n\nexport const ManifestImageDetails = ({ manifest }: IManifestImageDetailsProps) => {\n if (!has(manifest, 'spec.template.spec')) {\n // Could still be loading the manifest in a parent component.\n return null;\n }\n const containers = sortBy(manifest.spec.template.spec.containers || [], ['image']);\n const initContainers = sortBy(manifest.spec.template.spec.initContainers || [], ['image']);\n const hasBothContainerTypes = containers.length > 0 && initContainers.length > 0;\n if (containers.length === 0 && initContainers.length === 0) {\n // Not sure if this could happen\n return <span>No images.</span>;\n }\n\n return (\n <ul>\n {hasBothContainerTypes && <strong>Containers</strong>}\n {containers.map((container) => (\n <li key={container.image} title={normalizeImage(container.image)} className=\"break-word\">\n {normalizeImage(container.image)}{' '}\n <HelpField content={`This is container <strong>${container.name}</strong>'s image.`} />\n </li>\n ))}\n {hasBothContainerTypes && <strong>Init Containers</strong>}\n {initContainers.map((container) => (\n <li key={container.image} className=\"break-word\" title={normalizeImage(container.image)}>\n {normalizeImage(container.image)}{' '}\n <HelpField content={`This is init container <strong>${container.name}</strong>'s image.`} />\n </li>\n ))}\n </ul>\n );\n};\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestImageDetails } from './ManifestImageDetails';\n\nexport const KUBERNETES_MANIFEST_IMAGE_DETAILS = 'spinnaker.kubernetes.v2.manifestImageDetails.component';\nmodule(KUBERNETES_MANIFEST_IMAGE_DETAILS, []).component(\n 'kubernetesManifestImageDetails',\n react2angular(withErrorBoundary(ManifestImageDetails, 'kubernetesManifestImageDetails'), ['manifest']),\n);\n","import { get, keys } from 'lodash';\nimport React from 'react';\n\nimport './manifestLabels.less';\n\nexport interface IManifestLabelsMap {\n [key: string]: string;\n}\n\nexport interface IManifestLabelsProps {\n manifest?: {\n metadata?: {\n labels?: IManifestLabelsMap;\n };\n };\n}\n\nexport class ManifestLabels extends React.Component<IManifestLabelsProps> {\n public render() {\n const labels: IManifestLabelsMap = get(this.props, ['manifest', 'metadata', 'labels'], {});\n return (\n <div className=\"horizontal wrap\">\n {keys(labels).map((key) => (\n <div key={key} className=\"manifest-label sp-badge info\">\n {key}: {labels[key]}\n </div>\n ))}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestLabels } from './ManifestLabels';\n\nexport const KUBERNETES_MANIFEST_LABELS = 'spinnaker.kubernetes.v2.manifest.labels';\nmodule(KUBERNETES_MANIFEST_LABELS, []).component(\n 'kubernetesManifestLabels',\n react2angular(withErrorBoundary(ManifestLabels, 'kubernetesManifestLabels'), ['manifest']),\n);\n","import { get } from 'lodash';\nimport React from 'react';\n\nimport { HoverablePopover } from '@spinnaker/core';\n\nimport './manifestLabels.less';\n\n// TODO(dpeach) https://github.com/spinnaker/spinnaker/issues/3239\nexport interface IManifestQosProps {\n manifest?: {\n status?: {\n qosClass?: string;\n };\n };\n}\n\nexport class ManifestQos extends React.Component<IManifestQosProps> {\n private qosClass(): string {\n return get(this.props, ['manifest', 'status', 'qosClass'], 'Unknown');\n }\n\n private qosStyle(): string {\n const qosClass = this.qosClass();\n if (qosClass === 'Guaranteed') {\n return 'success';\n } else if (qosClass === 'BestEffort') {\n return 'alert';\n } else {\n return 'warn';\n }\n }\n\n private description = () => {\n return (\n <div>\n <p>There are three QOS (Quality of Service) classes:</p>\n <p>\n <b>Guaranteed</b>: Pods are considered highest-priority, and will only be killed if they exceed their resource\n requests when other containers require their resources.\n </p>\n <p>\n <b>Burstable</b>: Pods have some minimum guaranteed resources and can exceed them, but are more likely to be\n killed than <b>Guaranteed</b> pods.\n </p>\n <p>\n <b>BestEffort</b>: These are the lowest-priority pods, and will be the first to be evicted when resources run\n out.\n </p>\n <p>\n To understand how to set the QOS class of a pod, read{' '}\n <a href=\"https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/\">\n the Kubernetes documentation\n </a>\n .\n </p>\n </div>\n );\n };\n\n public render() {\n const style = `sp-badge ${this.qosStyle()}`;\n return (\n <HoverablePopover Component={this.description} title=\"QOS Class\" className={`ephemeral-popover`}>\n <div className={style}>{this.qosClass()}</div>\n </HoverablePopover>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestQos } from './ManifestQos';\n\nexport const KUBERNETES_MANIFEST_QOS = 'spinnaker.kubernetes.v2.manifest.qos';\nmodule(KUBERNETES_MANIFEST_QOS, []).component(\n 'kubernetesManifestQos',\n react2angular(withErrorBoundary(ManifestQos, 'kubernetesManifestQos'), ['manifest']),\n);\n","import { get } from 'lodash';\nimport React from 'react';\n\nexport interface IManifestResources {\n cpu?: string;\n memory?: string;\n}\n\n// TODO(dpeach) https://github.com/spinnaker/spinnaker/issues/3239\nexport interface IManifestResourceProps {\n manifest?: {\n spec?: {\n containers?: [\n {\n name?: string;\n resources?: {\n limits?: IManifestResources;\n requests?: IManifestResources;\n };\n },\n ];\n };\n status?: {\n qosClass?: string;\n };\n };\n metrics?: [\n {\n containerName?: string;\n metrics?: IPodMetricsMap;\n },\n ];\n}\n\nexport interface IPodMetricsMap {\n [key: string]: string;\n}\n\nexport class ManifestResources extends React.Component<IManifestResourceProps> {\n public render() {\n const containers = get(this.props, ['manifest', 'spec', 'containers'], []);\n const metrics = get(this.props, ['metrics'], []);\n\n if (!metrics) {\n return <div>No metrics reported.</div>;\n }\n const containerToMetricMap = metrics.reduce((acc, val) => {\n acc[val.containerName] = { metrics: val.metrics };\n return acc;\n }, {});\n\n return (\n <div>\n {containers.map((c, i) => (\n <div key={c.name}>\n Resource usage for <b>{c.name}</b>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>CPU</dt>\n <dd>{get(containerToMetricMap, [c.name, 'metrics', 'CPU(cores)'], 'Unknown')}</dd>\n <dt>MEMORY</dt>\n <dd>{get(containerToMetricMap, [c.name, 'metrics', 'MEMORY(bytes)'], 'Unknown')}</dd>\n </dl>\n {i < containers.length - 1 ? <hr /> : ''}\n </div>\n ))}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestResources } from './ManifestResources';\n\nexport const KUBERNETES_MANIFEST_RESOURCES = 'spinnaker.kubernetes.v2.manifest.resources';\nmodule(KUBERNETES_MANIFEST_RESOURCES, []).component(\n 'kubernetesManifestResources',\n react2angular(withErrorBoundary(ManifestResources, 'kubernetesManifestResources'), ['manifest', 'metrics']),\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { react2angular } from 'react2angular';\n\nimport type { Application } from '@spinnaker/core';\nimport { ConfirmationModalService, ManifestWriter, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroupManager } from '../../interfaces';\n\ninterface IRollingRestartProps {\n application: Application;\n serverGroupManager: IKubernetesServerGroupManager;\n}\n\ninterface IRollingRestartParameters {\n account: string;\n cloudProvider: string;\n location: string;\n manifestName: string;\n}\n\nfunction RollingRestart({ application, serverGroupManager }: IRollingRestartProps) {\n function rollingRestart() {\n const rollingRestartParameters: IRollingRestartParameters = {\n account: serverGroupManager.account,\n cloudProvider: 'kubernetes',\n location: serverGroupManager.namespace,\n manifestName: serverGroupManager.name,\n };\n ConfirmationModalService.confirm({\n account: serverGroupManager.account,\n askForReason: true,\n header: `Initiate rolling restart of ${serverGroupManager.name}`,\n submitMethod: () => {\n return ManifestWriter.rollingRestartManifest(rollingRestartParameters, application);\n },\n taskMonitorConfig: {\n application,\n title: `Rolling restart of ${serverGroupManager.name}`,\n },\n });\n }\n return (\n <li>\n <a onClick={rollingRestart}>Rolling Restart</a>\n </li>\n );\n}\n\nexport const KUBERNETES_ROLLING_RESTART = 'spinnaker.kubernetes.v2.rolling.restart';\nmodule(KUBERNETES_ROLLING_RESTART, []).component(\n 'kubernetesRollingRestart',\n react2angular(withErrorBoundary(RollingRestart, 'kubernetesRollingRestart'), ['application', 'serverGroupManager']),\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IPauseRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n}\n\nclass KubernetesManifestPauseRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IPauseRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Pause rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public pauseRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.pauseRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.pauseRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestPauseRolloutCtrl',\n KubernetesManifestPauseRolloutController,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IResumeRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n}\n\nclass KubernetesManifestResumeRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IResumeRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Resume rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public resumeRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.resumeRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.resumeRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestResumeRolloutCtrl',\n KubernetesManifestResumeRolloutController,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\n\ninterface IUndoRolloutCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n revision: number;\n}\n\ninterface IRolloutRevision {\n label: string;\n revision: number;\n}\n\nclass KubernetesManifestUndoRolloutController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IUndoRolloutCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', 'revisions', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n public revisions: IRolloutRevision[],\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Undo rollout of ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n revision: null,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public undoRollout(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.undoRolloutManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL = 'spinnaker.kubernetes.v2.manifest.undoRollout.controller';\n\nmodule(KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL, []).controller(\n 'kubernetesV2ManifestUndoRolloutCtrl',\n KubernetesManifestUndoRolloutController,\n);\n","import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst kubernetesScaleManifestSettingsFormComponent: IComponentOptions = {\n bindings: { settings: '=' },\n controllerAs: 'ctrl',\n template: `\n <div class=\"form-horizontal\">\n <div class=\"form-group form-inline\">\n <div class=\"col-md-3 sm-label-right\">\n Replicas\n </div>\n <div class=\"col-md-4\">\n <input type=\"text\"\n class=\"form-control input-sm highlight-pristine\"\n ng-model=\"ctrl.settings.replicas\"\n min=\"0\"/>\n </div>\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM =\n 'spinnaker.kubernetes.v2.kubernetes.manifest.scale.settingsForm.component';\nmodule(KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM, []).component(\n 'kubernetesScaleManifestSettingsForm',\n kubernetesScaleManifestSettingsFormComponent,\n);\n","import type { IController } from 'angular';\nimport { copy, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application } from '@spinnaker/core';\nimport { ManifestWriter, TaskMonitor } from '@spinnaker/core';\nimport type { IManifestCoordinates } from '../IManifestCoordinates';\nimport { KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM } from './scaleSettingsForm.component';\n\ninterface IScaleCommand {\n manifestName: string;\n location: string;\n account: string;\n reason: string;\n replicas: number;\n}\n\nclass KubernetesManifestScaleController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IScaleCommand;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['coordinates', 'currentReplicas', '$uibModalInstance', 'application'];\n constructor(\n coordinates: IManifestCoordinates,\n currentReplicas: number,\n private $uibModalInstance: IModalServiceInstance,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Scaling ${coordinates.name} in ${coordinates.namespace}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.command = {\n manifestName: coordinates.name,\n location: coordinates.namespace,\n account: coordinates.account,\n reason: null,\n replicas: currentReplicas,\n };\n }\n\n public isValid(): boolean {\n return this.verification.verified;\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public scale(): void {\n this.taskMonitor.submit(() => {\n const payload = copy(this.command) as any;\n payload.cloudProvider = 'kubernetes';\n\n return ManifestWriter.scaleManifest(payload, this.application);\n });\n }\n}\n\nexport const KUBERNETES_MANIFEST_SCALE_CTRL = 'spinnaker.kubernetes.v2.manifest.scale.controller';\n\nmodule(KUBERNETES_MANIFEST_SCALE_CTRL, [KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM]).controller(\n 'kubernetesV2ManifestScaleCtrl',\n KubernetesManifestScaleController,\n);\n","import type { IManifestLabelSelectors } from './IManifestLabelSelector';\n\nexport interface IMultiManifestSelector extends IManifestSelector {\n kinds: string[];\n labelSelectors?: IManifestLabelSelectors;\n}\n\nexport interface IManifestSelector {\n account: string;\n app?: string;\n cluster?: string;\n criteria?: string;\n kind?: string;\n kinds?: string[];\n labelSelectors?: IManifestLabelSelectors;\n location: string;\n manifestName?: string;\n mode?: SelectorMode;\n}\n\nexport enum SelectorMode {\n Static = 'static',\n Dynamic = 'dynamic',\n Label = 'label',\n}\n\ninterface ISelectorModeData {\n label: string;\n selectorDefaults: Partial<IManifestSelector>;\n}\n\nexport const SelectorModeDataMap: { [key in SelectorMode]: ISelectorModeData } = {\n [SelectorMode.Static]: {\n label: 'Choose a static target',\n selectorDefaults: {\n cluster: null,\n criteria: null,\n kind: null,\n kinds: null,\n labelSelectors: null,\n },\n },\n [SelectorMode.Dynamic]: {\n label: 'Choose a target dynamically',\n selectorDefaults: {\n kinds: null,\n labelSelectors: null,\n manifestName: null,\n },\n },\n [SelectorMode.Label]: {\n label: 'Match target(s) by label',\n selectorDefaults: {\n cluster: null,\n criteria: null,\n kind: null,\n kinds: [],\n labelSelectors: {\n selectors: [],\n },\n manifestName: null,\n },\n },\n};\n","import { chain } from 'lodash';\n\nimport { SearchService } from '@spinnaker/core';\n\ninterface IManifestKindSearchResults {\n account: string;\n kubernetesKind: string;\n name: string;\n namespace: string;\n provider: string;\n region: string;\n type: string; // spinnakerKind\n}\n\nexport class ManifestKindSearchService {\n public static search(kind: string, namespace: string, account: string): PromiseLike<IManifestKindSearchResults[]> {\n return SearchService.search<IManifestKindSearchResults>({\n q: namespace,\n type: kind,\n })\n .then((response) =>\n chain(response ? response.results : [])\n .filter(\n (result) => result.namespace === namespace && result.account === account && result.kubernetesKind === kind,\n )\n .uniqBy('name')\n .valueOf(),\n )\n .catch(() => []);\n }\n}\n","import React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport { noop } from '@spinnaker/core';\n\nimport type { IManifestLabelSelector } from '../IManifestLabelSelector';\nimport { LABEL_KINDS } from '../IManifestLabelSelector';\n\nimport './labelEditor.less';\n\nexport interface ILabelEditorProps {\n labelSelectors: IManifestLabelSelector[];\n onLabelSelectorsChange: (labelSelectors: IManifestLabelSelector[]) => void;\n}\n\nconst LabelKeyOptions: Array<Option<string>> = LABEL_KINDS.map((kind) => ({ label: kind, value: kind }));\n\nexport default class LabelEditor extends React.Component<ILabelEditorProps> {\n public static defaultProps: Partial<ILabelEditorProps> = {\n labelSelectors: [],\n onLabelSelectorsChange: noop,\n };\n\n private static convertValueStringToArray = (value: string): string[] => {\n return value.split(',').map((v: string) => v.trim());\n };\n\n private handleChange = (idx: number, property: keyof IManifestLabelSelector, value: string | string[]): void => {\n this.props.onLabelSelectorsChange(\n this.props.labelSelectors.map((ls, i) => {\n if (idx !== i) {\n return ls;\n }\n return {\n ...ls,\n [property]: value,\n };\n }),\n );\n };\n\n private removeField = (idx: number): void => {\n this.props.onLabelSelectorsChange(\n this.props.labelSelectors.filter((_ls, i) => {\n return idx !== i;\n }),\n );\n };\n\n private addField = (): void => {\n return this.props.onLabelSelectorsChange(\n this.props.labelSelectors.concat([\n {\n key: '',\n kind: 'EQUALS',\n values: [],\n },\n ]),\n );\n };\n\n public render() {\n return (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th>Key</th>\n <th>Kind</th>\n <th>Value(s)</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {this.props.labelSelectors.map((selector, idx) => (\n <tr className=\"label-editor-selector-row\" key={idx}>\n <td>\n <input\n className=\"form-control input input-sm label-editor-key-input\"\n type=\"text\"\n value={selector.key}\n onChange={(e: any) => this.handleChange(idx, 'key', e.target.value)}\n />\n </td>\n <td>\n <Select\n className=\"label-editor-kind-select\"\n clearable={false}\n onChange={(option: Option<string>) => this.handleChange(idx, 'kind', option.value)}\n options={LabelKeyOptions}\n value={selector.kind}\n />\n </td>\n <td>\n <input\n className=\"form-control input input-sm label-editor-values-input\"\n onChange={(e: any) =>\n this.handleChange(idx, 'values', LabelEditor.convertValueStringToArray(e.target.value))\n }\n placeholder=\"Comma-separated values\"\n value={selector.values.join(', ')}\n type=\"text\"\n />\n </td>\n <td>\n <button className=\"link label-editor-remove\" onClick={() => this.removeField(idx)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove field</span>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.addField}>\n <span className=\"glyphicon glyphicon-plus-sign\" /> Add Label\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n );\n }\n}\n","export interface IManifestLabelSelector {\n key: string;\n kind: string;\n values: string[];\n}\n\nexport interface IManifestLabelSelectors {\n selectors: IManifestLabelSelector[];\n}\n\nexport const LABEL_KINDS: string[] = [\n 'ANY',\n 'EQUALS',\n 'NOT_EQUALS',\n 'CONTAINS',\n 'NOT_CONTAINS',\n 'EXISTS',\n 'NOT_EXISTS',\n];\n","import { get, isEmpty } from 'lodash';\nimport { $q } from 'ngimport';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { switchMap, takeUntil, tap } from 'rxjs/operators';\n\nimport type { Application, IAccountDetails, IServerGroup } from '@spinnaker/core';\nimport {\n AccountSelectInput,\n AccountService,\n AppListExtractor,\n NgReact,\n noop,\n ScopeClusterSelector,\n SETTINGS,\n StageConfigField,\n StageConstants,\n} from '@spinnaker/core';\n\nimport type { IManifestLabelSelector } from './IManifestLabelSelector';\nimport type { IManifestSelector } from './IManifestSelector';\nimport { SelectorMode, SelectorModeDataMap } from './IManifestSelector';\nimport { ManifestKindSearchService } from '../ManifestKindSearch';\nimport LabelEditor from './labelEditor/LabelEditor';\n\nexport interface IManifestSelectorProps {\n selector: IManifestSelector;\n application?: Application;\n includeSpinnakerKinds?: string[];\n modes?: SelectorMode[];\n onChange(selector: IManifestSelector): void;\n}\n\nexport interface IManifestSelectorState {\n accounts: IAccountDetails[];\n selector: IManifestSelector;\n namespaces: string[];\n kinds: string[];\n resources: string[];\n loading: boolean;\n}\n\ninterface ISelectorHandler {\n handles(mode: SelectorMode): boolean;\n handleModeChange(): void;\n handleKindChange(kind: string): void;\n getKind(): string;\n}\n\nconst parseSpinnakerName = (spinnakerName: string): { name: string; kind: string } => {\n const [kind, name] = (spinnakerName || '').split(' ');\n return { kind, name };\n};\n\nclass StaticManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Static;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n this.handleKindChange(selector.kind);\n Object.assign(selector, SelectorModeDataMap.static.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (kind: string): void => {\n const { selector } = this.component.state;\n const { name } = parseSpinnakerName(selector.manifestName);\n selector.manifestName = kind ? (name ? `${kind} ${name}` : kind) : name;\n };\n\n public getKind = (): string => parseSpinnakerName(this.component.state.selector.manifestName).kind;\n}\n\nclass DynamicManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Dynamic;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n const { kind } = parseSpinnakerName(selector.manifestName);\n selector.kind = kind || null;\n Object.assign(selector, SelectorModeDataMap.dynamic.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (kind: string): void => {\n this.component.state.selector.kind = kind;\n };\n\n public getKind = (): string => this.component.state.selector.kind;\n}\n\nclass LabelManifestSelectorHandler implements ISelectorHandler {\n constructor(private component: ManifestSelector) {}\n\n public handles = (mode: SelectorMode): boolean => mode === SelectorMode.Label;\n\n public handleModeChange = (): void => {\n const { selector } = this.component.state;\n Object.assign(selector, SelectorModeDataMap.label.selectorDefaults);\n this.component.setStateAndUpdateStage({ selector });\n };\n\n public handleKindChange = (): void => {};\n\n public getKind = (): string => null;\n}\n\nexport class ManifestSelector extends React.Component<IManifestSelectorProps, IManifestSelectorState> {\n private search$ = new Subject<{ kind: string; namespace: string; account: string }>();\n private destroy$ = new Subject<void>();\n private handlers: ISelectorHandler[];\n\n constructor(props: IManifestSelectorProps) {\n super(props);\n\n if (!this.props.selector.mode) {\n this.props.selector.mode = SelectorMode.Static;\n this.props.onChange && this.props.onChange(this.props.selector);\n }\n\n this.state = {\n selector: props.selector,\n accounts: [],\n namespaces: [],\n kinds: [],\n resources: [],\n loading: false,\n };\n this.handlers = [\n new StaticManifestSelectorHandler(this),\n new DynamicManifestSelectorHandler(this),\n new LabelManifestSelectorHandler(this),\n ];\n }\n\n public setStateAndUpdateStage = (state: Partial<IManifestSelectorState>, cb?: () => void): void => {\n if (state.selector && this.props.onChange) {\n this.props.onChange(state.selector);\n }\n this.setState(state as IManifestSelectorState, cb || noop);\n };\n\n public componentDidMount = (): void => {\n this.loadAccounts();\n\n this.search$\n .pipe(\n tap(() => this.setStateAndUpdateStage({ loading: true })),\n switchMap(({ kind, namespace, account }) => observableFrom(this.search(kind, namespace, account))),\n takeUntil(this.destroy$),\n )\n .subscribe((resources) => {\n if (this.state.selector.manifestName == null && this.getSelectedMode() === SelectorMode.Static) {\n this.handleNameChange('');\n }\n this.setStateAndUpdateStage({ loading: false, resources: resources, selector: this.state.selector });\n });\n };\n\n public componentWillUnmount = () => this.destroy$.next();\n\n public loadAccounts = (): PromiseLike<void> => {\n return AccountService.getAllAccountDetailsForProvider('kubernetes').then((accounts) => {\n const selector = this.state.selector;\n const kind = parseSpinnakerName(selector.manifestName).kind;\n\n this.setStateAndUpdateStage({ accounts });\n\n if (!selector.account && accounts.length > 0) {\n selector.account = accounts.some((e) => e.name === SETTINGS.providers.kubernetes.defaults.account)\n ? SETTINGS.providers.kubernetes.defaults.account\n : accounts[0].name;\n }\n if (selector.account) {\n this.handleAccountChange(selector.account);\n }\n if (kind) {\n this.search$.next({ kind, namespace: selector.location, account: selector.account });\n }\n });\n };\n\n private handleAccountChange = (selectedAccount: string): void => {\n const details = (this.state.accounts || []).find((account) => account.name === selectedAccount);\n if (!details) {\n return;\n }\n const namespaces = (details.namespaces || []).sort();\n const kinds = Object.entries(details.spinnakerKindMap || {})\n .filter(([, spinnakerKind]) =>\n this.props.includeSpinnakerKinds && this.props.includeSpinnakerKinds.length\n ? this.props.includeSpinnakerKinds.includes(spinnakerKind)\n : true,\n )\n .map(([kind]) => kind)\n .sort();\n\n if (\n !this.isExpression(this.state.selector.location) &&\n namespaces.every((ns) => ns !== this.state.selector.location)\n ) {\n this.state.selector.location = null;\n }\n this.state.selector.account = selectedAccount;\n\n this.search$.next({\n kind: parseSpinnakerName(this.state.selector.manifestName).kind || this.state.selector.kind,\n namespace: this.state.selector.location,\n account: this.state.selector.account,\n });\n this.setStateAndUpdateStage({\n namespaces,\n kinds,\n selector: this.state.selector,\n });\n };\n\n private handleNamespaceChange = (selectedNamespace: Option): void => {\n this.state.selector.location =\n selectedNamespace && selectedNamespace.value ? (selectedNamespace.value as string) : null;\n this.search$.next({\n kind: parseSpinnakerName(this.state.selector.manifestName).kind,\n namespace: this.state.selector.location,\n account: this.state.selector.account,\n });\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleKindChange = (kind: string): void => {\n this.modeDelegate().handleKindChange(kind);\n this.search$.next({ kind: kind, namespace: this.state.selector.location, account: this.state.selector.account });\n };\n\n private handleNameChange = (selectedName: string): void => {\n const { kind } = parseSpinnakerName(this.state.selector.manifestName);\n this.state.selector.manifestName = kind ? `${kind} ${selectedName}` : ` ${selectedName}`;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private isExpression = (value: string): boolean => (typeof value === 'string' ? value.includes('${') : false);\n\n private search = (kind: string, namespace: string, account: string): PromiseLike<string[]> => {\n if (this.isExpression(account)) {\n return $q.resolve([]);\n }\n return ManifestKindSearchService.search(kind, namespace, account).then((results) =>\n results.map((result) => result.name).sort(),\n );\n };\n\n private handleModeSelect = (mode: SelectorMode) => {\n this.state.selector.mode = mode;\n this.setStateAndUpdateStage({ selector: this.state.selector }, () => {\n this.modeDelegate().handleModeChange();\n });\n };\n\n private handleClusterChange = ({ clusterName }: { clusterName: string }) => {\n this.state.selector.cluster = clusterName;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private handleCriteriaChange = (criteria: string) => {\n this.state.selector.criteria = criteria;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleKindsChange = (kinds: string[]): void => {\n this.state.selector.kinds = kinds;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n public handleLabelSelectorsChange = (labelSelectors: IManifestLabelSelector[]): void => {\n this.state.selector.labelSelectors.selectors = labelSelectors;\n this.setStateAndUpdateStage({ selector: this.state.selector });\n };\n\n private modeDelegate = (): ISelectorHandler =>\n this.handlers.find((handler) => handler.handles(this.getSelectedMode()));\n\n private promptTextCreator = (text: string) => `Use custom expression: ${text}`;\n\n private getSelectedMode = (): SelectorMode => this.state.selector.mode || SelectorMode.Static;\n\n private getFilteredClusters = (): string[] => {\n const { application, includeSpinnakerKinds } = this.props;\n const { selector } = this.state;\n const applications = application ? [application] : [];\n // If the only allowlisted Spinnaker kind is `serverGroups`, exclude server groups with `serverGroupManagers`.\n // This is because traffic management stages only allow ReplicaSets.\n const includeServerGroupsWithManagers: boolean =\n isEmpty(includeSpinnakerKinds) || includeSpinnakerKinds.length > 1 || includeSpinnakerKinds[0] !== 'serverGroups';\n const filter = (serverGroup: IServerGroup): boolean => {\n const accountAndNamespaceFilter: boolean = AppListExtractor.clusterFilterForCredentialsAndRegion(\n selector.account,\n selector.location,\n )(serverGroup);\n const hasServerGroupManagers: boolean = get(serverGroup, 'serverGroupManagers.length', 0) > 0;\n const serverGroupManagerFilter: boolean = includeServerGroupsWithManagers || !hasServerGroupManagers;\n const nameToParseKind: string = hasServerGroupManagers ? serverGroup.cluster : serverGroup.name;\n const kindFilter: boolean = parseSpinnakerName(nameToParseKind).kind === this.modeDelegate().getKind();\n return accountAndNamespaceFilter && serverGroupManagerFilter && kindFilter;\n };\n return AppListExtractor.getClusters(applications, filter);\n };\n\n public render() {\n const { TargetSelect } = NgReact;\n const selectedMode = this.getSelectedMode();\n const modes = this.props.modes || [selectedMode];\n const { selector, accounts, kinds, namespaces, resources, loading } = this.state;\n const kind = this.modeDelegate().getKind();\n const name = parseSpinnakerName(selector.manifestName).name;\n const resourceNames = resources.map((resource) => parseSpinnakerName(resource).name);\n const selectedKinds = selector.kinds || [];\n const KindField = (\n <StageConfigField label=\"Kind\">\n <Creatable\n clearable={false}\n value={{ value: kind, label: kind }}\n options={kinds.map((k) => ({ value: k, label: k }))}\n onChange={(option: Option<string>) => this.handleKindChange(option && option.value)}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n );\n\n return (\n <>\n <StageConfigField label=\"Account\">\n <AccountSelectInput\n value={selector.account}\n onChange={(evt: any) => this.handleAccountChange(evt.target.value)}\n accounts={accounts}\n provider=\"'kubernetes'\"\n />\n </StageConfigField>\n <StageConfigField label=\"Namespace\">\n <Creatable\n clearable={false}\n value={{ value: selector.location, label: selector.location }}\n options={namespaces.map((ns) => ({ value: ns, label: ns }))}\n onChange={this.handleNamespaceChange}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n {!modes.includes(SelectorMode.Label) && KindField}\n {modes.length > 1 && (\n <StageConfigField label=\"Selector\">\n {modes.map((mode) => (\n <div className=\"radio\" key={mode}>\n <label htmlFor={mode}>\n <input\n type=\"radio\"\n onChange={() => this.handleModeSelect(mode)}\n checked={selectedMode === mode}\n id={mode}\n />{' '}\n {get(SelectorModeDataMap, [mode, 'label'], '')}\n </label>\n </div>\n ))}\n </StageConfigField>\n )}\n {modes.includes(SelectorMode.Label) && selectedMode !== SelectorMode.Label && KindField}\n {modes.includes(SelectorMode.Static) && selectedMode === SelectorMode.Static && (\n <StageConfigField label=\"Name\">\n <Creatable\n isLoading={loading}\n clearable={false}\n value={{ value: name, label: name }}\n options={resourceNames.map((r) => ({ value: r, label: r }))}\n onChange={(option: Option) => this.handleNameChange(option ? (option.value as string) : '')}\n promptTextCreator={this.promptTextCreator}\n />\n </StageConfigField>\n )}\n {modes.includes(SelectorMode.Dynamic) && selectedMode === SelectorMode.Dynamic && (\n <>\n <StageConfigField label=\"Cluster\">\n <ScopeClusterSelector\n clusters={this.getFilteredClusters()}\n model={selector.cluster}\n onChange={this.handleClusterChange}\n />\n </StageConfigField>\n <StageConfigField label=\"Target\">\n <TargetSelect\n onChange={this.handleCriteriaChange}\n model={{ target: selector.criteria }}\n options={StageConstants.MANIFEST_CRITERIA_OPTIONS}\n />\n </StageConfigField>\n </>\n )}\n {modes.includes(SelectorMode.Label) && selectedMode === SelectorMode.Label && (\n <>\n <StageConfigField label=\"Kinds\">\n <Select\n clearable={false}\n multi={true}\n value={selectedKinds}\n options={kinds.map((k) => ({ value: k, label: k }))}\n onChange={(options: Array<Option<string>>) => this.handleKindsChange(options.map((o) => o.value))}\n />\n </StageConfigField>\n <StageConfigField label=\"Labels\">\n <LabelEditor\n labelSelectors={get(selector, 'labelSelectors.selectors', [])}\n onLabelSelectorsChange={this.handleLabelSelectorsChange}\n />\n </StageConfigField>\n </>\n )}\n </>\n );\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestSelector } from './ManifestSelector';\n\nexport const KUBERNETES_MANIFEST_SELECTOR = 'spinnaker.kubernetes.v2.manifest.selector.component';\nmodule(KUBERNETES_MANIFEST_SELECTOR, []).component(\n 'kubernetesManifestSelector',\n react2angular(withErrorBoundary(ManifestSelector, 'kubernetesManifestSelector'), [\n 'selector',\n 'modes',\n 'application',\n 'onChange',\n ]),\n);\n","import { DateTime } from 'luxon';\nimport React from 'react';\n\nimport { relativeTime } from '@spinnaker/core';\n\nexport interface IKubernetesManifestCondition {\n status: string;\n type: string;\n lastTransitionTime: string;\n message: string;\n}\n\nexport interface IKubernetesManifestConditionProps {\n condition: IKubernetesManifestCondition;\n}\n\nexport class ManifestCondition extends React.Component<IKubernetesManifestConditionProps> {\n public render() {\n const { condition } = this.props;\n const transitionTime = DateTime.fromISO(condition.lastTransitionTime);\n return [\n <span key=\"properties\">\n {condition.status === 'True' && <span style={{ marginRight: '3px' }} className=\"glyphicon glyphicon-Normal\" />}\n {condition.status === 'False' && <span style={{ marginRight: '3px' }} className=\"glyphicon glyphicon-Warn\" />}\n {condition.status === 'Unknown' && <span style={{ marginRight: '3px' }}>?</span>}\n <b style={{ marginRight: '3px' }}>{condition.type}</b>\n <i>{transitionTime.isValid && relativeTime(transitionTime.toMillis())}</i>\n </span>,\n <div key=\"message\">{condition.message}</div>,\n ];\n }\n}\n","import { module } from 'angular';\nimport { react2angular } from 'react2angular';\n\nimport { withErrorBoundary } from '@spinnaker/core';\n\nimport { ManifestCondition } from './ManifestCondition';\n\nexport const KUBERNETES_MANIFEST_CONDITION = 'spinnaker.kubernetes.v2.manifest.condition.component';\nmodule(KUBERNETES_MANIFEST_CONDITION, []).component(\n 'kubernetesManifestCondition',\n react2angular(withErrorBoundary(ManifestCondition, 'kubernetesManifestCondition'), ['condition']),\n);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\n\nimport type { IManifestStatus } from '@spinnaker/core';\n\nclass KubernetesManifestStatusCtrl implements IController {\n public status: IManifestStatus;\n}\n\nconst kubernetesManifestStatusComponent: IComponentOptions = {\n bindings: { status: '<' },\n controller: KubernetesManifestStatusCtrl,\n controllerAs: 'ctrl',\n template: `\n <div ng-if=\"!ctrl.status\" class=\"horizontal middle center spinner-section\">\n <loading-spinner size=\"'small'\"></loading-spinner>\n </div>\n <div ng-if=\"ctrl.status\">\n <div class=\"band band-warning\" ng-if=\"!ctrl.status.available.state\"\n uib-tooltip=\"{{ctrl.status.available.message}}\">\n Not Fully Available\n </div>\n <div class=\"band band-active\" ng-if=\"!ctrl.status.stable.state\"\n uib-tooltip=\"{{ctrl.status.stable.message}}\">\n Transitioning\n </div>\n <div class=\"band band-info\" ng-if=\"ctrl.status.paused.state\"\n uib-tooltip=\"{{ctrl.status.paused.message}}\">\n Rollout Paused\n </div>\n </div>\n `,\n};\n\nexport const KUBERNETES_MANIFEST_STATUS = 'spinnaker.kubernetes.v2.kubernetes.manifest.status.component';\nmodule(KUBERNETES_MANIFEST_STATUS, []).component('kubernetesManifestStatus', kubernetesManifestStatusComponent);\n","import { flatten, get } from 'lodash';\nimport React from 'react';\n\nimport { StageConstants } from '@spinnaker/core';\n\nexport interface IManifestCoordinateProps {\n account: string;\n manifestName: string;\n location: string;\n cluster: string;\n criteria: string;\n labelSelectors: ILabelSelectors;\n manifestNamesByNamespace: IManifestNamesByNamespace;\n}\n\nexport interface IManifestNamesByNamespace {\n [namespace: string]: string[];\n}\n\nexport interface ILabelSelectors {\n selectors: Array<{\n key?: string;\n kind: SelectorKind;\n values?: string[];\n }>;\n}\n\nexport enum SelectorKind {\n ANY = 'ANY',\n EQUALS = 'EQUALS',\n NOT_EQUALS = 'NOT_EQUALS',\n CONTAINS = 'CONTAINS',\n NOT_CONTAINS = 'NOT_CONTAINS',\n EXISTS = 'EXISTS',\n NOT_EXISTS = 'NOT_EXISTS',\n}\n\nconst mapCriteriaToLabel = (criteria: string): string =>\n get(\n StageConstants.MANIFEST_CRITERIA_OPTIONS.find((option) => option.val === criteria),\n 'label',\n );\n\nexport const formatLabelSelectors = (labelSelectors: ILabelSelectors): string => {\n return (labelSelectors.selectors || [])\n .map((selector) => {\n const { key, kind, values = [] } = selector;\n switch (kind) {\n case SelectorKind.ANY:\n return null;\n case SelectorKind.EQUALS:\n return `${key} = ${values[0]}`;\n case SelectorKind.NOT_EQUALS:\n return `${key} != ${values[0]}`;\n case SelectorKind.CONTAINS:\n return `${key} in (${values.join(', ')})`;\n case SelectorKind.NOT_CONTAINS:\n return `${key} notin (${values.join(', ')})`;\n case SelectorKind.EXISTS:\n return `${key}`;\n case SelectorKind.NOT_EXISTS:\n return `!${key}`;\n default:\n return null;\n }\n })\n .filter((formatted) => !!formatted)\n .join(', ');\n};\n\nconst formatManifestNames = (manifestName: string, manifestNamesByNamespace: IManifestNamesByNamespace) => {\n if (manifestName) {\n return (\n <>\n <dt>Manifest</dt>\n <dd>{manifestName}</dd>\n </>\n );\n } else if (manifestNamesByNamespace) {\n const names = flatten(Object.values(manifestNamesByNamespace));\n return (\n <>\n <dt>\n Manifest\n {names.length > 1 ? 's' : ''}\n </dt>\n <dd>{names.join(', ')}</dd>\n </>\n );\n } else {\n return null;\n }\n};\n\nexport const ManifestCoordinates = ({\n account,\n manifestName,\n location,\n cluster,\n criteria,\n labelSelectors,\n manifestNamesByNamespace,\n}: IManifestCoordinateProps) => {\n return (\n <>\n <dt>Account</dt>\n <dd>{account}</dd>\n {formatManifestNames(manifestName, manifestNamesByNamespace)}\n <dt>Namespace</dt>\n <dd>{location}</dd>\n {mapCriteriaToLabel(criteria) != null && cluster != null && (\n <>\n <dt>Target</dt>\n <dd>{`${mapCriteriaToLabel(criteria)} in cluster ${cluster}`}</dd>\n </>\n )}\n {labelSelectors != null && !!formatLabelSelectors(labelSelectors) && (\n <>\n <dt>\n Selector\n {(labelSelectors.selectors || []).length > 1 ? 's' : ''}\n </dt>\n <dd>{formatLabelSelectors(labelSelectors)}</dd>\n </>\n )}\n </>\n );\n};\n","import React from 'react';\n\nimport { noop, StageConfigField } from '@spinnaker/core';\n\nimport type { IDeleteOptions } from '../../../manifest/delete/delete.controller';\n\nimport './deleteManifestOptionsForm.less';\n\nexport interface IDeleteManifestOptionsFormProps {\n onOptionsChange: (options: IDeleteOptions) => void;\n options: IDeleteOptions;\n}\n\nexport interface IDeleteManifestOptionsFormState {\n options: IDeleteOptions;\n}\n\nexport default class DeleteManifestOptionsForm extends React.Component<\n IDeleteManifestOptionsFormProps,\n IDeleteManifestOptionsFormState\n> {\n public static defaultProps: Partial<IDeleteManifestOptionsFormProps> = {\n onOptionsChange: noop,\n options: {\n cascading: true,\n gracePeriodSeconds: null,\n },\n };\n\n public constructor(props: IDeleteManifestOptionsFormProps) {\n super(props);\n this.state = {\n options: props.options,\n };\n }\n\n private setStateAndUpdateStage = (options: IDeleteOptions) => {\n this.props.onOptionsChange(options);\n this.setState({ options });\n };\n\n private onCascadingChange = (e: any): void => {\n this.setStateAndUpdateStage({\n ...this.state.options,\n cascading: e.target.checked,\n });\n };\n\n private onGracePeriodChange = (e: any): void => {\n const integerValue = parseInt(e.target.value, 10);\n const gracePeriodSeconds = !isNaN(integerValue) ? integerValue : null;\n this.setStateAndUpdateStage({\n ...this.state.options,\n gracePeriodSeconds,\n });\n };\n\n public render() {\n const {\n options: { cascading, gracePeriodSeconds },\n } = this.state;\n return (\n <>\n <StageConfigField helpKey=\"kubernetes.manifest.delete.cascading\" label=\"Cascading\">\n <div className=\"checkbox\">\n <input\n checked={cascading}\n className=\"delete-manifest-options-input-cascading\"\n onChange={this.onCascadingChange}\n type=\"checkbox\"\n />\n </div>\n </StageConfigField>\n <StageConfigField helpKey=\"kubernetes.manifest.delete.gracePeriod\" label=\"Grace Period\">\n <input\n className=\"form-control input-sm delete-manifest-options-input-grace-period\"\n min=\"0\"\n onChange={this.onGracePeriodChange}\n type=\"number\"\n value={Number.isInteger(gracePeriodSeconds) ? gracePeriodSeconds : ''}\n />\n <span className=\"form-control-static\">{gracePeriodSeconds === 1 ? 'second' : 'seconds'}</span>\n </StageConfigField>\n </>\n );\n }\n}\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { Application, IStage, IStageConfigProps } from '@spinnaker/core';\n\nimport DeleteManifestOptionsForm from './DeleteManifestOptionsForm';\nimport type { IDeleteOptions } from '../../../manifest/delete/delete.controller';\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\nexport interface IKubernetesManifestStageConfigProps extends IStageConfigProps {\n application: Application;\n stage: IManifestSelector & IStage;\n stageFieldUpdated: () => void;\n}\n\nexport class DeleteManifestStageConfig extends React.Component<IKubernetesManifestStageConfigProps> {\n public componentDidMount = (): void => {\n defaults(this.props.stage, {\n app: this.props.application.name,\n cloudProvider: 'kubernetes',\n });\n if (this.props.stage.isNew) {\n this.props.stage.options = {\n gracePeriodSeconds: null,\n cascading: true,\n };\n }\n this.props.stageFieldUpdated();\n };\n\n private onChange = (stage: IManifestSelector): void => {\n Object.assign(this.props.stage, stage);\n this.props.stageFieldUpdated();\n };\n\n private onOptionsChange = (options: IDeleteOptions): void => {\n this.props.stage.options = options;\n this.props.stageFieldUpdated();\n };\n\n public render() {\n const selector = { ...this.props.stage };\n return (\n <div className=\"form-horizontal\">\n <h4>Manifest</h4>\n <div className=\"horizontal-rule\" />\n <ManifestSelector\n application={this.props.application}\n selector={selector}\n modes={[SelectorMode.Static, SelectorMode.Dynamic, SelectorMode.Label]}\n onChange={this.onChange}\n includeSpinnakerKinds={null}\n />\n <h4>Settings</h4>\n <div className=\"horizontal-rule\" />\n <DeleteManifestOptionsForm onOptionsChange={this.onOptionsChange} options={this.props.stage.options} />\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { IExecutionDetailsSectionProps } from '@spinnaker/core';\nimport { ExecutionDetailsSection, StageFailureMessage } from '@spinnaker/core';\n\nimport type { ILabelSelectors, IManifestNamesByNamespace } from './ManifestCoordinates';\nimport { ManifestCoordinates } from './ManifestCoordinates';\n\ninterface IManifestExecutionDetailsProps extends IExecutionDetailsSectionProps {\n context: {\n account: string;\n manifestName: string;\n location: string;\n cluster: string;\n criteria: string;\n labelSelectors: ILabelSelectors;\n manifestNamesByNamespace: IManifestNamesByNamespace;\n };\n}\n\nexport const manifestExecutionDetails = (stageName: string) => {\n return class ManifestExecutionDetails extends React.Component<IManifestExecutionDetailsProps> {\n public static title = stageName;\n\n public render() {\n const { stage, current, name } = this.props;\n const {\n account,\n manifestName,\n location,\n cluster,\n criteria,\n labelSelectors,\n manifestNamesByNamespace,\n } = stage.context;\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <div className=\"row\">\n <div className=\"col-md-9\">\n <dl className=\"dl-narrow dl-horizontal\">\n <ManifestCoordinates\n account={account}\n manifestName={manifestName}\n location={location}\n cluster={cluster}\n criteria={criteria}\n labelSelectors={labelSelectors}\n manifestNamesByNamespace={manifestNamesByNamespace}\n />\n </dl>\n </div>\n </div>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n </ExecutionDetailsSection>\n );\n }\n };\n};\n","import type { ICustomValidator, IPipeline, IStage, IValidatorConfig } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\n\nexport const manifestSelectorValidators = (stageName: string): IValidatorConfig[] => {\n const required = (field: string) => `<strong>${field}</strong> is a required field for ${stageName} stages.`;\n\n return [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n {\n type: 'custom',\n validate: (_pipeline: IPipeline, stage: IManifestSelector & IStage) => {\n if (stage.mode === SelectorMode.Dynamic) {\n if (!stage.kind) {\n return required('Kind');\n }\n if (!stage.cluster) {\n return required('Cluster');\n }\n if (!stage.criteria) {\n return required('Target');\n }\n } else if (stage.mode === SelectorMode.Static) {\n const [kind] = (stage.manifestName || '').split(' ');\n if (!kind) {\n return required('Kind');\n }\n const [, name] = (stage.manifestName || '').split(' ');\n if (!name) {\n return required('Name');\n }\n } else if (stage.mode === SelectorMode.Label) {\n if (!stage.kinds) {\n return required('Kinds');\n }\n }\n return null;\n },\n } as ICustomValidator,\n ];\n};\n","import type { IStage } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { DeleteManifestStageConfig } from './DeleteManifestStageConfig';\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Delete (Manifest)';\nconst STAGE_KEY = 'deleteManifest';\n\nRegistry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Destroy a Kubernetes object created from a manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: DeleteManifestStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n});\n","import { groupBy, sortBy } from 'lodash';\nimport React from 'react';\nimport { Modal } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport type {\n Application,\n ILoadBalancer,\n IManifest,\n ISecurityGroup,\n IServerGroup,\n IServerGroupManager,\n} from '@spinnaker/core';\nimport { AccountTag, ManifestReader, ModalClose, noop, robotToHuman, TetheredSelect } from '@spinnaker/core';\n\nexport interface IManifestCopierProps {\n application: Application;\n cloudProvider: string;\n show: boolean;\n onDismiss: () => void;\n onManifestSelected: (manifest: IManifest) => void;\n}\n\nexport interface IManifestCopierState {\n selectedManifest: IManifestOption;\n manifests: IManifestOption[];\n}\n\nexport interface IManifestOption {\n account: string;\n location: string;\n name: string;\n kind: string;\n data: any;\n key: string;\n}\n\nconst LAST_APPLIED_CONFIGURATION = 'kubectl.kubernetes.io/last-applied-configuration';\n\n/*\n * A modal that allows a user to copy a running Kubernetes resource.\n **/\nexport class ManifestCopier extends React.Component<IManifestCopierProps, IManifestCopierState> {\n private destroy$ = new Subject();\n\n public static getState = (props: IManifestCopierProps) => {\n let manifests: IManifestOption[] = [];\n\n const serverGroups: IServerGroup[] = props.application.getDataSource('serverGroups').data.filter(\n (s: IServerGroup) =>\n s.cloudProvider === props.cloudProvider &&\n s.category === 'serverGroup' &&\n // Don't include managed server groups - just the manager (see below).\n !(s.serverGroupManagers || []).length,\n );\n\n const grouped = groupBy(serverGroups, (serverGroup) =>\n [serverGroup.cluster, serverGroup.account, serverGroup.region].join(':'),\n );\n\n Object.keys(grouped).forEach((key) => {\n // Only include the most recent server group in a cluster (e.g., if v001 and v002 exist, only include v002).\n const latest = sortBy(grouped[key], 'name').pop();\n const [kind, name] = latest.name.split(' ');\n manifests.push({\n account: latest.account,\n location: latest.region,\n name: name,\n kind: kind,\n data: latest,\n key: [latest.account, latest.region, latest.name].join(':'),\n });\n });\n\n const serverGroupManagers: IServerGroupManager[] = props.application.getDataSource('serverGroupManagers').data;\n const loadBalancers: ILoadBalancer[] = props.application.getDataSource('loadBalancers').data;\n const firewalls: ISecurityGroup[] = props.application.getDataSource('securityGroups').data;\n\n [...serverGroupManagers, ...loadBalancers, ...firewalls]\n .filter(\n (manifest: IServerGroupManager | ILoadBalancer | ISecurityGroup) =>\n manifest.cloudProvider === props.cloudProvider,\n )\n .forEach((manifest: IServerGroupManager | ILoadBalancer | ISecurityGroup) => {\n const [kind, name] = manifest.name.split(' ');\n manifests.push({\n account: manifest.account,\n location: manifest.region,\n name,\n kind,\n data: manifest,\n key: [manifest.account, manifest.region, manifest.name].join(':'),\n });\n });\n\n manifests = sortBy(\n manifests,\n (manifest) => {\n // TODO(dpeach): Could load an account here, then use the spinnakerKind -> kubernetesKind map to\n // construct a more maintainable ordering.\n const order = [\n // server group manager\n 'deployment',\n // server group\n 'replicaSet',\n 'statefulSet',\n 'daemonSet',\n 'jobs',\n 'cronJob',\n // load balancer\n 'service',\n 'ingress',\n // firewall\n 'networkPolicy',\n ];\n return order.includes(manifest.kind) ? order.indexOf(manifest.kind) : Number.MAX_SAFE_INTEGER;\n },\n ['kind', 'name', 'location'],\n );\n\n return {\n selectedManifest: manifests.length ? manifests[0] : null,\n manifests,\n };\n };\n\n constructor(props: IManifestCopierProps) {\n super(props);\n this.state = ManifestCopier.getState(props);\n }\n\n public useManifest = (): void => {\n const {\n data: { account, region, name },\n } = this.state.selectedManifest;\n observableFrom(ManifestReader.getManifest(account, region, name))\n .pipe(takeUntil(this.destroy$))\n .subscribe((manifest: IManifest) => {\n this.props.onManifestSelected(JSON.parse(manifest.manifest.metadata.annotations[LAST_APPLIED_CONFIGURATION]));\n });\n };\n\n public manifestChanged = (option: Option) => {\n this.setState({ selectedManifest: option as IManifestOption });\n };\n\n public componentWillUnmount() {\n this.destroy$.next();\n }\n\n public render() {\n const { selectedManifest, manifests } = this.state;\n\n return (\n <Modal show={this.props.show} onHide={noop}>\n <ModalClose dismiss={this.props.onDismiss} />\n <div>\n <Modal.Header>\n <Modal.Title>Copy Manifest</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <form className=\"form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-4 col-md-offset-1 sm-label-left\">\n <b>Copy manifest from</b>\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-10 col-md-offset-1\">\n <TetheredSelect\n value={selectedManifest ? selectedManifest.key : null}\n placeholder=\"Select...\"\n valueRenderer={this.manifestValueRenderer}\n optionRenderer={this.manifestOptionRenderer}\n options={manifests}\n valueKey=\"key\"\n onChange={this.manifestChanged}\n clearable={false}\n />\n </div>\n </div>\n </form>\n </Modal.Body>\n <div className=\"modal-footer\">\n {selectedManifest && (\n <button className=\"btn btn-primary\" onClick={this.useManifest}>\n <span>Use this manifest</span>\n <span className=\"glyphicon glyphicon-chevron-right\" />\n </button>\n )}\n {!selectedManifest && (\n <button className=\"btn\" onClick={this.props.onDismiss}>\n <span>Cancel</span>\n </button>\n )}\n </div>\n </div>\n </Modal>\n );\n }\n\n private manifestValueRenderer = (option: Option) => {\n const kindLabel = robotToHuman(option.kind).trim();\n return (\n <span>\n <AccountTag account={option.account} />\n {option.data && <span> {option.name}</span>} ({kindLabel} in {option.location})\n </span>\n );\n };\n\n private manifestOptionRenderer = (option: Option) => {\n const kindLabel = robotToHuman(option.kind).trim();\n return (\n <h5>\n <AccountTag account={option.account} /> {option.name} ({kindLabel} in {option.location})\n </h5>\n );\n };\n}\n","import React from 'react';\n\nimport type { Application, IManifest } from '@spinnaker/core';\n\nimport { ManifestCopier } from './ManifestCopier';\n\nexport interface ICopyFromTemplateProps {\n application: Application;\n handleCopy(manifest: IManifest): void;\n}\n\nexport interface ICopyFromTemplateState {\n show: boolean;\n}\n\nexport class CopyFromTemplateButton extends React.Component<ICopyFromTemplateProps, ICopyFromTemplateState> {\n constructor(props: ICopyFromTemplateProps) {\n super(props);\n this.state = { show: false };\n }\n\n private toggle = () => this.setState({ show: !this.state.show });\n\n private handleManifestSelected = (manifest: IManifest) => {\n this.props.handleCopy(manifest);\n this.toggle();\n };\n\n public render() {\n return (\n <>\n <ManifestCopier\n show={this.state.show}\n application={this.props.application}\n cloudProvider=\"kubernetes\"\n onDismiss={this.toggle}\n onManifestSelected={this.handleManifestSelected}\n />\n <button className=\"link\" onClick={this.toggle} style={{ paddingLeft: 0 }}>\n Copy from running infrastructure\n </button>\n </>\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","import { find, get, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\n\nimport type { IAccountDetails } from '@spinnaker/core';\n\nexport interface INamespaceSelectorProps {\n onChange: (namespace: string) => void;\n accounts: IAccountDetails[];\n selectedAccount: string;\n selectedNamespace: string;\n createable?: boolean;\n}\n\nexport class NamespaceSelector extends React.Component<INamespaceSelectorProps> {\n public defaultProps = { createable: false };\n\n private getNamespaceOptions(): Array<Option<string>> {\n const { accounts, selectedAccount, selectedNamespace } = this.props;\n const selectedAccountDetails = find(accounts, (a) => a.name === selectedAccount);\n const namespaces = get(selectedAccountDetails, 'namespaces', []);\n const options = map(namespaces, (n) => ({ label: n, value: n }));\n // only create a value for selectedNamespace if it contains a SPeL expression\n if (this.props.createable && selectedNamespace.includes('${')) {\n options.push({ label: selectedNamespace, value: selectedNamespace });\n }\n return options;\n }\n\n public render() {\n const componentProps = {\n clearable: false,\n options: this.getNamespaceOptions(),\n value: this.props.selectedNamespace,\n onChange: (option: Option) => this.props.onChange(option.value.toString()),\n };\n return this.props.createable ? <Creatable {...componentProps} /> : <Select {...componentProps} />;\n }\n}\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyHighlander: IDeploymentStrategy = {\n label: 'Highlander',\n description: 'Destroys <i>all</i> previous ReplicaSets in the cluster as soon as the new ReplicaSet is ready',\n key: 'highlander',\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 { strategyHighlander } from './highlander.strategy';\nimport { strategyNone } from './none.strategy';\nimport { strategyRedBlack } from './redblack.strategy';\n\nexport const rolloutStrategies = [strategyNone, strategyRedBlack, strategyHighlander];\n","import type { IDeploymentStrategy } from '@spinnaker/core';\n\nexport const strategyNone: IDeploymentStrategy = {\n label: 'None',\n description: 'Creates the new ReplicaSet with no impact on existing ReplicaSets in the cluster',\n key: null,\n providerRestricted: false,\n};\n","import { cloneDeep, map, set, split } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select, { Creatable } from 'react-select';\n\nimport type { IAccountDetails, IDeploymentStrategy } from '@spinnaker/core';\nimport { Markdown, StageConfigField } from '@spinnaker/core';\n\nimport { NamespaceSelector } from './NamespaceSelector';\nimport { ManifestKindSearchService } from '../../../manifest/ManifestKindSearch';\nimport { rolloutStrategies } from '../../../rolloutStrategy';\n\nexport interface ITrafficManagementConfig {\n enabled: boolean;\n options: ITrafficManagementOptions;\n}\n\nexport interface ITrafficManagementOptions {\n namespace: string;\n services: string[];\n enableTraffic: boolean;\n strategy: string;\n}\n\nexport const defaultTrafficManagementConfig: ITrafficManagementConfig = {\n enabled: false,\n options: {\n namespace: null,\n services: [],\n enableTraffic: false,\n strategy: null,\n },\n};\n\nexport interface IManifestDeploymentOptionsProps {\n accounts: IAccountDetails[];\n config: ITrafficManagementConfig;\n onConfigChange: (config: ITrafficManagementConfig) => void;\n selectedAccount: string;\n}\n\nexport interface IManifestDeploymentOptionsState {\n services: string[];\n}\n\nexport class ManifestDeploymentOptions extends React.Component<\n IManifestDeploymentOptionsProps,\n IManifestDeploymentOptionsState\n> {\n public state: IManifestDeploymentOptionsState = { services: [] };\n\n private onConfigChange = (key: string, value: any): void => {\n const updatedConfig = cloneDeep(this.props.config);\n set(updatedConfig, key, value);\n this.props.onConfigChange(updatedConfig);\n };\n\n private fetchServices = (): void => {\n const namespace = this.props.config.options.namespace;\n const account = this.props.selectedAccount;\n if (!namespace || !account) {\n this.setState({\n services: [],\n });\n }\n ManifestKindSearchService.search('service', namespace, account).then((services) => {\n this.setState({ services: map(services, 'name') });\n });\n };\n\n private getServiceOptions = (): Array<Option<string>> => {\n const options = this.state.services.map((service) => ({ label: split(service, ' ')[1], value: service }));\n (this.props.config.options.services || []).forEach((service) => {\n if (!this.state.services.includes(service)) {\n options.push({ label: service, value: service });\n }\n });\n return options;\n };\n\n private strategyOptionRenderer = (option: IDeploymentStrategy) => {\n return (\n <div className=\"body-regular\">\n <strong>\n <Markdown tag=\"span\" message={option.label} />\n </strong>\n <div>\n <Markdown tag=\"span\" message={option.description} />\n </div>\n </div>\n );\n };\n\n public componentDidMount() {\n this.fetchServices();\n }\n\n public componentDidUpdate(prevProps: IManifestDeploymentOptionsProps) {\n if (prevProps.selectedAccount !== this.props.selectedAccount) {\n this.onConfigChange('options.namespace', null);\n }\n\n if (prevProps.config.options.namespace !== this.props.config.options.namespace) {\n this.onConfigChange('options.services', null);\n this.fetchServices();\n }\n\n if (!this.props.config.options.enableTraffic && !!this.props.config.options.strategy) {\n this.onConfigChange('options.enableTraffic', true);\n }\n }\n\n public render() {\n const { config } = this.props;\n return (\n <>\n <h4>Rollout Strategy Options</h4>\n <StageConfigField helpKey=\"kubernetes.manifest.rolloutStrategyOptions\" fieldColumns={8} label=\"Enable\">\n <div className=\"checkbox\">\n <label>\n <input\n checked={config.enabled}\n onChange={(e) => this.onConfigChange('enabled', e.target.checked)}\n type=\"checkbox\"\n />\n Spinnaker manages traffic based on your selected strategy\n </label>\n </div>\n </StageConfigField>\n {config.enabled && (\n <>\n <StageConfigField fieldColumns={8} label=\"Service(s) Namespace\">\n <NamespaceSelector\n createable={true}\n onChange={(namespace: string): void => this.onConfigChange('options.namespace', namespace)}\n accounts={this.props.accounts}\n selectedAccount={this.props.selectedAccount}\n selectedNamespace={config.options.namespace || ''}\n />\n </StageConfigField>\n <StageConfigField fieldColumns={8} label=\"Service(s)\">\n <Creatable\n clearable={false}\n multi={true}\n onChange={(options) => this.onConfigChange('options.services', map(options, 'value'))}\n options={this.getServiceOptions()}\n value={config.options.services}\n />\n </StageConfigField>\n <StageConfigField fieldColumns={8} label=\"Traffic\">\n <div className=\"checkbox\">\n <label>\n <input\n checked={config.options.enableTraffic}\n disabled={!!config.options.strategy}\n onChange={(e) => this.onConfigChange('options.enableTraffic', e.target.checked)}\n type=\"checkbox\"\n />\n Send client requests to new pods\n </label>\n </div>\n </StageConfigField>\n <StageConfigField fieldColumns={8} helpKey=\"kubernetes.manifest.rolloutStrategy\" label=\"Strategy\">\n <Select\n clearable={false}\n onChange={(option: Option<IDeploymentStrategy>) => this.onConfigChange('options.strategy', option.key)}\n options={rolloutStrategies}\n optionRenderer={this.strategyOptionRenderer}\n placeholder=\"None\"\n value={config.options.strategy}\n valueKey=\"key\"\n valueRenderer={(o) => <>{o.label}</>}\n />\n </StageConfigField>\n </>\n )}\n </>\n );\n }\n}\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type {\n IAccountDetails,\n IArtifact,\n IExpectedArtifact,\n IFormikStageConfigInjectedProps,\n IManifest,\n} from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { CopyFromTemplateButton } from './CopyFromTemplateButton';\nimport type { IManifestBindArtifact } from './ManifestBindArtifactsSelector';\nimport { ManifestBindArtifactsSelector } from './ManifestBindArtifactsSelector';\nimport { ManifestDeploymentOptions } from './ManifestDeploymentOptions';\nimport { NamespaceSelector } from './NamespaceSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\n\ninterface IDeployManifestStageConfigFormProps {\n accounts: IAccountDetails[];\n}\n\ninterface IDeployManifestStageConfigFormState {\n rawManifest: string;\n overrideNamespace: boolean;\n}\n\nexport class DeployManifestStageForm extends React.Component<\n IDeployManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IDeployManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\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 overrideNamespace: get(stage, 'namespaceOverride', '') !== '',\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 handleCopy = (manifest: IManifest): void => {\n this.props.formik.setFieldValue('manifests', [manifest]);\n this.setState({\n rawManifest: yamlDocumentsToString([manifest]),\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 private overrideNamespaceChange(checked: boolean) {\n if (!checked) {\n this.props.formik.setFieldValue('namespaceOverride', '');\n }\n this.setState({ overrideNamespace: checked });\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=\"Override Namespace\">\n <CheckboxInput\n checked={this.state.overrideNamespace}\n onChange={(e: any) => this.overrideNamespaceChange(e.target.checked)}\n />\n </StageConfigField>\n {this.state.overrideNamespace && (\n <StageConfigField label=\"Namespace\">\n <NamespaceSelector\n createable={true}\n accounts={this.props.accounts}\n selectedAccount={stage.account}\n selectedNamespace={stage.namespaceOverride || ''}\n onChange={(namespace) => this.props.formik.setFieldValue('namespaceOverride', namespace)}\n />\n </StageConfigField>\n )}\n <hr />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.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 <CopyFromTemplateButton application={this.props.application} handleCopy={this.handleCopy} />\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=\"kubernetes.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=\"kubernetes.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=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n <hr />\n <ManifestDeploymentOptions\n accounts={this.props.accounts}\n config={stage.trafficManagement}\n onConfigChange={(config) => this.props.formik.setFieldValue('trafficManagement', config)}\n selectedAccount={stage.account}\n />\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 { DeployManifestStageForm } from './DeployManifestStageForm';\nimport { defaultTrafficManagementConfig } from './ManifestDeploymentOptions';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\ninterface IDeployManifestStageConfigState {\n accounts: IAccountDetails[];\n}\n\nexport class DeployManifestStageConfig 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.trafficManagement) {\n stage.trafficManagement = defaultTrafficManagementConfig;\n }\n if (!stage.cloudProvider) {\n stage.cloudProvider = 'kubernetes';\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('kubernetes'))\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) => <DeployManifestStageForm {...props} accounts={this.state.accounts} />}\n />\n );\n }\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 deployManifestValidators = (): 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 {(isStable || isUnstableWithMessage) && <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 = 'kubernetesResource';\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 KubernetesSpinnakerKindMap\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 spinnakerKindFromKubernetesKind(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: 'kubernetes',\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.spinnakerKindFromKubernetesKind(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 { 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 KubernetesManifestService {\n public static subscribe(app: Application, params: IManifestParams, fn: IManifestCallback): () => void {\n KubernetesManifestService.updateManifest(params, fn);\n return app.onRefresh(null, () => KubernetesManifestService.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: KubernetesManifestService.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 !KubernetesManifestService.BUILT_IN_GROUPS.includes(KubernetesManifestService.apiGroup(manifest));\n }\n\n private static scopedKind(manifest: IStageManifest): string {\n if (KubernetesManifestService.isCRDGroup(manifest)) {\n return manifest.kind + '.' + KubernetesManifestService.apiGroup(manifest);\n }\n\n return manifest.kind;\n }\n\n // from https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.12/\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 { KubernetesManifestService } 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) => KubernetesManifestService.manifestIdentifier(m)).sort();\n if (prevState.manifestIds.join('') !== manifestIds.join('')) {\n this.unsubscribeAll();\n const subscriptions = manifests.map((manifest) => {\n const id = KubernetesManifestService.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 = KubernetesManifestService.stageManifestToManifestParams(manifest, this.props.stage.context.account);\n return KubernetesManifestService.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: 'kubernetes',\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 || KubernetesManifestService.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 { DeployManifestStageConfig } from './DeployManifestStageConfig';\nimport { deployManifestValidators } from './deployManifest.validator';\nimport { DeployStatus } from './manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Deploy (Manifest)',\n description: 'Deploy a Kubernetes manifest yaml/json file.',\n key: 'deployManifest',\n cloudProvider: 'kubernetes',\n component: DeployManifestStageConfig,\n executionDetailsSections: [DeployStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: deployManifestValidators(),\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 React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport { CheckboxInput, StageConfigField } from '@spinnaker/core';\n\nexport interface IPatchManifestOptionsFormProps {\n record: boolean;\n onRecordChange: (record: boolean) => void;\n strategy: string;\n onStrategyChange: (strategy: string) => void;\n}\n\nexport const PatchManifestOptionsForm: React.FunctionComponent<IPatchManifestOptionsFormProps> = (\n props: IPatchManifestOptionsFormProps,\n) => {\n return (\n <div className=\"form-horizontal\">\n <StageConfigField label=\"Record Patch Annotation\" helpKey=\"kubernetes.manifest.patch.record\">\n <CheckboxInput\n checked={props.record}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => props.onRecordChange(e.target.checked)}\n />\n </StageConfigField>\n <StageConfigField label=\"Merge Strategy\" helpKey=\"kubernetes.manifest.patch.mergeStrategy\" fieldColumns={3}>\n <Select\n clearable={false}\n value={props.strategy}\n options={['strategic', 'json', 'merge'].map((k) => ({ value: k, label: k }))}\n onChange={(e: Option<string>) => props.onStrategyChange(e.value)}\n />\n </StageConfigField>\n </div>\n );\n};\n","import { capitalize, get, isEmpty, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\n\nimport type { IArtifact, IExpectedArtifact, IFormikStageConfigInjectedProps } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n RadioButtonInput,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { PatchManifestOptionsForm } from './PatchManifestOptionsForm';\nimport { ManifestBindArtifactsSelector } from '../deployManifest/ManifestBindArtifactsSelector';\nimport type { IManifestBindArtifact } from '../deployManifest/ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\ninterface IPatchManifestStageConfigFormProps {\n stageFieldUpdated: () => void;\n}\n\ninterface IPatchManifestStageConfigFormState {\n rawManifest: string;\n}\n\nexport class PatchManifestStageForm extends React.Component<\n IPatchManifestStageConfigFormProps & IFormikStageConfigInjectedProps,\n IPatchManifestStageConfigFormState\n> {\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.EMBEDDED_BASE64,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n public constructor(props: IPatchManifestStageConfigFormProps & IFormikStageConfigInjectedProps) {\n super(props);\n const patchBody: any[] = get(props.formik.values, 'patchBody');\n const isTextManifest: boolean = get(props.formik.values, 'source') === ManifestSource.TEXT;\n this.state = {\n rawManifest: !isEmpty(patchBody) && isTextManifest ? yamlDocumentsToString(patchBody) : '',\n };\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 private handleRawManifestChange = (rawManifest: string, manifests: any): void => {\n this.setState({\n rawManifest,\n });\n this.props.formik.setFieldValue('patchBody', manifests);\n };\n\n private onManifestSelectorChange = (): void => {\n this.props.stageFieldUpdated();\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 public render() {\n const stage = this.props.formik.values;\n return (\n <div className=\"container-fluid form-horizontal\">\n <h4>Resource to Patch</h4>\n <ManifestSelector\n application={this.props.application}\n modes={[SelectorMode.Static, SelectorMode.Dynamic]}\n onChange={this.onManifestSelectorChange}\n selector={stage as any}\n />\n <hr />\n <h4>Patch Content</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.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=\"kubernetes.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 </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n\n <hr />\n <h4>Patch Options</h4>\n <PatchManifestOptionsForm\n strategy={!!stage.options && stage.options.mergeStrategy}\n onStrategyChange={(strategy: string) => this.props.formik.setFieldValue('options.mergeStrategy', strategy)}\n record={!!stage.options && stage.options.record}\n onRecordChange={(record: boolean) => this.props.formik.setFieldValue('options.record', record)}\n />\n </div>\n );\n }\n}\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { IStage, IStageConfigProps } from '@spinnaker/core';\nimport { FormikStageConfig } from '@spinnaker/core';\n\nimport { PatchManifestStageForm } from './PatchManifestStageForm';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\n\nexport class PatchManifestStageConfig extends React.Component<IStageConfigProps> {\n private readonly stage: IStage;\n\n public constructor(props: IStageConfigProps) {\n super(props);\n defaults(props.stage, {\n app: props.application.name,\n source: ManifestSource.TEXT,\n options: {\n record: true,\n mergeStrategy: 'strategic',\n },\n cloudProvider: 'kubernetes',\n });\n\n // There was a bug introduced in Spinnaker 1.15 where we were incorrectly\n // storing the merge strategy on a field called 'strategy' instead of on\n // 'mergeStrategy'. In order to auto-fix pipelines affected by that bug,\n // delete any value in 'strategy'. If 'mergeStrategy' is empty, set it to\n // the value we deleted from 'strategy'.\n defaults(props.stage.options, {\n mergeStrategy: props.stage.options.strategy,\n });\n delete props.stage.options.strategy;\n\n // There was a bug introduced in Spinnaker 1.15 where we were incorrectly\n // always storing the patchBody as an object. In order to auto-fix pipelines\n // affected by that bug, massage any configured patchBody value into a list.\n if (props.stage.patchBody && !Array.isArray(props.stage.patchBody)) {\n props.stage.patchBody = [props.stage.patchBody];\n }\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 = props.stage;\n }\n\n public render() {\n return (\n <FormikStageConfig\n {...this.props}\n stage={this.stage}\n onChange={this.props.updateStage}\n render={(props) => <PatchManifestStageForm {...props} stageFieldUpdated={this.props.stageFieldUpdated} />}\n />\n );\n }\n}\n","import {\n ArtifactReferenceService,\n ExecutionArtifactTab,\n ExecutionDetailsTasks,\n ExpectedArtifactService,\n Registry,\n} from '@spinnaker/core';\n\nimport { PatchManifestStageConfig } from './PatchManifestStageConfig';\nimport { DeployStatus } from '../deployManifest/manifestStatus/DeployStatus';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nexport class PatchStatus extends DeployStatus {\n public static title = 'PatchStatus';\n}\n\nconst STAGE_NAME = 'Patch (Manifest)';\nRegistry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Patch a Kubernetes object in place.',\n key: 'patchManifest',\n cloudProvider: 'kubernetes',\n component: PatchManifestStageConfig,\n executionDetailsSections: [PatchStatus, ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n supportsCustomTimeout: true,\n validators: manifestSelectorValidators(STAGE_NAME),\n artifactExtractor: ExpectedArtifactService.accumulateArtifacts(['manifestArtifactId', 'requiredArtifactIds']),\n artifactRemover: ArtifactReferenceService.removeArtifactFromFields(['manifestArtifactId', 'requiredArtifactIds']),\n});\n","import { capitalize, map } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IArtifact, IExpectedArtifact, IStageConfigProps } from '@spinnaker/core';\nimport {\n AccountService,\n ArtifactTypePatterns,\n RadioButtonInput,\n StageArtifactSelector,\n StageArtifactSelectorDelegate,\n StageConfigField,\n yamlDocumentsToString,\n YamlEditor,\n} from '@spinnaker/core';\n\nimport { ManifestBindArtifactsSelector } from '../deployManifest/ManifestBindArtifactsSelector';\nimport type { IManifestBindArtifact } from '../deployManifest/ManifestBindArtifactsSelector';\nimport { ManifestSource } from '../../../manifest/ManifestSource';\nimport { ManifestBasicSettings } from '../../../manifest/wizard/BasicSettings';\n\nexport interface IKubernetesRunJobStageConfigState {\n credentials: IAccount[];\n rawManifest?: string;\n}\n\nexport class KubernetesV2RunJobStageConfig extends React.Component<IStageConfigProps> {\n public state: IKubernetesRunJobStageConfigState = {\n credentials: [],\n };\n\n private readonly excludedManifestArtifactTypes = [\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ArtifactTypePatterns.MAVEN_FILE,\n ];\n\n constructor(props: IStageConfigProps) {\n super(props);\n const { stage, application } = this.props;\n if (!stage.application) {\n stage.application = application.name;\n }\n if (!stage.source) {\n stage.source = ManifestSource.TEXT;\n }\n }\n\n public outputOptions = [\n { label: 'None', value: 'none' },\n { label: 'Logs', value: 'propertyFile' },\n { label: 'Artifact', value: 'artifact' },\n ];\n\n public accountChanged = (account: string) => {\n this.props.updateStageField({\n credentials: account,\n account: account,\n });\n };\n\n public handleRawManifestChange = (rawManifest: string, manifests: any) => {\n if (manifests) {\n this.props.updateStageField({ manifest: manifests[0] });\n }\n this.setState({ rawManifest });\n };\n\n public initRawManifest() {\n const { stage } = this.props;\n if (stage.manifest) {\n this.setState({ rawManifest: yamlDocumentsToString([stage.manifest]) });\n }\n }\n\n public componentDidMount() {\n this.props.updateStageField({ cloudProvider: 'kubernetes' });\n AccountService.getAllAccountDetailsForProvider('kubernetes').then((accounts: any) => {\n this.setState({ credentials: accounts });\n });\n this.initRawManifest();\n }\n\n private sourceChanged = (event: any) => {\n this.props.updateStageField({ consumeArtifactSource: event.value });\n if (event.value === 'none') {\n this.props.updateStageField({ propertyFile: null });\n }\n };\n\n private onArtifactSelected = (artifact: IExpectedArtifact) => {\n this.props.updateStageField({ consumeArtifactId: artifact.id });\n };\n\n private onArtifactEdited = (artifact: IArtifact) => {\n this.props.updateStageField({\n consumeArtifact: artifact,\n consumeArtifactId: artifact.id,\n consumeArtifactAccount: artifact.artifactAccount,\n });\n };\n\n private onManifestArtifactSelected = (expectedArtifactId: string): void => {\n this.props.updateStageField({\n manifestArtifactId: expectedArtifactId,\n manifestArtifact: null,\n });\n };\n\n private onManifestArtifactEdited = (artifact: IArtifact) => {\n this.props.updateStageField({\n manifestArtifactId: null,\n manifestArtifact: artifact,\n });\n };\n\n private updatePropertyFile = (event: any) => {\n this.props.updateStageField({ propertyFile: event.target.value });\n };\n\n public logSourceForm() {\n const { stage } = this.props;\n return (\n <StageConfigField label=\"Container Name\" helpKey=\"kubernetes.runJob.captureSource.containerName\">\n <input\n className=\"form-control input-sm\"\n type=\"text\"\n value={stage.propertyFile}\n onChange={this.updatePropertyFile}\n />\n </StageConfigField>\n );\n }\n\n public artifactForm() {\n const { stage, pipeline } = this.props;\n return (\n <StageConfigField label=\"Artifact\">\n <StageArtifactSelector\n pipeline={pipeline}\n stage={stage}\n artifact={stage.consumeArtifact}\n excludedArtifactTypePatterns={[]}\n expectedArtifactId={stage.consumeArtifactId}\n onExpectedArtifactSelected={this.onArtifactSelected}\n onArtifactEdited={this.onArtifactEdited}\n />\n </StageConfigField>\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 getRequiredArtifacts = (): IManifestBindArtifact[] => {\n const { requiredArtifactIds, requiredArtifacts } = this.props.stage;\n return (requiredArtifactIds || [])\n .map((id: string) => ({ expectedArtifactId: id }))\n .concat(requiredArtifacts || []);\n };\n\n private onRequiredArtifactsChanged = (bindings: IManifestBindArtifact[]): void => {\n this.props.updateStageField({\n requiredArtifactIds: bindings.filter((b) => b.expectedArtifactId).map((b) => b.expectedArtifactId),\n });\n this.props.updateStageField({ requiredArtifacts: bindings.filter((b) => b.artifact) });\n };\n\n public render() {\n const { stage } = this.props;\n\n let outputSource = <div />;\n if (stage.consumeArtifactSource === 'propertyFile') {\n outputSource = this.logSourceForm();\n } else if (stage.consumeArtifactSource === 'artifact') {\n outputSource = this.artifactForm();\n }\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <h4>Basic Settings</h4>\n <ManifestBasicSettings\n selectedAccount={stage.account || ''}\n accounts={this.state.credentials}\n onAccountSelect={(selectedAccount: string) => this.accountChanged(selectedAccount)}\n />\n <h4>Manifest Configuration</h4>\n <StageConfigField label=\"Manifest Source\" helpKey=\"kubernetes.manifest.source\">\n <RadioButtonInput\n options={this.getSourceOptions()}\n onChange={(e: any) => this.props.updateStageField({ source: e.target.value })}\n value={stage.source}\n />\n </StageConfigField>\n {stage.source === ManifestSource.TEXT && (\n <YamlEditor value={this.state.rawManifest} onChange={this.handleRawManifestChange} />\n )}\n {stage.source === ManifestSource.ARTIFACT && (\n <>\n <StageArtifactSelectorDelegate\n artifact={stage.manifestArtifact}\n excludedArtifactTypePatterns={this.excludedManifestArtifactTypes}\n expectedArtifactId={stage.manifestArtifactId}\n helpKey=\"kubernetes.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 </>\n )}\n <StageConfigField label=\"Required Artifacts to Bind\" helpKey=\"kubernetes.manifest.requiredArtifactsToBind\">\n <ManifestBindArtifactsSelector\n bindings={this.getRequiredArtifacts()}\n onChangeBindings={this.onRequiredArtifactsChanged}\n pipeline={this.props.pipeline}\n stage={stage}\n />\n </StageConfigField>\n <h4>Output</h4>\n <StageConfigField label=\"Capture Output From\" helpKey=\"kubernetes.runJob.captureSource\">\n <div>\n <Select\n clearable={false}\n options={this.outputOptions}\n value={stage.consumeArtifactSource}\n onChange={this.sourceChanged}\n />\n </div>\n </StageConfigField>\n {outputSource}\n </div>\n );\n }\n}\n","import { get, isEmpty, sortBy } from 'lodash';\nimport React from 'react';\n\nimport type { IExecutionDetailsSectionProps, IJobOwnedPodStatus } from '@spinnaker/core';\nimport {\n AccountTag,\n DefaultPodNameProvider,\n ExecutionDetailsSection,\n JobStageExecutionLogs,\n StageFailureMessage,\n} from '@spinnaker/core';\n\nexport class RunJobExecutionDetails extends React.Component<IExecutionDetailsSectionProps, any> {\n public static title = 'runJobConfig';\n\n private createdPodNames(podsStatuses: IJobOwnedPodStatus[]): string[] {\n const sorted = sortBy(podsStatuses, (p: IJobOwnedPodStatus) => p.status.startTime);\n return sorted.map((p: IJobOwnedPodStatus) => p.name);\n }\n\n public render() {\n const { stage, name, current } = this.props;\n const { context } = stage;\n const namespace = get(stage, ['context', 'jobStatus', 'location'], '');\n const deployedName = namespace ? get<string[]>(context, ['deploy.jobs', namespace])[0] : '';\n const externalLink = get<string>(stage, ['context', 'execution', 'logs']);\n const pods = get(stage.context, 'jobStatus.pods', []);\n const podNames = !isEmpty(pods)\n ? this.createdPodNames(pods)\n : [get(stage, ['context', 'jobStatus', 'mostRecentPodName'], '')];\n const podNamesProviders = podNames.map((p) => new DefaultPodNameProvider(p));\n\n return (\n <ExecutionDetailsSection name={name} current={current}>\n <StageFailureMessage stage={stage} message={stage.failureMessage} />\n <div className=\"row\">\n <div className=\"col-md-9\">\n <dl className=\"dl-narrow dl-horizontal\">\n <dt>Account</dt>\n <dd>\n <AccountTag account={context.account} />\n </dd>\n {namespace && (\n <>\n <dt>Namespace</dt>\n <dd>{stage.context.jobStatus.location}</dd>\n <dt>Logs</dt>\n <dd>\n <JobStageExecutionLogs\n deployedName={deployedName}\n account={this.props.stage.context.account}\n location={namespace}\n application={this.props.application}\n externalLink={externalLink}\n podNamesProviders={podNamesProviders}\n />\n </dd>\n </>\n )}\n {!namespace && <div className=\"well\">Collecting additional details...</div>}\n </dl>\n </div>\n </div>\n </ExecutionDetailsSection>\n );\n }\n}\n","import type { ICustomValidator, IPipeline, IStage, IStageOrTriggerTypeConfig, IValidatorConfig } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { KubernetesV2RunJobStageConfig } from './KubernetesV2RunJobStageConfig';\nimport { RunJobExecutionDetails } from './RunJobExecutionDetails';\nimport { DeployStatus } from '../deployManifest/manifestStatus/DeployStatus';\n\nRegistry.pipeline.registerStage({\n label: 'Run Job (Manifest)',\n description: 'Run a Kubernetes Job manifest yaml/json file.',\n key: 'runJobManifest',\n alias: 'runJob',\n addAliasToConfig: true,\n cloudProvider: 'kubernetes',\n component: KubernetesV2RunJobStageConfig,\n executionDetailsSections: [RunJobExecutionDetails, DeployStatus, ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n producesArtifacts: true,\n restartable: true,\n validators: [\n {\n type: 'custom',\n validate: (\n _pipeline: IPipeline,\n stage: IStage,\n _validator: IValidatorConfig,\n _config: IStageOrTriggerTypeConfig,\n ): string => {\n if (!stage.manifest || !stage.manifest.kind) {\n return '';\n }\n if (stage.manifest.kind !== 'Job') {\n return 'Run Job (Manifest) only accepts manifest of kind Job.';\n }\n return '';\n },\n } as ICustomValidator,\n ],\n});\n","import type { IController, IScope } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\n\nexport class KubernetesV2FindArtifactsFromResourceConfigCtrl implements IController {\n public application: Application;\n\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n this.application = this.$scope.$parent.application;\n if (this.$scope.stage.isNew) {\n const defaultSelection: IManifestSelector = {\n location: '',\n account: '',\n manifestName: '',\n app: this.application.name,\n };\n Object.assign(this.$scope.stage, defaultSelection);\n this.$scope.stage.cloudProvider = 'kubernetes';\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport { ExecutionArtifactTab, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { KubernetesV2FindArtifactsFromResourceConfigCtrl } from './findArtifactsFromResourceConfig.controller';\nimport { KUBERNETES_MANIFEST_SELECTOR } from '../../../manifest/selector/selector.component';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nexport const KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE =\n 'spinnaker.kubernetes.v2.pipeline.stage.findArtifactsFromResource';\n\nconst STAGE_NAME = 'Find Artifacts From Resource (Manifest)';\nmodule(KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE, [KUBERNETES_MANIFEST_SELECTOR])\n .config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Finds artifacts from a Kubernetes resource.',\n key: 'findArtifactsFromResource',\n cloudProvider: 'kubernetes',\n templateUrl: require('./findArtifactsFromResourceConfig.html'),\n controller: 'KubernetesV2FindArtifactsFromResourceConfigCtrl',\n controllerAs: 'ctrl',\n executionDetailsSections: [ExecutionDetailsTasks, ExecutionArtifactTab],\n producesArtifacts: true,\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n })\n .controller('KubernetesV2FindArtifactsFromResourceConfigCtrl', KubernetesV2FindArtifactsFromResourceConfigCtrl);\n","import type { IController, IScope } from 'angular';\nimport { defaults } from 'lodash';\n\nimport type { Application } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\n\nexport class KubernetesV2ScaleManifestConfigCtrl implements IController {\n public application: Application;\n\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n if (this.$scope.stage.isNew) {\n this.application = this.$scope.$parent.application;\n const defaultSelection: IManifestSelector = {\n location: '',\n account: '',\n };\n defaults(this.$scope.stage, defaultSelection);\n const defaultOptions: any = {\n replicas: null,\n app: this.application.name,\n };\n defaults(this.$scope.stage, defaultOptions);\n this.$scope.stage.cloudProvider = 'kubernetes';\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM } from '../../../manifest/scale/scaleSettingsForm.component';\nimport { KubernetesV2ScaleManifestConfigCtrl } from './scaleManifestConfig.controller';\n\nexport const KUBERNETES_SCALE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.scaleManifestStage';\nconst STAGE_KEY = 'scaleManifest';\n\nmodule(KUBERNETES_SCALE_MANIFEST_STAGE, [KUBERNETES_SCALE_MANIFEST_SETTINGS_FORM])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Scale (Manifest)',\n description: 'Scale a Kubernetes object created from a manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n templateUrl: require('./scaleManifestConfig.html'),\n controller: 'KubernetesV2ScaleManifestConfigCtrl',\n controllerAs: 'ctrl',\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'replicas', fieldLabel: 'Replicas' },\n ],\n });\n })\n .controller('KubernetesV2ScaleManifestConfigCtrl', KubernetesV2ScaleManifestConfigCtrl);\n","import { defaults } from 'lodash';\nimport React from 'react';\n\nimport type { IStage, IStageConfigProps } from '@spinnaker/core';\n\nimport type { IManifestSelector } from '../../../manifest/selector/IManifestSelector';\nimport { SelectorMode } from '../../../manifest/selector/IManifestSelector';\nimport { ManifestSelector } from '../../../manifest/selector/ManifestSelector';\n\nexport interface IKubernetesManifestStageConfigProps extends IStageConfigProps {\n stage: IManifestSelector & IStage;\n}\n\nexport class ManifestTrafficStageConfig extends React.Component<IKubernetesManifestStageConfigProps> {\n public componentDidMount = (): void => {\n defaults(this.props.stage, {\n app: this.props.application.name,\n cloudProvider: 'kubernetes',\n });\n this.props.stageFieldUpdated();\n };\n\n private onChange = (stage: IManifestSelector): void => {\n Object.assign(this.props.stage, stage);\n this.props.stageFieldUpdated();\n };\n\n public render() {\n const selector = { ...this.props.stage };\n return (\n <div className=\"form-horizontal\">\n <h4>Manifest</h4>\n <div className=\"horizontal-rule\" />\n <ManifestSelector\n application={this.props.application}\n selector={selector}\n modes={[SelectorMode.Static, SelectorMode.Dynamic]}\n onChange={this.onChange}\n includeSpinnakerKinds={['serverGroups']}\n />\n </div>\n );\n }\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Disable (Manifest)';\nconst STAGE_KEY = 'disableManifest';\nexport const KUBERNETES_DISABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.disableManifestStage';\nmodule(KUBERNETES_DISABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Disable a Kubernetes manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: ManifestTrafficStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n});\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { EXECUTION_ARTIFACT_TAB, ExecutionDetailsTasks, Registry } from '@spinnaker/core';\n\nimport { manifestExecutionDetails } from '../ManifestExecutionDetails';\nimport { ManifestTrafficStageConfig } from './ManifestTrafficStageConfig';\nimport { manifestSelectorValidators } from '../validators/manifestSelectorValidators';\n\nconst STAGE_NAME = 'Enable (Manifest)';\nconst STAGE_KEY = 'enableManifest';\nexport const KUBERNETES_ENABLE_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.enableManifestStage';\nmodule(KUBERNETES_ENABLE_MANIFEST_STAGE, [EXECUTION_ARTIFACT_TAB]).config(() => {\n Registry.pipeline.registerStage({\n label: STAGE_NAME,\n description: 'Enable a Kubernetes manifest.',\n key: STAGE_KEY,\n cloudProvider: 'kubernetes',\n component: ManifestTrafficStageConfig,\n executionDetailsSections: [manifestExecutionDetails(STAGE_KEY), ExecutionDetailsTasks],\n supportsCustomTimeout: true,\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n validators: manifestSelectorValidators(STAGE_NAME),\n });\n});\n","import type { IController, IScope } from 'angular';\n\nexport class KubernetesV2UndoRolloutManifestConfigCtrl implements IController {\n public static $inject = ['$scope'];\n constructor(private $scope: IScope) {\n if (this.$scope.stage.isNew) {\n Object.assign(this.$scope.stage, {\n location: '',\n account: '',\n cloudProvider: 'kubernetes',\n numRevisionsBack: 1,\n });\n }\n }\n\n public handleManifestSelectorChange = (): void => {\n this.$scope.$applyAsync();\n };\n}\n","import { module } from 'angular';\n\nimport type { IStage } from '@spinnaker/core';\nimport { Registry } from '@spinnaker/core';\n\nimport { KubernetesV2UndoRolloutManifestConfigCtrl } from './undoRolloutManifestConfig.controller';\n\nexport const KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE = 'spinnaker.kubernetes.v2.pipeline.stage.undoRolloutManifestStage';\n\nmodule(KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE, [])\n .config(() => {\n Registry.pipeline.registerStage({\n label: 'Undo Rollout (Manifest)',\n description: 'Rollback a manifest a target number of revisions.',\n key: 'undoRolloutManifest',\n cloudProvider: 'kubernetes',\n templateUrl: require('./undoRolloutManifestConfig.html'),\n controller: 'KubernetesV2UndoRolloutManifestConfigCtrl',\n controllerAs: 'ctrl',\n accountExtractor: (stage: IStage): string[] => (stage.account ? [stage.account] : []),\n configAccountExtractor: (stage: any): string[] => (stage.account ? [stage.account] : []),\n validators: [\n { type: 'requiredField', fieldName: 'location', fieldLabel: 'Namespace' },\n { type: 'requiredField', fieldName: 'account', fieldLabel: 'Account' },\n { type: 'requiredField', fieldName: 'numRevisionsBack', fieldLabel: 'Number of Revisions' },\n { type: 'manifestSelector' },\n ],\n });\n })\n .controller('KubernetesV2UndoRolloutManifestConfigCtrl', KubernetesV2UndoRolloutManifestConfigCtrl);\n","import type {\n IPipeline,\n IStage,\n IStageOrTriggerTypeConfig,\n IStageOrTriggerValidator,\n IValidatorConfig,\n} from '@spinnaker/core';\nimport { PipelineConfigValidator } from '@spinnaker/core';\n\nexport interface IStageWithManifestSelector extends IStage {\n manifestName: string;\n location: string;\n}\n\nexport class ManifestSelectorValidator implements IStageOrTriggerValidator {\n public validate(\n _pipeline: IPipeline,\n stage: IStageWithManifestSelector,\n _validator: IValidatorConfig,\n _config: IStageOrTriggerTypeConfig,\n ): string {\n const [kind, name] = (stage.manifestName || '').split(' ');\n if (!name && !kind) {\n return `<strong>Name</strong> and <strong>Kind</strong> are required fields.`;\n }\n if (!name) {\n return `<strong>Name</strong> is a required field.`;\n }\n if (!kind) {\n return `<strong>Kind</strong> is a required field.`;\n }\n return null;\n }\n}\n\nPipelineConfigValidator.registerValidator('manifestSelector', new ManifestSelectorValidator());\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\nimport { ApplicationDataSourceRegistry, INFRASTRUCTURE_KEY, REST } from '@spinnaker/core';\n\nexport const KUBERNETS_RAW_RESOURCE_DATA_SOURCE = 'spinnaker.core.rawresource.dataSource';\nexport const KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY = 'k8s';\nconst KUBERNETS_RAW_RESOURCE_DATA_SOURCE_SREF = `.insight.${KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY}`;\n\ntype ApiK8sResource = any;\n\nconst fetchK8sResources = (application: Application): PromiseLike<ApiK8sResource> =>\n REST('applications').path(application.name, 'rawResources').get();\n\nconst formatK8sResources = ($q: IQService) => (_: Application, result: ApiK8sResource): PromiseLike<ApiK8sResource> =>\n $q.resolve(result);\n\nmodule(KUBERNETS_RAW_RESOURCE_DATA_SOURCE, []).run([\n '$q',\n ($q: IQService) => {\n ApplicationDataSourceRegistry.registerDataSource({\n key: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY,\n label: 'Kubernetes',\n category: INFRASTRUCTURE_KEY,\n sref: KUBERNETS_RAW_RESOURCE_DATA_SOURCE_SREF,\n primary: true,\n icon: 'fas fa-xs fa-fw fa-th-large',\n iconName: 'spMenuK8s',\n loader: fetchK8sResources,\n onLoad: formatK8sResources($q),\n providerField: 'cloudProvider',\n credentialsField: 'account',\n regionField: 'region',\n description: 'Collections of kubernetes resources',\n defaultData: [],\n });\n },\n]);\n","export class RawResourceUtils {\n static GLOBAL_LABEL = '(global)';\n\n static namespaceDisplayName(ns: string): string {\n if (ns === null || ns === '') {\n return RawResourceUtils.GLOBAL_LABEL;\n }\n return ns;\n }\n\n static resourceKey(resource: IApiKubernetesResource): string {\n if (resource === null) {\n return '';\n }\n return resource.namespace === ''\n ? resource.account + '-' + resource.kind + '-' + resource.name\n : resource.account + '-' + resource.namespace + '-' + resource.kind + '-' + resource.name;\n }\n}\n","import type { IK8sResourcesFiltersState } from '../component/K8sResourcesFilters';\n\ntype ISubscriber = (message: IK8sResourcesFiltersState) => void;\n\nexport class FiltersPubSub {\n private subscribers: ISubscriber[] = [];\n private static intances: Record<string, FiltersPubSub> = {};\n\n private constructor() {}\n\n public static getInstance(name: string) {\n let instance = FiltersPubSub.intances[name];\n if (!FiltersPubSub.intances[name]) {\n FiltersPubSub.intances[name] = new FiltersPubSub();\n instance = FiltersPubSub.intances[name];\n }\n return instance;\n }\n\n public subscribe(subscriber: ISubscriber) {\n this.subscribers.push(subscriber);\n return () => (this.subscribers = this.subscribers.filter((x) => x !== subscriber));\n }\n\n public unsubscribe(subscriber: ISubscriber) {\n const index = this.subscribers.indexOf(subscriber);\n if (index > -1) {\n this.subscribers.splice(index, 1);\n }\n }\n\n public publish(message: IK8sResourcesFiltersState) {\n this.subscribers.forEach((sub) => sub(message));\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport { CloudProviderLogo } from '@spinnaker/core';\n\nimport { RawResourceUtils } from '../RawResourceUtils';\n\nimport './RawResource.less';\n\ninterface IRawResourceProps {\n resource: IApiKubernetesResource;\n}\n\ninterface IRawResourceState {}\n\nexport class RawResource extends React.Component<IRawResourceProps, IRawResourceState> {\n constructor(props: IRawResourceProps) {\n super(props);\n }\n\n public render() {\n const { account, name, region } = this.props.resource;\n const params = { account, name, region };\n return (\n <UISrefActive class=\"active\">\n <UISref to=\".rawResourceDetails\" params={params}>\n <div className=\"RawResource card clickable clickable-row\">\n <h4 className=\"title\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"20px\" width=\"20px\" />\n {this.props.resource.kind} {this.props.resource.displayName}\n </h4>\n <div className=\"details\">\n <div className=\"column\">\n <div className=\"title\">account:</div>\n <div>{this.props.resource.account}</div>\n </div>\n <div className=\"column\">\n <div className=\"title\">namespace:</div>\n <div>{RawResourceUtils.namespaceDisplayName(this.props.resource.namespace)}</div>\n </div>\n <div className=\"column\">\n <div className=\"title\">apiVersion:</div>\n <div>{this.props.resource.apiVersion}</div>\n </div>\n </div>\n </div>\n </UISref>\n </UISrefActive>\n );\n }\n}\n","import React from 'react';\nimport './RawResource.less';\n\ninterface IRawResourceGroupProps {\n title: string;\n resources?: IApiKubernetesResource[];\n}\n\ninterface IRawResourceGroupState {\n open: boolean;\n}\n\nexport class RawResourceGroup extends React.Component<IRawResourceGroupProps, IRawResourceGroupState> {\n constructor(props: IRawResourceGroupProps) {\n super(props);\n\n this.state = {\n open: true,\n };\n }\n\n public render() {\n return (\n <div className=\"RawResourceGroup\">\n <div className=\"clickable sticky-header header\" onClick={this.onHeaderClick.bind(this)}>\n <span className={`glyphicon pipeline-toggle glyphicon-chevron-${this.state.open ? 'down' : 'right'}`} />\n <div className=\"shadowed\">\n <h4 className=\"group-title\">{this.props.title}</h4>\n </div>\n </div>\n <div className={`items${this.state.open ? '' : ' hidden'}`}>{this.props.children}</div>\n </div>\n );\n }\n\n private onHeaderClick() {\n this.setState({\n open: !this.state.open,\n });\n }\n}\n","import React from 'react';\nimport { RawResourceGroup } from './RawResouceGroup';\nimport { RawResource } from './RawResource';\nimport { RawResourceUtils } from '../RawResourceUtils';\n\ninterface IRawResourceGroupsProps {\n resources: IApiKubernetesResource[];\n groupBy: string;\n}\n\ninterface IRawResourceGroupsState {}\n\nexport class RawResourceGroups extends React.Component<IRawResourceGroupsProps, IRawResourceGroupsState> {\n constructor(props: IRawResourceGroupsProps) {\n super(props);\n }\n\n private buildGroupByModel(resources: IApiKubernetesResource[]) {\n const values = resources.map((r: Record<string, any>) => String(r[this.props.groupBy]));\n return Object.assign(\n {},\n ...values.map((value) => ({\n [value]: resources.filter((r: Record<string, any>) => String(r[this.props.groupBy]) === value),\n })),\n ) as Record<string, IApiKubernetesResource[]>;\n }\n\n private groupTitle(title: string): string {\n if (this.props.groupBy == 'namespace') {\n return RawResourceUtils.namespaceDisplayName(title);\n }\n return title;\n }\n\n public render() {\n const groups = this.buildGroupByModel(this.props.resources);\n return (\n <div className=\"RawResourceGroups\">\n {...Object.entries(groups).map(([key, value]) => {\n return key !== 'undefined' ? (\n <RawResourceGroup title={this.groupTitle(key)} key={key}>\n {...value.map((resource) => (\n <RawResource resource={resource} key={RawResourceUtils.resourceKey(resource)}></RawResource>\n ))}\n </RawResourceGroup>\n ) : (\n <></>\n );\n })}\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport type { Application, ApplicationDataSource } from '@spinnaker/core';\nimport { FormField, ReactSelectInput } from '@spinnaker/core';\n\nimport type { IK8sResourcesFiltersState } from './K8sResourcesFilters';\nimport { RawResourceUtils } from './RawResourceUtils';\nimport { FiltersPubSub } from '../controller/FiltersPubSub';\nimport { RawResource } from './group/RawResource';\nimport { RawResourceGroups } from './group/RawResourceGroups';\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY } from '../rawResource.dataSource';\n\nimport './K8sResources.less';\n\nexport interface IK8sResourcesProps {\n app: Application;\n}\n\ninterface IK8sResourcesState {\n groupBy: string;\n filters: IK8sResourcesFiltersState;\n rawResources: IApiKubernetesResource[];\n}\n\nexport class K8sResources extends React.Component<IK8sResourcesProps, IK8sResourcesState> {\n private dataSource: ApplicationDataSource<IApiKubernetesResource[]>;\n private filterPubSub: FiltersPubSub = FiltersPubSub.getInstance(this.props.app.name);\n private sub = this.onFilterChange.bind(this);\n\n constructor(props: IK8sResourcesProps) {\n super(props);\n this.dataSource = this.props.app.getDataSource(KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY);\n this.state = {\n groupBy: 'none',\n filters: null,\n rawResources: [],\n };\n\n this.filterPubSub.subscribe(this.sub);\n }\n\n public componentWillUnmount() {\n this.filterPubSub.unsubscribe(this.sub);\n }\n\n public onFilterChange(message: IK8sResourcesFiltersState) {\n this.setState({ ...this.state, filters: message });\n }\n\n public async componentDidMount() {\n await this.dataSource.ready();\n\n this.setState({\n ...this.state,\n groupBy: this.state.groupBy,\n rawResources: await this.dataSource.data.sort((a, b) => a.name.localeCompare(b.name)),\n });\n }\n\n private groupByChanged = (e: React.ChangeEvent<any>): void => {\n this.setState({ groupBy: e.target.value.toLowerCase() });\n };\n\n public render() {\n const opts = ['None', 'Account', 'Kind', 'Namespace'];\n return (\n <div className=\"K8sResources\">\n <div className=\"header row\">\n <FormField\n onChange={this.groupByChanged}\n value={this.state.groupBy.charAt(0).toUpperCase() + this.state.groupBy.substr(1)}\n name=\"groupBy\"\n label=\"Group By\"\n input={(props) => (\n <ReactSelectInput {...props} inputClassName=\"groupby\" stringOptions={opts} clearable={false} />\n )}\n />\n </div>\n <div className=\"content\">\n {this.state.groupBy === 'none' ? (\n <>\n {...this.state.rawResources\n .filter((resource) => this.matchFilters(resource))\n .map((resource) => (\n <RawResource key={RawResourceUtils.resourceKey(resource)} resource={resource}></RawResource>\n ))}\n </>\n ) : (\n <RawResourceGroups\n resources={this.state.rawResources.filter((resource) => this.matchFilters(resource))}\n groupBy={this.state.groupBy}\n ></RawResourceGroups>\n )}\n </div>\n </div>\n );\n }\n\n private matchFilters(resource: IApiKubernetesResource) {\n if (this.state.filters == null) {\n return true;\n }\n const accountMatch =\n Object.values(this.state.filters.accounts).every((x) => !x) || this.state.filters.accounts[resource.account];\n const kindMatch =\n Object.values(this.state.filters.kinds).every((x) => !x) || this.state.filters.kinds[resource.kind];\n const namespaceMatch =\n Object.values(this.state.filters.namespaces).every((x) => !x) ||\n this.state.filters.namespaces[resource.namespace];\n return accountMatch && kindMatch && namespaceMatch;\n }\n}\n","import React from 'react';\n\nimport type { Application, ApplicationDataSource } from '@spinnaker/core';\nimport { FilterCheckbox, FilterSection } from '@spinnaker/core';\n\nimport { RawResourceUtils } from './RawResourceUtils';\nimport { FiltersPubSub } from '../controller/FiltersPubSub';\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY } from '../rawResource.dataSource';\n\nexport interface IK8sResourcesFiltersProps {\n app: Application;\n}\n\nexport interface IK8sResourcesFiltersState {\n accounts: Record<string, boolean>;\n kinds: Record<string, boolean>;\n namespaces: Record<string, boolean>;\n displayNamespaces: Record<string, boolean>;\n}\n\nexport class K8sResourcesFilters extends React.Component<IK8sResourcesFiltersProps, IK8sResourcesFiltersState> {\n private dataSource: ApplicationDataSource<IApiKubernetesResource[]>;\n private filterPubSub: FiltersPubSub = FiltersPubSub.getInstance(this.props.app.name);\n\n constructor(props: IK8sResourcesFiltersProps) {\n super(props);\n this.dataSource = this.props.app.getDataSource(KUBERNETS_RAW_RESOURCE_DATA_SOURCE_KEY);\n\n this.state = {\n accounts: {},\n kinds: {},\n namespaces: {},\n displayNamespaces: {},\n };\n }\n\n public async componentDidMount() {\n await this.dataSource.ready();\n const ns = Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.namespace]: false })));\n const displayNs = { ...ns };\n if ('' in displayNs) {\n delete displayNs[''];\n displayNs[RawResourceUtils.GLOBAL_LABEL] = false;\n }\n this.setState({\n accounts: Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.account]: false }))),\n kinds: Object.assign({}, ...this.dataSource.data.map((resource) => ({ [resource.kind]: false }))),\n namespaces: ns,\n displayNamespaces: displayNs,\n });\n }\n\n public render() {\n return (\n <div className=\"content\">\n <FilterSection heading={'Kind'} expanded={true}>\n {...Object.keys(this.state.kinds)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.kinds}\n onChange={this.onCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n <FilterSection heading={'Account'} expanded={true}>\n {...Object.keys(this.state.accounts)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.accounts}\n onChange={this.onCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n <FilterSection heading={'Namespace'} expanded={true}>\n {...Object.keys(this.state.displayNamespaces)\n .sort((a, b) => a.localeCompare(b))\n .map((key) => (\n <FilterCheckbox\n heading={key}\n key={key}\n sortFilterType={this.state.displayNamespaces}\n onChange={this.onNsCheckbox.bind(this)}\n ></FilterCheckbox>\n ))}\n </FilterSection>\n </div>\n );\n }\n\n private onNsCheckbox() {\n const { namespaces, displayNamespaces } = { ...this.state };\n for (const p in displayNamespaces) {\n if (p == RawResourceUtils.GLOBAL_LABEL) {\n namespaces[''] = displayNamespaces[p];\n }\n namespaces[p] = displayNamespaces[p];\n }\n this.setState({ namespaces });\n this.filterPubSub.publish(this.state);\n }\n\n private onCheckbox() {\n this.setState(this.state);\n this.filterPubSub.publish(this.state);\n }\n}\n","import { UISref } from '@uirouter/react';\nimport { get } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\nimport { Dropdown } from 'react-bootstrap';\nimport { Subject } from 'rxjs';\n\nimport type { IManifest } from '@spinnaker/core';\nimport {\n AccountTag,\n CloudProviderLogo,\n CollapsibleSection,\n ConfirmationModalService,\n logger,\n ManifestWriter,\n Overridable,\n SETTINGS,\n Spinner,\n timestamp,\n} from '@spinnaker/core';\n\nimport { RawResourceUtils } from '../RawResourceUtils';\nimport { ManifestLabels } from '../../../manifest/ManifestLabels';\nimport { KubernetesManifestService } from '../../../manifest/manifest.service';\nimport { KubernetesManifestCommandBuilder } from '../../../manifest/manifestCommandBuilder.service';\nimport type { IKubernetesManifestCondition } from '../../../manifest/status/ManifestCondition';\nimport { ManifestCondition } from '../../../manifest/status/ManifestCondition';\nimport { ManifestWizard } from '../../../manifest/wizard/ManifestWizard';\nimport { ManifestEvents } from '../../../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport interface IRawResourceDetailsProps {\n app: any;\n $stateParams: {\n account: string;\n application: string;\n name: string;\n region: string;\n };\n}\n\nexport interface IRawResourcesDetailState {\n account: string;\n application: string;\n name: string;\n region: string;\n loading: boolean;\n manifest?: IManifest;\n}\n\nOverridable('k8s.rawResource.details');\nexport class RawResourceDetails extends React.Component<IRawResourceDetailsProps, IRawResourcesDetailState> {\n constructor(props: IRawResourceDetailsProps) {\n super(props);\n this.state = {\n account: null,\n application: null,\n name: null,\n region: null,\n loading: true,\n manifest: null,\n };\n }\n private destroy$ = new Subject();\n private props$ = new Subject<IRawResourceDetailsProps>();\n private unsubscribeManifest?: () => void;\n\n public componentDidMount() {\n this.setState({\n account: this.props.$stateParams.account,\n application: this.props.$stateParams.application,\n name: this.props.$stateParams.name,\n region: this.props.$stateParams.region,\n });\n const params = {\n account: this.props.$stateParams.account,\n location: this.props.$stateParams.region == '' ? '_' : this.props.$stateParams.region,\n name: this.props.$stateParams.name,\n };\n this.unsubscribeManifest = KubernetesManifestService.subscribe(this.props.app, params, (manifest) => {\n if (this.unsubscribeManifest != null) {\n this.setState({ manifest, loading: false });\n }\n });\n }\n\n public componentWillReceiveProps(nextProps: IRawResourceDetailsProps) {\n this.props$.next(nextProps);\n }\n\n public componentWillUnmount() {\n this.destroy$.next();\n if (this.unsubscribeManifest) {\n this.unsubscribeManifest();\n this.unsubscribeManifest = null;\n }\n }\n\n private editRawResource() {\n const { app } = this.props;\n const { account, application, manifest } = this.state;\n\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n app,\n manifest.manifest,\n { app: application },\n account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: app, command: builtCommand });\n });\n }\n\n private deletedRawResource = () => {\n const { app } = this.props;\n const { account, manifest } = this.state;\n const name = manifest?.manifest?.metadata?.name ?? null;\n const kind = manifest?.manifest?.kind;\n const taskMonitor = {\n application: app,\n title: 'Deleting ' + name,\n };\n\n const submitMethod = () => {\n logger.log({ category: 'RawResource', action: 'Delete clicked' });\n const command = {\n manifestName: this.state.name,\n location: this.state.region,\n account: this.state.account,\n reason: null as string,\n cloudProvider: 'kubernetes',\n options: {\n cascading: false,\n },\n };\n return ManifestWriter.deleteManifest(command, this.props.app);\n };\n\n ConfirmationModalService.confirm({\n header: 'Are you sure you want to delete the ' + kind + ' ' + name + '?',\n buttonText: 'Delete',\n account: account,\n taskMonitorConfig: taskMonitor,\n submitMethod,\n });\n };\n\n private handleEditClick = (): void => {\n logger.log({ category: 'RawResource', action: 'Edit clicked' });\n this.editRawResource();\n };\n\n public render() {\n const { account, region, manifest } = this.state;\n const kind = manifest?.manifest?.kind;\n const apiVersion = manifest?.manifest?.apiVersion;\n const metadata = manifest?.manifest?.metadata;\n const name = metadata?.name;\n const creationUnixMs =\n get(metadata, 'creationTimestamp') && DateTime.fromISO(metadata.creationTimestamp).toMillis();\n\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n {this.state.loading ? (\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n ) : (\n <div className=\"header-text horizontal middle\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"36px\" width=\"36px\" />\n <h3 className=\"horizontal middle space-between flex-1\">\n {kind} {name}\n </h3>\n </div>\n )}\n {!this.state.loading && SETTINGS.kubernetesAdHocInfraWritesEnabled && (\n <div className=\"actions\">\n <Dropdown className=\"dropdown\" id=\"resource-actions-dropdown\">\n <Dropdown.Toggle className=\"btn btn-sm btn-primary dropdown-toggle\">\n <span>{kind} Actions</span>\n </Dropdown.Toggle>\n <Dropdown.Menu>\n <li key=\"action-edit\" id=\"resource-action-edit\">\n <a onClick={this.handleEditClick}>Edit</a>\n </li>\n <li key=\"action-delete\" id=\"resource-action-delete\">\n <a onClick={this.deletedRawResource}>Delete</a>\n </li>\n </Dropdown.Menu>\n </Dropdown>\n </div>\n )}\n </div>\n {!this.state.loading && (\n <div className=\"content\">\n <CollapsibleSection heading=\"Information\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(creationUnixMs)}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={account} />\n </dd>\n <dt>API Version</dt>\n <dd>{apiVersion}</dd>\n <dt>Kind</dt>\n <dd>{kind}</dd>\n <dt>Namespace</dt>\n <dd>{RawResourceUtils.namespaceDisplayName(region)}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection key=\"status\" heading=\"status\" defaultExpanded={true}>\n <ul>\n {(manifest?.manifest?.status?.conditions ?? []).map((condition: IKubernetesManifestCondition) => (\n <li key={condition.type + condition.lastTransitionTime} style={{ marginBottom: '10px' }}>\n <ManifestCondition condition={condition} />\n </li>\n ))}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection key=\"events\" heading=\"events\" defaultExpanded={true}>\n <ManifestEvents manifest={manifest} />\n </CollapsibleSection>\n <CollapsibleSection key=\"labels\" heading=\"labels\" defaultExpanded={true}>\n <ManifestLabels manifest={get(manifest, ['manifest'], {})} />\n </CollapsibleSection>\n </div>\n )}\n </div>\n );\n }\n}\n","import { module } from 'angular';\n\n//import { StateParams } from '@uirouter/angularjs';\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\n\nimport { K8sResources } from './component/K8sResources';\nimport { K8sResourcesFilters } from './component/K8sResourcesFilters';\nimport { RawResourceDetails } from './component/group/RawResourceDetails';\n\nexport interface IKubernetesRawResourceStateParams {\n account: string;\n name: string;\n region: string;\n}\n\nexport const KUBERNETS_RAW_RESOURCE_STATES = 'spinnaker.kubernetes.rawresource.states';\nmodule(KUBERNETS_RAW_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const rawResourceDetails: INestedState = {\n name: 'rawResourceDetails',\n url: '/rawResourceDetails/:account/:region/:name',\n views: {\n 'detail@../insight': {\n component: RawResourceDetails,\n $type: 'react',\n },\n },\n resolve: {\n account: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.account],\n name: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.name],\n region: ['$stateParams', ($stateParams: IKubernetesRawResourceStateParams) => $stateParams.region],\n },\n data: {\n pageTitleDetails: {\n title: 'Raw Resource Details',\n nameParam: 'name',\n accountParam: 'account',\n },\n history: {\n type: 'rawResources',\n },\n },\n };\n const kubernetes: INestedState = {\n url: `/kubernetes`,\n name: 'k8s',\n views: {\n nav: { component: K8sResourcesFilters, $type: 'react' },\n master: { component: K8sResources, $type: 'react' },\n },\n data: {\n pageTitleSection: {\n title: 'Kubernetes',\n },\n },\n children: [],\n };\n\n applicationStateProvider.addInsightState(kubernetes);\n applicationStateProvider.addInsightDetailState(rawResourceDetails);\n },\n]);\n","import { module } from 'angular';\n\nimport { KUBERNETS_RAW_RESOURCE_DATA_SOURCE } from './rawResource.dataSource';\nimport { KUBERNETS_RAW_RESOURCE_STATES } from './rawResource.states';\n\nexport const KUBERNETS_RAW_RESOURCE_MODULE = 'spinnaker.kubernetes.rawresource';\n\nmodule(KUBERNETS_RAW_RESOURCE_MODULE, [KUBERNETS_RAW_RESOURCE_DATA_SOURCE, KUBERNETS_RAW_RESOURCE_STATES]);\n","import { UISref } from '@uirouter/react';\nimport { get } from 'lodash';\nimport { DateTime } from 'luxon';\nimport React from 'react';\n\nimport type { IManifest } from '@spinnaker/core';\nimport { AccountTag, CloudProviderLogo, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport { ManifestLabels } from '../manifest/ManifestLabels';\nimport { KubernetesManifestService } from '../manifest/manifest.service';\nimport { ManifestCondition } from '../manifest/status/ManifestCondition';\nimport { ManifestEvents } from '../pipelines/stages/deployManifest/manifestStatus/ManifestEvents';\n\nexport interface IKubernetesResourceDetailsProps {\n app: any;\n kubernetesResource: any;\n}\n\nexport interface IKubernetesResourceDetailsState {\n manifest?: IManifest;\n loading: boolean;\n}\n\nexport class KubernetesResourceDetails extends React.Component<\n IKubernetesResourceDetailsProps,\n IKubernetesResourceDetailsState\n> {\n private unsubscribeManifest?: () => void;\n\n constructor(props: IKubernetesResourceDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n manifest: null,\n };\n }\n\n public componentDidMount() {\n const { kubernetesResource } = this.props;\n const params = {\n account: kubernetesResource.accountId,\n location: kubernetesResource.region,\n name: kubernetesResource.kubernetesResource,\n };\n this.unsubscribeManifest = KubernetesManifestService.subscribe(this.props.app, params, (manifest) => {\n if (this.unsubscribeManifest != null) {\n this.setState({ manifest, loading: false });\n }\n });\n }\n\n public componentWillUnmount() {\n if (this.unsubscribeManifest) {\n this.unsubscribeManifest();\n this.unsubscribeManifest = null;\n }\n }\n\n public render() {\n const { manifest } = this.state;\n const metadata = get(manifest, ['manifest', 'metadata'], null);\n const creationUnixMs =\n get(metadata, 'creationTimestamp') && DateTime.fromISO(metadata.creationTimestamp).toMillis();\n return (\n <div className=\"details-panel\">\n <div className=\"header\">\n <div className=\"close-button\">\n <a className=\"btn btn-link\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </a>\n </div>\n {this.state.loading ? (\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n ) : (\n <div className=\"header-text horizontal middle\">\n <CloudProviderLogo provider=\"kubernetes\" height=\"36px\" width=\"36px\" />\n <h3 className=\"horizontal middle space-between flex-1\">{get(metadata, ['name'], '')}</h3>\n </div>\n )}\n </div>\n {!this.state.loading && (\n <div className=\"content\">\n <CollapsibleSection heading=\"Information\">\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(creationUnixMs)}</dd>\n <dt>Account</dt>\n <dd>\n <AccountTag account={get(manifest, ['account'], '')} />\n </dd>\n <dt>Namespace</dt>\n <dd>{get(metadata, ['namespace'], '')}</dd>\n <dt>Kind</dt>\n <dd>{get(manifest, ['manifest', 'kind'], '')}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection key=\"status\" heading=\"status\" defaultExpanded={true}>\n <ul>\n {get(manifest, ['manifest', 'status', 'conditions'], []).map((condition) => (\n <li key={condition.type + condition.lastTransitionTime} style={{ marginBottom: '10px' }}>\n <ManifestCondition condition={condition} />\n </li>\n ))}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection key=\"events\" heading=\"events\" defaultExpanded={true}>\n <ManifestEvents manifest={manifest} />\n </CollapsibleSection>\n <CollapsibleSection key=\"labels\" heading=\"labels\" defaultExpanded={true}>\n <ManifestLabels manifest={get(manifest, ['manifest'], {})} />\n </CollapsibleSection>\n </div>\n )}\n </div>\n );\n }\n}\n","import { module } from 'angular';\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\nimport { KubernetesResourceDetails } from './ResourceDetails';\n\nexport interface IKubernetesResourceStateParams {\n provider: string;\n accountId: string;\n region: string;\n kubernetesResource: string;\n}\n\nexport const KUBERNETES_RESOURCE_STATES = 'spinnaker.core.kubernetesResource.states';\nmodule(KUBERNETES_RESOURCE_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const kubernetesResourceDetails: INestedState = {\n name: 'kubernetesResource',\n url: '/manifest/:provider/:accountId/:region/:kubernetesResource',\n views: {\n 'detail@../insight': {\n component: KubernetesResourceDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams.accountId],\n kubernetesResource: ['$stateParams', ($stateParams: IKubernetesResourceStateParams) => $stateParams],\n },\n data: {\n pageTitleDetails: {\n title: 'Generic Kubernetes Resource Details',\n nameParam: 'kubernetesResource',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n history: {\n type: 'kubernetesResource',\n },\n },\n };\n\n applicationStateProvider.addInsightDetailState(kubernetesResourceDetails);\n },\n]);\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport type { Application, IManifest, ISecurityGroupDetail, SecurityGroupReader } from '@spinnaker/core';\nimport { ManifestReader, SECURITY_GROUP_READER, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesSecurityGroup } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface ISecurityGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesSecurityGroupDetailsController implements IController {\n public state = { loading: true };\n public securityGroup: IKubernetesSecurityGroup;\n public manifest: IManifest;\n\n public static $inject = [\n '$uibModal',\n '$state',\n '$scope',\n 'securityGroupReader',\n 'resolvedSecurityGroup',\n 'app',\n '$q',\n ];\n constructor(\n private $uibModal: IModalService,\n private $state: StateService,\n private $scope: IScope,\n private securityGroupReader: SecurityGroupReader,\n resolvedSecurityGroup: ISecurityGroupFromStateParams,\n private app: Application,\n private $q: IQService,\n ) {\n const dataSource = app.getDataSource('securityGroups');\n dataSource\n .ready()\n .then(() => {\n this.extractSecurityGroup(resolvedSecurityGroup);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractSecurityGroup(resolvedSecurityGroup));\n })\n .catch(() => this.autoClose());\n }\n\n public deleteSecurityGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.securityGroup.name,\n namespace: this.securityGroup.region,\n account: this.securityGroup.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n public editSecurityGroup(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.securityGroup.moniker,\n this.securityGroup.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n private extractSecurityGroup({ accountId, name, region }: ISecurityGroupFromStateParams): void {\n this.$q\n .all([\n this.securityGroupReader.getSecurityGroupDetails(\n this.app,\n accountId,\n 'kubernetes',\n region,\n '', // unused vpc id\n name,\n ),\n ManifestReader.getManifest(accountId, region, name),\n ])\n .then(([securityGroup, manifest]: [ISecurityGroupDetail, IManifest]) => {\n if (!securityGroup) {\n return this.autoClose();\n }\n this.securityGroup = securityGroup as IKubernetesSecurityGroup;\n this.manifest = manifest;\n this.state.loading = false;\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 KUBERNETES_SECURITY_GROUP_DETAILS_CTRL = 'spinnaker.kubernetes.securityGroupDetails.controller';\nmodule(KUBERNETES_SECURITY_GROUP_DETAILS_CTRL, [SECURITY_GROUP_READER]).controller(\n 'kubernetesV2SecurityGroupDetailsCtrl',\n KubernetesSecurityGroupDetailsController,\n);\n","import type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class KubernetesSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\n\nimport type { ISecurityGroup } from '@spinnaker/core';\n\nclass KubernetesV2SecurityGroupTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeSecurityGroup(securityGroup: ISecurityGroup): PromiseLike<ISecurityGroup> {\n return this.$q.resolve(securityGroup);\n }\n}\n\nexport const KUBERNETES_SECURITY_GROUP_TRANSFORMER = 'spinnaker.kubernetes.securityGroupTransformer';\nmodule(KUBERNETES_SECURITY_GROUP_TRANSFORMER, []).service(\n 'kubernetesV2SecurityGroupTransformer',\n KubernetesV2SecurityGroupTransformer,\n);\n","import type { Application, IManifest, ITask } from '@spinnaker/core';\nimport { TaskExecutor } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroup } from '../../interfaces';\n\nexport class ManifestTrafficService {\n public static readonly ENABLE_MANIFEST_OPERATION = 'enableManifest';\n public static readonly DISABLE_MANIFEST_OPERATION = 'disableManifest';\n\n public static enable = (manifest: IManifest, application: Application, reason?: string): PromiseLike<ITask> => {\n return TaskExecutor.executeTask({\n job: [\n {\n account: manifest.account,\n cloudProvider: 'kubernetes',\n location: manifest.location,\n manifestName: manifest.name,\n type: ManifestTrafficService.ENABLE_MANIFEST_OPERATION,\n reason,\n },\n ],\n application,\n description: `Enable Manifest: ${manifest.name}`,\n });\n };\n\n public static disable = (manifest: IManifest, application: Application, reason?: string): PromiseLike<ITask> => {\n return TaskExecutor.executeTask({\n job: [\n {\n account: manifest.account,\n cloudProvider: 'kubernetes',\n location: manifest.location,\n manifestName: manifest.name,\n type: ManifestTrafficService.DISABLE_MANIFEST_OPERATION,\n reason,\n },\n ],\n application,\n description: `Disable Manifest: ${manifest.name}`,\n });\n };\n\n public static canDisableServerGroup = (serverGroup: IKubernetesServerGroup): boolean => {\n return (\n ManifestTrafficService.hasLoadBalancers(serverGroup) &&\n !ManifestTrafficService.isManaged(serverGroup) &&\n !serverGroup.disabled\n );\n };\n\n public static canEnableServerGroup = (serverGroup: IKubernetesServerGroup): boolean => {\n return (\n ManifestTrafficService.hasLoadBalancers(serverGroup) &&\n !ManifestTrafficService.isManaged(serverGroup) &&\n serverGroup.disabled\n );\n };\n\n private static hasLoadBalancers = (serverGroup: IKubernetesServerGroup): boolean => {\n return serverGroup.loadBalancers?.length > 0;\n };\n\n private static isManaged = (serverGroup: IKubernetesServerGroup): boolean => {\n return serverGroup.serverGroupManagers && serverGroup.serverGroupManagers.length > 0;\n };\n}\n","import type { StateService } from '@uirouter/angularjs';\nimport type { IController, IQService, IScope } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport type { Application, IManifest, IOwnerOption, IServerGroup } from '@spinnaker/core';\nimport {\n ClusterTargetBuilder,\n ConfirmationModalService,\n ManifestReader,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n SETTINGS,\n} from '@spinnaker/core';\n\nimport type { IKubernetesServerGroup } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestTrafficService } from '../../manifest/traffic/ManifestTrafficService';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\ninterface IServerGroupFromStateParams {\n accountId: string;\n region: string;\n name: string;\n}\n\nclass KubernetesServerGroupDetailsController implements IController {\n public state = { loading: true };\n public serverGroup: IKubernetesServerGroup;\n public manifest: IManifest;\n public entityTagTargets: IOwnerOption[];\n\n public static $inject = ['serverGroup', 'app', '$uibModal', '$scope', '$state', '$q'];\n constructor(\n serverGroup: IServerGroupFromStateParams,\n public app: Application,\n private $uibModal: IModalService,\n private $scope: IScope,\n private $state: StateService,\n private $q: IQService,\n ) {\n const dataSource = this.app.getDataSource('serverGroups');\n dataSource\n .ready()\n .then(() => {\n this.extractServerGroup(serverGroup);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractServerGroup(serverGroup));\n })\n .catch(() => this.autoClose());\n }\n\n private ownerReferences(): any[] {\n const manifest = this.manifest.manifest;\n if (\n manifest != null &&\n manifest.hasOwnProperty('metadata') &&\n manifest.metadata.hasOwnProperty('ownerReferences') &&\n Array.isArray(manifest.metadata.ownerReferences)\n ) {\n return manifest.metadata.ownerReferences;\n } else {\n return [] as any[];\n }\n }\n\n private ownerIsController(ownerReference: any): boolean {\n return ownerReference.hasOwnProperty('controller') && ownerReference.controller === true;\n }\n\n private lowerCaseFirstLetter(s: string): string {\n return s.charAt(0).toLowerCase() + s.slice(1);\n }\n\n public manifestController(): string {\n const controller = this.ownerReferences().find(this.ownerIsController);\n if (typeof controller === 'undefined') {\n return null;\n } else {\n return this.lowerCaseFirstLetter(controller.kind) + ' ' + controller.name;\n }\n }\n\n public canScaleServerGroup(): boolean {\n return this.serverGroup.kind !== 'DaemonSet' && this.manifestController() === null;\n }\n\n public scaleServerGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/scale/scale.html'),\n controller: 'kubernetesV2ManifestScaleCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroup.name,\n namespace: this.serverGroup.namespace,\n account: this.serverGroup.account,\n },\n currentReplicas: this.manifest.manifest.spec.replicas,\n application: this.app,\n },\n });\n }\n\n public canEditServerGroup(): boolean {\n return this.manifestController() === null;\n }\n\n public editServerGroup(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.serverGroup.moniker,\n this.serverGroup.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n public deleteServerGroup(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroup.name,\n namespace: this.serverGroup.namespace,\n account: this.serverGroup.account,\n },\n manifestController: () => this.manifestController(),\n application: this.app,\n },\n });\n }\n\n public canDisable = () => ManifestTrafficService.canDisableServerGroup(this.serverGroup);\n\n public disableServerGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really disable ${this.manifest.name}?`,\n buttonText: 'Disable',\n askForReason: true,\n submitJustWithReason: true,\n submitMethod: ({ reason }: { reason: string }) => ManifestTrafficService.disable(this.manifest, this.app, reason),\n taskMonitorConfig: {\n application: this.app,\n title: `Disabling ${this.manifest.name}`,\n onTaskComplete: () => this.app.getDataSource('serverGroups').refresh(),\n },\n });\n };\n\n public canEnable = () => ManifestTrafficService.canEnableServerGroup(this.serverGroup);\n\n public enableServerGroup = (): void => {\n ConfirmationModalService.confirm({\n header: `Really enable ${this.manifest.name}?`,\n buttonText: 'Enable',\n askForReason: true,\n submitJustWithReason: true,\n submitMethod: ({ reason }: { reason: string }) => ManifestTrafficService.enable(this.manifest, this.app, reason),\n taskMonitorConfig: {\n application: this.app,\n title: `Enabling ${this.manifest.name}`,\n onTaskComplete: () => this.app.getDataSource('serverGroups').refresh(),\n },\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 private extractServerGroup({ accountId, name, region }: IServerGroupFromStateParams): void {\n this.$q\n .all([\n ServerGroupReader.getServerGroup(this.app.name, accountId, region, name),\n ManifestReader.getManifest(accountId, region, name),\n ])\n .then(([serverGroupDetails, manifest]: [IServerGroup, IManifest]) => {\n if (!serverGroupDetails) {\n return this.autoClose();\n }\n this.serverGroup = serverGroupDetails as IKubernetesServerGroup;\n this.entityTagTargets = this.configureEntityTagTargets();\n this.manifest = manifest;\n this.state.loading = false;\n });\n }\n\n private configureEntityTagTargets(): IOwnerOption[] {\n return ClusterTargetBuilder.buildClusterTargets(this.serverGroup);\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_DETAILS_CTRL = 'spinnaker.kubernetes.serverGroup.details.controller';\n\nmodule(KUBERNETES_SERVER_GROUP_DETAILS_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'kubernetesV2ServerGroupDetailsCtrl',\n KubernetesServerGroupDetailsController,\n);\n","import type { IController } from 'angular';\nimport { copy, equals, module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { Application, ICapacity, ServerGroupWriter } from '@spinnaker/core';\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\nimport type { IKubernetesServerGroup } from '../../../interfaces';\n\ninterface IResizeCommand {\n capacity: ICapacity;\n reason: string;\n}\n\nclass KubernetesServerGroupResizeController implements IController {\n public taskMonitor: TaskMonitor;\n public command: IResizeCommand;\n public current: ICapacity;\n public verification = {\n verified: false,\n };\n\n public static $inject = ['serverGroup', '$uibModalInstance', 'serverGroupWriter', 'application'];\n constructor(\n public serverGroup: IKubernetesServerGroup,\n private $uibModalInstance: IModalServiceInstance,\n private serverGroupWriter: ServerGroupWriter,\n private application: Application,\n ) {\n this.taskMonitor = new TaskMonitor({\n title: `Resizing ${this.serverGroup.name}`,\n application,\n modalInstance: $uibModalInstance,\n });\n\n this.current = this.serverGroup.capacity;\n this.command = {\n capacity: copy(this.current),\n reason: null,\n };\n }\n\n public isValid(): boolean {\n return (\n this.verification.verified && this.command.capacity.desired >= 0 && !equals(this.command.capacity, this.current)\n );\n }\n\n public cancel(): void {\n this.$uibModalInstance.dismiss();\n }\n\n public resize(): void {\n this.taskMonitor.submit(() => {\n const payload = {\n capacity: this.command.capacity,\n serverGroupName: this.serverGroup.name,\n account: this.serverGroup.account,\n region: this.serverGroup.region,\n interestingHealthProviderNames: ['KubernetesPod'],\n reason: this.command.reason,\n };\n\n return this.serverGroupWriter.resizeServerGroup(this.serverGroup, this.application, payload);\n });\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_RESIZE_CTRL = 'spinnaker.kubernetes.serverGroup.details.resize.controller';\n\nmodule(KUBERNETES_SERVER_GROUP_RESIZE_CTRL, [SERVER_GROUP_WRITER]).controller(\n 'kubernetesV2ServerGroupResizeCtrl',\n KubernetesServerGroupResizeController,\n);\n","import { module } from 'angular';\n\nimport type { Application } from '@spinnaker/core';\nimport type { IKubernetesManifestCommandData } from '../manifest/manifestCommandBuilder.service';\nimport { KubernetesManifestCommandBuilder } from '../manifest/manifestCommandBuilder.service';\n\nexport class KubernetesV2ServerGroupCommandBuilder {\n public buildNewServerGroupCommand(app: Application): PromiseLike<IKubernetesManifestCommandData> {\n return KubernetesManifestCommandBuilder.buildNewManifestCommand(app);\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_COMMAND_BUILDER = 'spinnaker.kubernetes.serverGroup.commandBuilder.service';\n\nmodule(KUBERNETES_SERVER_GROUP_COMMAND_BUILDER, []).service(\n 'kubernetesV2ServerGroupCommandBuilder',\n KubernetesV2ServerGroupCommandBuilder,\n);\n","import { module } from 'angular';\nimport type { Application } from '@spinnaker/core';\nimport type { IKubernetesServerGroup, IKubernetesServerGroupManager } from '../interfaces';\n\nexport class KubernetesV2ServerGroupTransformer {\n public normalizeServerGroup(\n serverGroup: IKubernetesServerGroup,\n application: Application,\n ): PromiseLike<IKubernetesServerGroup> {\n return application\n .getDataSource('serverGroupManagers')\n .ready()\n .then((sgManagers: IKubernetesServerGroupManager[]) => {\n (serverGroup.serverGroupManagers || []).forEach((managerRef) => {\n const sgManager = sgManagers.find(\n (manager: IKubernetesServerGroupManager) =>\n managerRef.account == manager.account &&\n managerRef.location == manager.region &&\n `${manager.kind} ${managerRef.name}` == manager.name,\n );\n if (sgManager) {\n managerRef.name = sgManager.name;\n }\n });\n return serverGroup;\n });\n }\n}\n\nexport const KUBERNETES_SERVER_GROUP_TRANSFORMER = 'spinnaker.kubernetes.serverGroup.transformer.service';\nmodule(KUBERNETES_SERVER_GROUP_TRANSFORMER, []).service(\n 'kubernetesV2ServerGroupTransformer',\n KubernetesV2ServerGroupTransformer,\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 { orderBy } from 'lodash';\n\nimport type {\n Application,\n IManifest,\n IOwnerOption,\n IServerGroupManager,\n IServerGroupManagerStateParams,\n} from '@spinnaker/core';\nimport { ClusterTargetBuilder, ManifestReader, NameUtils, SETTINGS } from '@spinnaker/core';\n\nimport type { IKubernetesServerGroupManager } from '../../interfaces';\nimport { KubernetesManifestCommandBuilder } from '../../manifest/manifestCommandBuilder.service';\nimport { ManifestWizard } from '../../manifest/wizard/ManifestWizard';\n\nclass KubernetesServerGroupManagerDetailsController implements IController {\n public serverGroupManager: IKubernetesServerGroupManager;\n public state = { loading: true };\n public manifest: IManifest;\n public entityTagTargets: IOwnerOption[];\n\n public static $inject = ['serverGroupManager', '$scope', '$uibModal', 'app', '$state'];\n constructor(\n serverGroupManager: IServerGroupManagerStateParams,\n private $scope: IScope,\n private $uibModal: IModalService,\n public app: Application,\n private $state: StateService,\n ) {\n const dataSource = this.app.getDataSource('serverGroupManagers');\n dataSource\n .ready()\n .then(() => {\n this.extractServerGroupManager(serverGroupManager);\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n dataSource.onRefresh(this.$scope, () => this.extractServerGroupManager(serverGroupManager));\n })\n .catch(() => this.autoClose());\n this.$scope.isDisabled = !SETTINGS.kubernetesAdHocInfraWritesEnabled;\n }\n\n public pauseRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/pause.html'),\n controller: 'kubernetesV2ManifestPauseRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n },\n });\n }\n\n public resumeRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/resume.html'),\n controller: 'kubernetesV2ManifestResumeRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n },\n });\n }\n\n public canUndoRolloutServerGroupManager(): boolean {\n return (\n this.serverGroupManager && this.serverGroupManager.serverGroups && this.serverGroupManager.serverGroups.length > 0\n );\n }\n\n public undoRolloutServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/rollout/undo.html'),\n controller: 'kubernetesV2ManifestUndoRolloutCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n revisions: () => {\n const [, ...rest] = orderBy(this.serverGroupManager.serverGroups, ['moniker.sequence'], ['desc']);\n return rest.map((serverGroup, index) => ({\n label: `${NameUtils.getSequence(serverGroup.moniker.sequence)}${index > 0 ? '' : ' - previous revision'}`,\n revision: serverGroup.moniker.sequence,\n }));\n },\n application: this.app,\n },\n });\n }\n\n public scaleServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/scale/scale.html'),\n controller: 'kubernetesV2ManifestScaleCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n currentReplicas: this.manifest.manifest.spec.replicas,\n application: this.app,\n },\n });\n }\n\n public editServerGroupManager(): void {\n KubernetesManifestCommandBuilder.buildNewManifestCommand(\n this.app,\n this.manifest.manifest,\n this.serverGroupManager.moniker,\n this.serverGroupManager.account,\n ).then((builtCommand) => {\n ManifestWizard.show({ title: 'Edit Manifest', application: this.app, command: builtCommand });\n });\n }\n\n public deleteServerGroupManager(): void {\n this.$uibModal.open({\n templateUrl: require('../../manifest/delete/delete.html'),\n controller: 'kubernetesV2ManifestDeleteCtrl',\n controllerAs: 'ctrl',\n resolve: {\n coordinates: {\n name: this.serverGroupManager.name,\n namespace: this.serverGroupManager.namespace,\n account: this.serverGroupManager.account,\n },\n application: this.app,\n manifestController: (): string => null,\n },\n });\n }\n\n private extractServerGroupManager({ accountId, region, serverGroupManager }: IServerGroupManagerStateParams): void {\n const serverGroupManagerDetails = this.app\n .getDataSource('serverGroupManagers')\n .data.find(\n (manager: IServerGroupManager) =>\n manager.name === serverGroupManager && manager.region === region && manager.account === accountId,\n );\n\n if (!serverGroupManagerDetails) {\n return this.autoClose();\n }\n\n ManifestReader.getManifest(accountId, region, serverGroupManager).then((manifest: IManifest) => {\n this.manifest = manifest;\n this.serverGroupManager = serverGroupManagerDetails;\n this.entityTagTargets = this.configureEntityTagTargets();\n this.state.loading = false;\n });\n }\n\n private configureEntityTagTargets(): IOwnerOption[] {\n return ClusterTargetBuilder.buildManagerClusterTargets(this.serverGroupManager);\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 KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL =\n 'spinnaker.kubernetes.serverGroupManager.details.controller';\nmodule(KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL, []).controller(\n 'kubernetesV2ServerGroupManagerDetailsCtrl',\n KubernetesServerGroupManagerDetailsController,\n);\n","import { ApplicationNameValidator } from '@spinnaker/core';\n\nexport class KubernetesApplicationNameValidator {\n // general k8s resource restriction: 253 characters - https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names\n // safe bet is 63 characters - (see also RFC 1035 or RFC 1123 - both setting DNS label maximum to 63 chars)\n // for service names: - https://github.com/kubernetes/kubernetes/pull/29523 (until K8s 1.4.0 it was 24 characters https://github.com/kubernetes/kubernetes/issues/12463)\n // or annotations: - https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set\n private static MAX_RESOURCE_NAME_LENGTH = 63;\n\n private static validateSpecialCharacters(name: string, errors: string[]): void {\n const alphanumWithDashPattern = /^([a-zA-Z][a-zA-Z0-9-]*)?$/;\n if (!alphanumWithDashPattern.test(name)) {\n errors.push(\n 'The application name must begin with a letter and must contain only letters, digits, or dashes. ' +\n 'No special characters are allowed.',\n );\n }\n }\n\n private static validateLength(name: string, errors: string[]): void {\n if (name.length > KubernetesApplicationNameValidator.MAX_RESOURCE_NAME_LENGTH) {\n errors.push(\n `The maximum length for an application in Kubernetes is ${KubernetesApplicationNameValidator.MAX_RESOURCE_NAME_LENGTH} characters.`,\n );\n }\n }\n\n public validate(name = '') {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n if (name && name.length) {\n KubernetesApplicationNameValidator.validateSpecialCharacters(name, errors);\n KubernetesApplicationNameValidator.validateLength(name, errors);\n }\n\n return {\n warnings,\n errors,\n };\n }\n}\n\nApplicationNameValidator.registerValidator('kubernetes', new KubernetesApplicationNameValidator());\n","import { module } from 'angular';\n\nimport {\n CloudProviderRegistry,\n SETTINGS,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n YAML_EDITOR_COMPONENT,\n} from '@spinnaker/core';\n\nimport './help/kubernetes.help';\nimport { KUBERNETES_INSTANCE_DETAILS_CTRL } from './instance/details/details.controller';\nimport { KUBERNETES_LOAD_BALANCER_DETAILS_CTRL } from './loadBalancer/details/details.controller';\nimport { KUBERNETES_LOAD_BALANCER_TRANSFORMER } from './loadBalancer/transformer';\nimport kubernetesLogo from './logo/kubernetes.logo.svg';\nimport { KUBERNETES_ANNOTATION_CUSTOM_SECTIONS } from './manifest/annotationCustomSections.component';\nimport { KUBERNETES_MANIFEST_ARTIFACT } from './manifest/artifact/artifact.component';\nimport { KUBERNETES_MANIFEST_DELETE_CTRL } from './manifest/delete/delete.controller';\nimport { JSON_EDITOR_COMPONENT } from './manifest/editor/json/jsonEditor.component';\nimport { KUBERNETES_MANIFEST_EVENTS } from './manifest/manifestEvents.component';\nimport { KUBERNETES_MANIFEST_IMAGE_DETAILS } from './manifest/manifestImageDetails.component';\nimport { KUBERNETES_MANIFEST_LABELS } from './manifest/manifestLabels.component';\nimport { KUBERNETES_MANIFEST_QOS } from './manifest/manifestQos.component';\nimport { KUBERNETES_MANIFEST_RESOURCES } from './manifest/manifestResources.component';\nimport { KUBERNETES_ROLLING_RESTART } from './manifest/rollout/RollingRestart';\nimport { KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL } from './manifest/rollout/pause.controller';\nimport { KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL } from './manifest/rollout/resume.controller';\nimport { KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL } from './manifest/rollout/undo.controller';\nimport { KUBERNETES_MANIFEST_SCALE_CTRL } from './manifest/scale/scale.controller';\nimport { KUBERNETES_MANIFEST_SELECTOR } from './manifest/selector/selector.component';\nimport { KUBERNETES_MANIFEST_CONDITION } from './manifest/status/condition.component';\nimport { KUBERNETES_MANIFEST_STATUS } from './manifest/status/status.component';\nimport { ManifestWizard } from './manifest/wizard/ManifestWizard';\nimport './pipelines/stages';\nimport { KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE } from './pipelines/stages/findArtifactsFromResource/findArtifactsFromResourceStage';\nimport { KUBERNETES_SCALE_MANIFEST_STAGE } from './pipelines/stages/scaleManifest/scaleManifestStage';\nimport { KUBERNETES_DISABLE_MANIFEST_STAGE } from './pipelines/stages/traffic/disableManifest.stage';\nimport { KUBERNETES_ENABLE_MANIFEST_STAGE } from './pipelines/stages/traffic/enableManifest.stage';\nimport { KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE } from './pipelines/stages/undoRolloutManifest/undoRolloutManifestStage';\nimport './pipelines/validation/manifestSelector.validator';\nimport { KUBERNETS_RAW_RESOURCE_MODULE } from './rawResource';\nimport { KUBERNETES_RESOURCE_STATES } from './resources/resources.state';\nimport { KUBERNETES_SECURITY_GROUP_DETAILS_CTRL } from './securityGroup/details/details.controller';\nimport { KubernetesSecurityGroupReader } from './securityGroup/securityGroup.reader';\nimport { KUBERNETES_SECURITY_GROUP_TRANSFORMER } from './securityGroup/transformer';\nimport { KUBERNETES_SERVER_GROUP_DETAILS_CTRL } from './serverGroup/details/details.controller';\nimport { KUBERNETES_SERVER_GROUP_RESIZE_CTRL } from './serverGroup/details/resize/resize.controller';\nimport { KUBERNETES_SERVER_GROUP_COMMAND_BUILDER } from './serverGroup/serverGroupCommandBuilder.service';\nimport { KUBERNETES_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroupTransformer.service';\nimport { KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL } from './serverGroupManager/details/details.controller';\nimport './validation/applicationName.validator';\n\nimport './logo/kubernetes.logo.less';\n\nexport const KUBERNETES_MODULE = 'spinnaker.kubernetes';\n\nconst requires = [\n KUBERNETES_INSTANCE_DETAILS_CTRL,\n KUBERNETES_LOAD_BALANCER_DETAILS_CTRL,\n KUBERNETES_SECURITY_GROUP_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_COMMAND_BUILDER,\n KUBERNETES_SERVER_GROUP_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_TRANSFORMER,\n KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL,\n KUBERNETES_SERVER_GROUP_RESIZE_CTRL,\n KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL,\n KUBERNETES_MANIFEST_DELETE_CTRL,\n KUBERNETES_MANIFEST_SCALE_CTRL,\n KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_RESUME_ROLLOUT_CTRL,\n KUBERNETES_MANIFEST_STATUS,\n KUBERNETES_MANIFEST_CONDITION,\n KUBERNETES_MANIFEST_ARTIFACT,\n KUBERNETES_LOAD_BALANCER_TRANSFORMER,\n KUBERNETES_SECURITY_GROUP_TRANSFORMER,\n KUBERNETES_SCALE_MANIFEST_STAGE,\n KUBERNETES_UNDO_ROLLOUT_MANIFEST_STAGE,\n KUBERNETES_FIND_ARTIFACTS_FROM_RESOURCE_STAGE,\n KUBERNETES_MANIFEST_SELECTOR,\n KUBERNETES_MANIFEST_LABELS,\n KUBERNETES_MANIFEST_EVENTS,\n KUBERNETES_MANIFEST_RESOURCES,\n KUBERNETES_MANIFEST_QOS,\n KUBERNETES_ANNOTATION_CUSTOM_SECTIONS,\n KUBERNETES_MANIFEST_IMAGE_DETAILS,\n KUBERNETES_RESOURCE_STATES,\n YAML_EDITOR_COMPONENT,\n JSON_EDITOR_COMPONENT,\n KUBERNETES_ENABLE_MANIFEST_STAGE,\n KUBERNETES_DISABLE_MANIFEST_STAGE,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n KUBERNETES_ROLLING_RESTART,\n];\n\nif (SETTINGS.feature.kubernetesRawResources) {\n requires.push(KUBERNETS_RAW_RESOURCE_MODULE);\n}\n\nmodule(KUBERNETES_MODULE, requires).config(() => {\n CloudProviderRegistry.registerProvider('kubernetes', {\n name: 'Kubernetes',\n adHocInfrastructureWritesEnabled: SETTINGS.kubernetesAdHocInfraWritesEnabled,\n logo: {\n path: kubernetesLogo,\n },\n serverGroup: {\n CloneServerGroupModal: ManifestWizard,\n commandBuilder: 'kubernetesV2ServerGroupCommandBuilder',\n detailsController: 'kubernetesV2ServerGroupDetailsCtrl',\n detailsTemplateUrl: require('./serverGroup/details/details.html'),\n transformer: 'kubernetesV2ServerGroupTransformer',\n },\n serverGroupManager: {\n detailsTemplateUrl: require('./serverGroupManager/details/details.html'),\n detailsController: 'kubernetesV2ServerGroupManagerDetailsCtrl',\n },\n loadBalancer: {\n CreateLoadBalancerModal: ManifestWizard,\n detailsController: 'kubernetesV2LoadBalancerDetailsCtrl',\n detailsTemplateUrl: require('./loadBalancer/details/details.html'),\n transformer: 'kubernetesV2LoadBalancerTransformer',\n },\n securityGroup: {\n reader: KubernetesSecurityGroupReader,\n CreateSecurityGroupModal: ManifestWizard,\n detailsController: 'kubernetesV2SecurityGroupDetailsCtrl',\n detailsTemplateUrl: require('./securityGroup/details/details.html'),\n transformer: 'kubernetesV2SecurityGroupTransformer',\n },\n instance: {\n detailsController: 'kubernetesV2InstanceDetailsCtrl',\n detailsTemplateUrl: require('./instance/details/details.html'),\n },\n unsupportedStageTypes: [\n 'deploy',\n 'destroyServerGroup',\n 'disableCluster',\n 'disableServerGroup',\n 'enableServerGroup',\n 'findImage',\n 'resizeServerGroup',\n 'rollbackCluster',\n 'runJob',\n 'scaleDown',\n 'scaleDownCluster',\n 'shrinkCluster',\n 'upsertLoadBalancers',\n ],\n });\n});\n"],"names":["helpContents","kubernetes.serverGroup.stack","kubernetes.serverGroup.detail","kubernetes.serverGroup.containers","kubernetes.serverGroup.initContainers","kubernetes.serverGroup.terminationGracePeriodSeconds","kubernetes.serverGroup.autoscaling.enabled","kubernetes.serverGroup.autoscaling.min","kubernetes.serverGroup.autoscaling.max","kubernetes.serverGroup.autoscaling.desired","kubernetes.serverGroup.autoscaling.cpuTarget","kubernetes.serverGroup.useSourceCapacity.enabled","kubernetes.serverGroup.deployment.enabled","kubernetes.serverGroup.deployment.strategy","kubernetes.serverGroup.deployment.minReadySeconds","kubernetes.serverGroup.deployment.revisionHistoryLimit","kubernetes.serverGroup.deployment.maxSurge","kubernetes.serverGroup.deployment.maxUnavailable","kubernetes.serverGroup.tolerations.key","kubernetes.serverGroup.tolerations.value","kubernetes.serverGroup.tolerations.operator","kubernetes.serverGroup.tolerations.effect","kubernetes.serverGroup.tolerations.tolerationSeconds","kubernetes.job.parallelism","kubernetes.job.completions","kubernetes.job.deadlineSeconds","kubernetes.containers.image","kubernetes.containers.registry","kubernetes.containers.command","kubernetes.containers.name","kubernetes.containers.pullpolicy","kubernetes.containers.cpu","kubernetes.containers.lifecycle.postStart","kubernetes.containers.lifecycle.preStop","kubernetes.containers.execAction.command","kubernetes.containers.httpGetAction.path","kubernetes.containers.httpGetAction.port","kubernetes.containers.httpGetAction.host","kubernetes.containers.httpGetAction.uriScheme","kubernetes.containers.httpGetAction.httpHeaders","kubernetes.containers.memory","kubernetes.containers.requests","kubernetes.containers.ports.name","kubernetes.containers.ports.containerPort","kubernetes.containers.ports.hostPort","kubernetes.containers.ports.hostIp","kubernetes.containers.ports.protocol","kubernetes.containers.limits","kubernetes.containers.probes.type","kubernetes.containers.probes.initialDelay","kubernetes.containers.probes.timeout","kubernetes.containers.probes.period","kubernetes.containers.probes.successThreshold","kubernetes.containers.probes.failureThreshold","kubernetes.containers.volumemounts.name","kubernetes.containers.volumemounts.mountPath","kubernetes.containers.volumemounts.subPath","kubernetes.namespace","kubernetes.loadBalancer.detail","kubernetes.loadBalancer.stack","kubernetes.service.ports.name","kubernetes.service.ports.port","kubernetes.service.ports.nodePort","kubernetes.service.ports.targetPort","kubernetes.service.ports.protocol","kubernetes.service.type","kubernetes.service.sessionAffinity","kubernetes.service.clusterIp","kubernetes.service.loadBalancerIp","kubernetes.service.externalIps","kubernetes.pod.dnsPolicy","kubernetes.pod.volume","kubernetes.pod.emptydir.medium","kubernetes.pod.volume.persistentvolumeclaim.claim","kubernetes.pod.volume.hostpath.path","kubernetes.pod.volume.secret.secretName","kubernetes.pod.volume.awsElasticBlockStore.volumeId","kubernetes.pod.volume.awsElasticBlockStore.fsType","kubernetes.pod.volume.awsElasticBlockStore.partition","kubernetes.pod.volume.nfs.server","kubernetes.pod.volume.nfs.path","kubernetes.ingress.backend.port","kubernetes.ingress.backend.service","kubernetes.ingress.rules.service","kubernetes.ingress.rules.host","kubernetes.ingress.rules.path","kubernetes.ingress.rules.port","kubernetes.ingress.tls.host","kubernetes.ingress.tls.secret","kubernetes.manifest.account","kubernetes.manifest.cluster","kubernetes.manifest.stackdetail","kubernetes.manifest.delete.gracePeriod","kubernetes.manifest.delete.cascading","kubernetes.manifest.source","kubernetes.manifest.rolloutStrategyOptions","kubernetes.manifest.rolloutStrategy","kubernetes.manifest.expectedArtifact","kubernetes.manifest.requiredArtifactsToBind","kubernetes.manifest.skipExpressionEvaluation","kubernetes.manifest.undoRollout.revisionsBack","kubernetes.manifest.patch.record","kubernetes.manifest.patch.mergeStrategy","kubernetes.runJob.captureSource","kubernetes.runJob.captureSource.containerName","ManifestSource","ManifestSource2","Object","keys","forEach","key","HelpContentsRegistry","register","KubernetesManifestCommandBuilder","[object Object]","command","moniker","app","input","cloneDeep","sourceManifest","sourceMoniker","sourceAccount","has","load","metadata","annotations","dataToFetch","accounts","AccountService","getAllAccountDetailsForProvider","artifactAccounts","getArtifactAccounts","$q","all","then","backingData","account","some","a","name","find","length","manifestArtifactAccount","artifactAccountData","cloudProvider","manifest","manifests","Array","isArray","relationships","loadBalancers","securityGroups","versioned","source","TEXT","ManifestBasicSettings","onAccountSelect","selectedAccount","React","createElement","className","HelpField","id","AccountSelectInput","value","onChange","evt","target","readOnly","provider","WizardManifestBasicSettings","Component","super","arguments","this","accountUpdated","formik","props","values","setFieldValue","ManifestEntry","handleChange","rawManifest","concat","filter","x","setState","first","rest","state","dump","e","YamlEditor","_ManifestWizard","submit","c","copyAndCleanCommand","taskMonitor","ManifestWriter","deployManifest","application","buildNewManifestCommand","assign","loaded","TaskMonitor","title","isNew","modalInstance","modalInstanceEmulation","dismissModal","ReactModal","show","dialogClassName","WizardModal","heading","initialValues","loading","closeModal","submitButtonLabel","render","nextIdx","wizard","Fragment","WizardPage","label","order","innerRef","ref","ManifestWizard","defaultProps","noop","instance","$uibModal","$scope","$state","ready","extractInstance","catch","autoClose","open","templateUrl","controller","coordinates","namespace","instanceFromState","instanceId","retrieveInstance","fetchInstance","consoleOutputInstance","region","humanReadableName","ManifestReader","instanceDetails","flattenDeep","getDataSource","data","dataSource","instances","recentHistoryExtraData","instanceManager","category","serverGroup","RecentHistoryService","addExtraDataToLatest","$$destroyed","params","allowModalToStayOpen","KubernetesInstanceDetailsController","$inject","module","window","angular","templateCache","put","loadBalancer","extractLoadBalancer","resolve","accountId","getManifest","KubernetesLoadBalancerDetailsController","KUBERNETES_LOAD_BALANCER_DETAILS_CTRL","run","KubernetesV2LoadBalancerTransformer","type","instanceCounts","buildInstanceCounts","serverGroups","chain","map","flatten","reduce","acc","camelCase","health","up","down","outOfService","succeeded","failed","unknown","starting","detachedInstances","service","KubernetesAnnotationCustomSections","$sce","$interpolate","get","populateCustomSections","customSections","memo","annotationKey","entry","annotationToEntry","push","sectionTitle","entriesHtmlText","partition","section","isHtml","content","parsed","parseAnnotationKey","resource","includes","replace","trim","sanitizeContent","keyParts","exec","unsanitized","sanitized","DOMPurify","sanitize","ADD_ATTR","trustAsHtml","kubernetesAnnotationCustomSectionsComponent","bindings","controllerAs","template","component","kubernetesManifestArtifactComponent","artifact","KUBERNETES_MANIFEST_ARTIFACT","kubernetesDeletManifestOptionsFormComponent","options","KubernetesManifestDeleteController","$uibModalInstance","manifestController","verification","verified","manifestName","location","reason","cascading","dismiss","payload","copy","orphanDependants","deleteManifest","KUBERNETES_MANIFEST_DELETE_CTRL","JsonEditor","raw","obj","JSON","parse","$log","warn","AceEditor","mode","theme","style","width","fontSize","showGutter","cursorStart","showPrintMargin","minLines","maxLines","highlightActiveLine","setOptions","firstLineNumber","tabSize","showLineNumbers","showFoldWidgets","editorProps","$blockScrolling","Infinity","react2angular","withErrorBoundary","ManifestEvents","events","i","firstTimestamp","lastTimestamp","firstEpochMilliseconds","lastEpochMilliseconds","DateTime","fromISO","toMillis","String","count","pillStyle","relativeTime","message","JobManifestPodLogs","podNamesProviders","JobEventBasedPodNameProvider","linkName","normalizeImage","image","styleInject","css","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","containers","sortBy","spec","initContainers","hasBothContainerTypes","container","ManifestLabels","labels","ManifestQos","description","href","qosClass","qosStyle","HoverablePopover","ManifestResources","metrics","containerToMetricMap","val","containerName","serverGroupManager","onClick","rollingRestartParameters","ConfirmationModalService","confirm","askForReason","header","submitMethod","rollingRestartManifest","taskMonitorConfig","KubernetesManifestPauseRolloutController","pauseRolloutManifest","KUBERNETES_MANIFEST_PAUSE_ROLLOUT_CTRL","KubernetesManifestResumeRolloutController","resumeRolloutManifest","KubernetesManifestUndoRolloutController","revisions","revision","undoRolloutManifest","KUBERNETES_MANIFEST_UNDO_ROLLOUT_CTRL","kubernetesScaleManifestSettingsFormComponent","settings","KubernetesManifestScaleController","currentReplicas","replicas","scaleManifest","KUBERNETES_MANIFEST_SCALE_CTRL","SelectorMode","SelectorMode2","SelectorModeDataMap","Static","selectorDefaults","cluster","criteria","kind","kinds","labelSelectors","Dynamic","Label","selectors","ManifestKindSearchService","SearchService","search","q","response","results","result","kubernetesKind","uniqBy","valueOf","LabelKeyOptions","_LabelEditor","idx","property","onLabelSelectorsChange","ls","removeField","_ls","addField","selector","Select","clearable","option","convertValueStringToArray","placeholder","join","colSpan","LabelEditor","split","v","parseSpinnakerName","spinnakerName","StaticManifestSelectorHandler","handles","handleModeChange","handleKindChange","static","setStateAndUpdateStage","getKind","DynamicManifestSelectorHandler","dynamic","LabelManifestSelectorHandler","ManifestSelector","search$","Subject","destroy$","cb","componentDidMount","loadAccounts","pipe","tap","switchMap","observableFrom","takeUntil","subscribe","resources","getSelectedMode","handleNameChange","componentWillUnmount","next","SETTINGS","providers","kubernetes","defaults","handleAccountChange","details","namespaces","sort","entries","spinnakerKindMap","spinnakerKind","includeSpinnakerKinds","isExpression","every","ns","handleNamespaceChange","selectedNamespace","modeDelegate","selectedName","handleModeSelect","handleClusterChange","clusterName","handleCriteriaChange","handleKindsChange","handleLabelSelectorsChange","handlers","handler","promptTextCreator","text","getFilteredClusters","applications","includeServerGroupsWithManagers","isEmpty","AppListExtractor","getClusters","accountAndNamespaceFilter","clusterFilterForCredentialsAndRegion","hasServerGroupManagers","serverGroupManagerFilter","nameToParseKind","kindFilter","TargetSelect","NgReact","selectedMode","modes","resourceNames","selectedKinds","KindField","StageConfigField","Creatable","k","htmlFor","checked","isLoading","r","ScopeClusterSelector","clusters","model","StageConstants","MANIFEST_CRITERIA_OPTIONS","multi","o","ManifestCondition","condition","transitionTime","lastTransitionTime","status","marginRight","isValid","KUBERNETES_MANIFEST_CONDITION","kubernetesManifestStatusComponent","KUBERNETES_MANIFEST_STATUS","SelectorKind","SelectorKind2","DeleteManifestOptionsForm","onOptionsChange","onCascadingChange","onGracePeriodChange","integerValue","parseInt","gracePeriodSeconds","isNaN","helpKey","min","Number","isInteger","DeleteManifestStageConfig","stage","stageFieldUpdated","mapCriteriaToLabel","formatLabelSelectors","ANY","EQUALS","NOT_EQUALS","CONTAINS","NOT_CONTAINS","EXISTS","NOT_EXISTS","formatted","ManifestCoordinates","manifestNamesByNamespace","names","formatManifestNames","manifestExecutionDetails","stageName","_a","current","context","ExecutionDetailsSection","StageFailureMessage","failureMessage","manifestSelectorValidators","required","field","fieldName","fieldLabel","validate","_pipeline","Registry","pipeline","registerStage","executionDetailsSections","ExecutionDetailsTasks","accountExtractor","configAccountExtractor","validators","_ManifestCopier","useManifest","selectedManifest","onManifestSelected","manifestChanged","manifestValueRenderer","kindLabel","robotToHuman","AccountTag","manifestOptionRenderer","getState","Modal","onHide","ModalClose","onDismiss","Header","Title","Body","TetheredSelect","valueRenderer","optionRenderer","valueKey","ManifestCopier","s","serverGroupManagers","grouped","groupBy","latest","pop","indexOf","MAX_SAFE_INTEGER","CopyFromTemplateButton","toggle","handleManifestSelected","handleCopy","paddingLeft","ManifestBindArtifactsSelector","onChangeBinding","index","binding","slice","onChangeBindings","onRemoveBinding","splice","renderSelect","expectedArtifactId","StageArtifactSelector","onArtifactEdited","onExpectedArtifactSelected","expectedArtifact","excludedArtifactIds","b","excludedArtifactTypePatterns","ArtifactTypePatterns","FRONT50_PIPELINE_TEMPLATE","NamespaceSelector","createable","selectedAccountDetails","n","componentProps","getNamespaceOptions","toString","strategyRedBlack","rolloutStrategies","providerRestricted","defaultTrafficManagementConfig","enabled","services","enableTraffic","strategy","ManifestDeploymentOptions","onConfigChange","updatedConfig","config","set","fetchServices","getServiceOptions","strategyOptionRenderer","Markdown","tag","prevProps","fieldColumns","disabled","DeployManifestStageForm","excludedManifestArtifactTypes","DOCKER_IMAGE","KUBERNETES","MAVEN_FILE","getSourceOptions","ARTIFACT","capitalize","yamlDocumentsToString","handleRawManifestChange","onManifestArtifactSelected","onManifestArtifactEdited","getRequiredArtifacts","requiredArtifactIds","requiredArtifacts","onRequiredArtifactsChanged","isTextManifest","overrideNamespace","accountName","CheckboxInput","overrideNamespaceChange","namespaceOverride","RadioButtonInput","StageArtifactSelectorDelegate","manifestArtifact","manifestArtifactId","skipExpressionEvaluation","trafficManagement","DeployManifestStageConfig","fetchAccounts","initialStageConfig","FormikStageConfig","updateStage","STATUS_PILLS","available","stable","paused","DeployManifestStatusPills","statusKey","statusDescription","statusClass","isStable","isUnstableWithMessage","ManifestDetailsLink","spinnakerKindStateMap","url","loadUrl","kindMap","toLowerCase","stateKey","resourceRegion","reg","getAccountDetails","spinnakerKindFromKubernetesKind","getStateParams","ReactInjector","canOpen","ManifestStatus","CopyToClipboard","displayText","toolTip","ManifestYaml","manifestText","modalTitle","_KubernetesManifestService","fn","updateManifest","onRefresh","apiVersion","scopedKind","parts","BUILT_IN_GROUPS","apiGroup","isCRDGroup","KubernetesManifestService","DeployStatus","subscriptions","manifestIds","componentDidUpdate","unsubscribeAll","_prevProps","prevState","m","manifestIdentifier","unsubscribe","subscribeToManifestUpdates","stageManifestToIManifest","stageManifestToManifestParams","updated","findIndex","sub","subscription","artifacts","sectionName","currentSection","uid","ExecutionArtifactTab","producesArtifacts","supportsCustomTimeout","replicaSetManifests","maxVersionHistory","artifactExtractor","ExpectedArtifactService","accumulateArtifacts","artifactRemover","ArtifactReferenceService","removeArtifactFromFields","PatchManifestOptionsForm","record","onRecordChange","onStrategyChange","PatchManifestStageForm","EMBEDDED_BASE64","onManifestSelectorChange","patchBody","mergeStrategy","PatchManifestStageConfig","PatchStatus","KubernetesV2RunJobStageConfig","credentials","outputOptions","accountChanged","updateStageField","sourceChanged","event","consumeArtifactSource","propertyFile","onArtifactSelected","consumeArtifactId","consumeArtifact","consumeArtifactAccount","artifactAccount","updatePropertyFile","initRawManifest","outputSource","logSourceForm","artifactForm","RunJobExecutionDetails","podsStatuses","p","startTime","deployedName","externalLink","pods","createdPodNames","DefaultPodNameProvider","jobStatus","JobStageExecutionLogs","alias","addAliasToConfig","restartable","_validator","_config","KubernetesV2FindArtifactsFromResourceConfigCtrl","handleManifestSelectorChange","$applyAsync","$parent","defaultSelection","STAGE_NAME","KubernetesV2ScaleManifestConfigCtrl","defaultOptions","ManifestTrafficStageConfig","EXECUTION_ARTIFACT_TAB","KubernetesV2UndoRolloutManifestConfigCtrl","numRevisionsBack","PipelineConfigValidator","registerValidator","fetchK8sResources","REST","path","formatK8sResources","_","ApplicationDataSourceRegistry","registerDataSource","INFRASTRUCTURE_KEY","sref","primary","icon","iconName","loader","onLoad","providerField","credentialsField","regionField","defaultData","_RawResourceUtils","GLOBAL_LABEL","RawResourceUtils","_FiltersPubSub","subscribers","intances","subscriber","FiltersPubSub","RawResource","UISrefActive","class","UISref","to","CloudProviderLogo","height","displayName","namespaceDisplayName","RawResourceGroup","onHeaderClick","bind","children","RawResourceGroups","groups","buildGroupByModel","groupTitle","resourceKey","K8sResources","filterPubSub","getInstance","onFilterChange","groupByChanged","filters","rawResources","localeCompare","opts","FormField","charAt","toUpperCase","substr","ReactSelectInput","inputClassName","stringOptions","matchFilters","accountMatch","kindMatch","namespaceMatch","K8sResourcesFilters","displayNamespaces","displayNs","FilterSection","expanded","FilterCheckbox","sortFilterType","onCheckbox","onNsCheckbox","publish","Overridable","RawResourceDetails","props$","deletedRawResource","_b","_c","_d","buttonText","logger","log","action","handleEditClick","editRawResource","$stateParams","unsubscribeManifest","nextProps","builtCommand","_e","_f","creationUnixMs","creationTimestamp","Spinner","size","kubernetesAdHocInfraWritesEnabled","Dropdown","Toggle","Menu","CollapsibleSection","defaultExpanded","timestamp","conditions","marginBottom","APPLICATION_STATE_PROVIDER","applicationStateProvider","rawResourceDetails","views","detail@../insight","$type","pageTitleDetails","nameParam","accountParam","history","nav","master","pageTitleSection","addInsightState","addInsightDetailState","KUBERNETS_RAW_RESOURCE_MODULE","KubernetesResourceDetails","kubernetesResource","kubernetesResourceDetails","regionParam","securityGroupReader","resolvedSecurityGroup","extractSecurityGroup","securityGroup","go","KubernetesSecurityGroupDetailsController","KUBERNETES_SECURITY_GROUP_DETAILS_CTRL","KubernetesSecurityGroupReader","indexedSecurityGroups","securityGroupId","KubernetesV2SecurityGroupTransformer","_ManifestTrafficService","ManifestTrafficService","ENABLE_MANIFEST_OPERATION","DISABLE_MANIFEST_OPERATION","enable","TaskExecutor","executeTask","job","disable","canDisableServerGroup","hasLoadBalancers","isManaged","canEnableServerGroup","KubernetesServerGroupDetailsController","canDisable","disableServerGroup","submitJustWithReason","canEnable","enableServerGroup","onTaskComplete","refresh","extractServerGroup","isDisabled","ownerReferences","ownerReference","hasOwnProperty","lowerCaseFirstLetter","ServerGroupReader","serverGroupDetails","entityTagTargets","configureEntityTagTargets","ClusterTargetBuilder","KubernetesServerGroupResizeController","serverGroupWriter","capacity","desired","equals","serverGroupName","interestingHealthProviderNames","resizeServerGroup","KUBERNETES_SERVER_GROUP_RESIZE_CTRL","SERVER_GROUP_WRITER","KubernetesV2ServerGroupCommandBuilder","KUBERNETES_SERVER_GROUP_COMMAND_BUILDER","KubernetesV2ServerGroupTransformer","sgManagers","managerRef","sgManager","manager","KUBERNETES_SERVER_GROUP_TRANSFORMER","extractServerGroupManager","NameUtils","sequence","serverGroupManagerDetails","KubernetesServerGroupManagerDetailsController","KUBERNETES_SERVER_GROUP_MANAGER_DETAILS_CTRL","_KubernetesApplicationNameValidator","errors","test","MAX_RESOURCE_NAME_LENGTH","validateSpecialCharacters","validateLength","warnings","KubernetesApplicationNameValidator","ApplicationNameValidator","KUBERNETES_MODULE","YAML_EDITOR_COMPONENT","STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT","feature","kubernetesRawResources","requires","CloudProviderRegistry","adHocInfrastructureWritesEnabled","logo","CloneServerGroupModal","commandBuilder","detailsController","detailsTemplateUrl","transformer","CreateLoadBalancerModal","reader","CreateSecurityGroupModal","unsupportedStageTypes"],"mappings":"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"}
|