From ecb2dd17aea1958e78089ed58f18a19ed502998f Mon Sep 17 00:00:00 2001 From: Jammy Louie Date: Thu, 4 Jul 2019 10:14:30 -0400 Subject: [PATCH] feat(gce): Support new artifact model for deploy SG (#7178) --- .../core/src/artifact/ArtifactIconService.ts | 1 + .../core/src/artifact/ArtifactTypes.ts | 1 + .../artifacts/custom/CustomArtifactEditor.tsx | 116 ++++++++++++++++++ .../artifacts/custom/custom.artifact.ts | 2 +- .../config/triggers/artifacts/index.ts | 3 + .../common/deployInitializer.component.ts | 2 + .../serverGroupCommandBuilder.service.js | 2 + .../location/basicSettings.controller.js | 41 ++++++- .../wizard/location/basicSettings.html | 39 +++--- 9 files changed, 183 insertions(+), 24 deletions(-) create mode 100644 app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/CustomArtifactEditor.tsx diff --git a/app/scripts/modules/core/src/artifact/ArtifactIconService.ts b/app/scripts/modules/core/src/artifact/ArtifactIconService.ts index 8fd4bddb1cb..669accc795a 100644 --- a/app/scripts/modules/core/src/artifact/ArtifactIconService.ts +++ b/app/scripts/modules/core/src/artifact/ArtifactIconService.ts @@ -26,6 +26,7 @@ export class ArtifactIconService { } } +ArtifactIconService.registerType(ArtifactTypePatterns.CUSTOM_OBJECT, unknownArtifactPath); ArtifactIconService.registerType(ArtifactTypePatterns.DOCKER_IMAGE, require('./icons/docker-image-artifact.svg')); ArtifactIconService.registerType(ArtifactTypePatterns.KUBERNETES, require('./icons/kubernetes-artifact.svg')); ArtifactIconService.registerType(ArtifactTypePatterns.EMBEDDED_BASE64, require('./icons/embedded-base64-artifact.svg')); diff --git a/app/scripts/modules/core/src/artifact/ArtifactTypes.ts b/app/scripts/modules/core/src/artifact/ArtifactTypes.ts index 7d1b5afb535..e9d8228f820 100644 --- a/app/scripts/modules/core/src/artifact/ArtifactTypes.ts +++ b/app/scripts/modules/core/src/artifact/ArtifactTypes.ts @@ -4,6 +4,7 @@ export interface IArtifactTypePatterns { export const ArtifactTypePatterns: IArtifactTypePatterns = { BITBUCKET_FILE: /bitbucket\/file/, + CUSTOM_OBJECT: /custom\/object/, DOCKER_IMAGE: /docker\/image/, EMBEDDED_BASE64: /embedded\/base64/, GCS_OBJECT: /gcs\/object/, diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/CustomArtifactEditor.tsx b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/CustomArtifactEditor.tsx new file mode 100644 index 00000000000..0ded9b50fce --- /dev/null +++ b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/CustomArtifactEditor.tsx @@ -0,0 +1,116 @@ +import * as React from 'react'; +import { cloneDeep, extend } from 'lodash'; + +import { ArtifactTypePatterns } from 'core/artifact'; +import { IArtifactEditorProps, IArtifactKindConfig } from 'core/domain'; +import { StageConfigField } from 'core/pipeline'; +import { SpelText } from 'core/widgets'; + +import { ArtifactEditor } from '../ArtifactEditor'; +import { singleFieldArtifactEditor } from '../singleFieldArtifactEditor'; + +const TYPE = 'custom/object'; + +export const CustomMatch: IArtifactKindConfig = { + label: 'Custom', + typePattern: ArtifactTypePatterns.CUSTOM_OBJECT, + type: TYPE, + description: 'A custom-defined artifact.', + key: 'custom', + isDefault: false, + isMatch: true, + editCmp: singleFieldArtifactEditor('name', TYPE, 'Reference', '', ''), +}; + +export const CustomDefault: IArtifactKindConfig = { + label: 'Custom', + typePattern: ArtifactTypePatterns.CUSTOM_OBJECT, + type: TYPE, + description: 'A custom-defined artifact.', + key: 'default.custom', + isDefault: true, + isMatch: false, + editCmp: class extends ArtifactEditor { + constructor(props: IArtifactEditorProps) { + super(props, TYPE); + } + + private onTypeChanged = (type: string) => { + this.updateArtifact({ type }); + }; + + private onNameChanged = (name: string) => { + this.updateArtifact({ name }); + }; + + private onVersionChanged = (version: string) => { + this.updateArtifact({ version }); + }; + + private onLocationChanged = (location: string) => { + this.updateArtifact({ location }); + }; + + private onReferenceChanged = (reference: string) => { + this.updateArtifact({ reference }); + }; + + private updateArtifact = (changes: any) => { + const clonedArtifact = cloneDeep(this.props.artifact); + extend(clonedArtifact, changes); + this.props.onChange(clonedArtifact); + }; + + public render() { + return ( + <> + + + + + + + + + + + + + + + + + ); + } + }, +}; diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/custom.artifact.ts b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/custom.artifact.ts index dae5c7b8d8d..17466dc73fd 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/custom.artifact.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/custom/custom.artifact.ts @@ -13,7 +13,7 @@ module(CUSTOM_ARTIFACT, []) .config(() => { Registry.pipeline.registerCustomArtifactKind({ label: 'Custom', - description: 'A custom-defined artifact.', + description: 'A custom-defined artifact. (Deprecated)', key: 'custom', customKind: true, isDefault: true, diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/index.ts b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/index.ts index f9b861a13f5..d7f4f67475e 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/index.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/index.ts @@ -2,6 +2,7 @@ import { IArtifactKindConfig } from 'core/domain'; import { Base64Match, Base64Default } from './base64/Base64ArtifactEditor'; import { BitbucketMatch, BitbucketDefault } from './bitbucket/BitbucketArtifactEditor'; +import { CustomMatch, CustomDefault } from './custom/CustomArtifactEditor'; import { DockerMatch, DockerDefault } from './docker/DockerArtifactEditor'; import { GcsMatch, GcsDefault } from './gcs/GcsArtifactEditor'; import { GithubMatch, GithubDefault } from './github/GithubArtifactEditor'; @@ -19,6 +20,8 @@ export const artifactKindConfigs: IArtifactKindConfig[] = [ Base64Default, BitbucketMatch, BitbucketDefault, + CustomMatch, + CustomDefault, DockerMatch, DockerDefault, GcsMatch, diff --git a/app/scripts/modules/core/src/serverGroup/configure/common/deployInitializer.component.ts b/app/scripts/modules/core/src/serverGroup/configure/common/deployInitializer.component.ts index 7a145c3c3b5..12833011359 100644 --- a/app/scripts/modules/core/src/serverGroup/configure/common/deployInitializer.component.ts +++ b/app/scripts/modules/core/src/serverGroup/configure/common/deployInitializer.component.ts @@ -90,6 +90,8 @@ export class DeployInitializerController implements IController { viewState.hideClusterNamePreview = baseCommand.viewState.hideClusterNamePreview || false; viewState.templatingEnabled = true; viewState.imageSourceText = baseCommand.viewState.imageSourceText; + viewState.pipeline = baseCommand.viewState.pipeline; + viewState.stage = baseCommand.viewState.stage; Object.assign(command, baseCommand.viewState.overrides || {}); Object.assign(baseCommand, command); } diff --git a/app/scripts/modules/google/src/serverGroup/configure/serverGroupCommandBuilder.service.js b/app/scripts/modules/google/src/serverGroup/configure/serverGroupCommandBuilder.service.js index 64d88fb700e..8dc6711a348 100644 --- a/app/scripts/modules/google/src/serverGroup/configure/serverGroupCommandBuilder.service.js +++ b/app/scripts/modules/google/src/serverGroup/configure/serverGroupCommandBuilder.service.js @@ -394,8 +394,10 @@ module.exports = angular const expectedArtifacts = ExpectedArtifactService.getExpectedArtifactsAvailableToStage(currentStage, pipeline); return $q.when({ viewState: { + pipeline, expectedArtifacts: expectedArtifacts, requiresTemplateSelection: true, + stage: currentStage, }, }); } diff --git a/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.controller.js b/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.controller.js index dfad097f1a7..9e305d8aedb 100644 --- a/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.controller.js +++ b/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.controller.js @@ -2,8 +2,15 @@ const angular = require('angular'); import { Observable, Subject } from 'rxjs'; +import { extend } from 'lodash'; -import { IMAGE_READER, ExpectedArtifactSelectorViewController, NgGCEImageArtifactDelegate } from '@spinnaker/core'; +import { + ArtifactTypePatterns, + ExpectedArtifactSelectorViewController, + excludeAllTypesExcept, + IMAGE_READER, + NgGCEImageArtifactDelegate, +} from '@spinnaker/core'; module.exports = angular .module('spinnaker.google.serverGroup.configure.wizard.basicSettings.controller', [ @@ -85,6 +92,38 @@ module.exports = angular this.imageSources = ['artifact', 'priorStage']; + this.excludedImageArtifactTypes = excludeAllTypesExcept(ArtifactTypePatterns.CUSTOM_OBJECT); + + this.onImageArtifactEdited = artifact => { + $scope.$applyAsync(() => { + $scope.command.imageArtifactId = null; + $scope.command.imageArtifact = artifact; + }); + }; + + this.onImageArtifactSelected = expectedArtifact => { + this.onChangeImageArtifactId(expectedArtifact.id); + }; + + this.onChangeImageArtifactId = artifactId => { + $scope.$applyAsync(() => { + $scope.command.imageArtifactId = artifactId; + $scope.command.imageArtifact = null; + }); + }; + + this.onImageArtifactAccountSelected = accountName => { + $scope.$applyAsync(() => { + $scope.command.imageAccountName = accountName; + }); + }; + + this.updatePipeline = changes => { + $scope.$applyAsync(() => { + extend($scope.$parent.pipeline, changes); + }); + }; + const gceImageDelegate = new NgGCEImageArtifactDelegate($scope); $scope.gceImageArtifact = { showCreateArtifactForm: false, diff --git a/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.html b/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.html index ad281c9d186..6a61978ee8d 100644 --- a/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.html +++ b/app/scripts/modules/google/src/serverGroup/configure/wizard/location/basicSettings.html @@ -89,30 +89,25 @@ help-field-key="gce.image.source" > - - - - - - +