@spinnaker/docker 2026.2.2 → 2026.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docker.module.d.ts +1 -1
- package/dist/image/DockerChartAndTagSelector.d.ts +1 -0
- package/dist/image/DockerImageAndTagSelector.d.ts +1 -0
- package/dist/image/DockerImageReader.d.ts +6 -6
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline/stages/bake/dockerBakeStage.d.ts +31 -2
- package/dist/pipeline/trigger/DockerTriggerTemplate.d.ts +2 -1
- package/package.json +2 -6
- package/src/docker.module.ts +1 -6
- package/src/image/DockerChartAndTagSelector.tsx +24 -12
- package/src/image/DockerImageAndTagSelector.spec.tsx +159 -0
- package/src/image/DockerImageAndTagSelector.tsx +24 -12
- package/src/image/DockerImageReader.spec.ts +21 -0
- package/src/image/DockerImageReader.ts +10 -6
- package/src/index.ts +2 -1
- package/src/pipeline/stages/bake/dockerBakeStage.spec.tsx +187 -0
- package/src/pipeline/stages/bake/dockerBakeStage.tsx +313 -0
- package/src/pipeline/trigger/DockerTrigger.tsx +2 -2
- package/src/pipeline/trigger/DockerTriggerTemplate.spec.tsx +124 -0
- package/src/pipeline/trigger/DockerTriggerTemplate.tsx +25 -13
- package/dist/pipeline/stages/bake/bakeExecutionDetails.controller.d.ts +0 -2
- package/src/pipeline/stages/bake/bakeExecutionDetails.controller.js +0 -36
- package/src/pipeline/stages/bake/bakeExecutionDetails.html +0 -47
- package/src/pipeline/stages/bake/bakeStage.html +0 -32
- package/src/pipeline/stages/bake/dockerBakeStage.js +0 -81
package/dist/docker.module.d.ts
CHANGED
|
@@ -40,6 +40,7 @@ export interface IDockerChartAndTagSelectorState {
|
|
|
40
40
|
export declare class DockerChartAndTagSelector extends React.Component<IDockerChartAndTagSelectorProps, IDockerChartAndTagSelectorState> {
|
|
41
41
|
static defaultProps: Partial<IDockerChartAndTagSelectorProps>;
|
|
42
42
|
private unmounted;
|
|
43
|
+
private imageRequest;
|
|
43
44
|
private images;
|
|
44
45
|
private accounts;
|
|
45
46
|
private registryMap;
|
|
@@ -40,6 +40,7 @@ export interface IDockerImageAndTagSelectorState {
|
|
|
40
40
|
export declare class DockerImageAndTagSelector extends React.Component<IDockerImageAndTagSelectorProps, IDockerImageAndTagSelectorState> {
|
|
41
41
|
static defaultProps: Partial<IDockerImageAndTagSelectorProps>;
|
|
42
42
|
private unmounted;
|
|
43
|
+
private imageRequest;
|
|
43
44
|
private images;
|
|
44
45
|
private accounts;
|
|
45
46
|
private registryMap;
|
|
@@ -6,12 +6,12 @@ export interface IDockerImage extends IImage {
|
|
|
6
6
|
tag: string;
|
|
7
7
|
}
|
|
8
8
|
export declare class DockerImageReader {
|
|
9
|
-
static getImage(imageName: string, region: string, credentials: string):
|
|
10
|
-
static findImages(params: IFindImageParams):
|
|
11
|
-
static findTags(params: IFindTagsParams):
|
|
9
|
+
static getImage(imageName: string, region: string, credentials: string): Promise<IDockerImage>;
|
|
10
|
+
static findImages(params: IFindImageParams, signal?: AbortSignal): Promise<IDockerImage[]>;
|
|
11
|
+
static findTags(params: IFindTagsParams, signal?: AbortSignal): Promise<string[]>;
|
|
12
12
|
}
|
|
13
13
|
export declare class DockerChartImageReader {
|
|
14
|
-
static getImage(imageName: string, region: string, credentials: string):
|
|
15
|
-
static findImages(params: IFindImageParams):
|
|
16
|
-
static findTags(params: IFindTagsParams):
|
|
14
|
+
static getImage(imageName: string, region: string, credentials: string): Promise<IDockerImage>;
|
|
15
|
+
static findImages(params: IFindImageParams, signal?: AbortSignal): Promise<IDockerImage[]>;
|
|
16
|
+
static findTags(params: IFindTagsParams, signal?: AbortSignal): Promise<string[]>;
|
|
17
17
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{REST as e,RetryService as t,AccountService as a,ValidationMessage as s,HelpField as i,Tooltip as n,SETTINGS as o,Registry as r,BakeExecutionLabel as l,AuthenticationService as c,BakeryReader as g,TetheredSelect as m,Spinner as p}from"@spinnaker/core";import d,{groupBy as u,reduce as h,uniq as f,trim as v,get as y}from"lodash";import E from"react";import b from"react-select";import{module as N}from"angular";import I from"@uirouter/angularjs";import{$q as k}from"ngimport";import{Subject as C,from as z}from"rxjs";import{debounceTime as _,switchMap as w}from"rxjs/operators";class L{static getImage(t,a,s){return e("/images").path(s,a,t).query({provider:"docker"}).get().then(e=>e&&e.length?e[0]:null).catch(()=>null)}static findImages(a){return t.buildRetrySequence(()=>e("/images/find").query(a).get(),e=>e.length>0,10,1e3).then(e=>e).catch(()=>[])}static findTags(a){return t.buildRetrySequence(()=>e("/images/tags").query(a).get(),e=>e.length>0,10,1e3).then(e=>e).catch(()=>[])}}class M{static getImage(t,a,s){return e("/charts").path(s,a,t).query({provider:"docker"}).get().then(e=>e&&e.length?e[0]:null).catch(()=>null)}static findImages(a){return t.buildRetrySequence(()=>e("/charts/find").query(a).get(),e=>e.length>0,10,1e3).then(e=>e).catch(()=>[])}static findTags(a){return t.buildRetrySequence(()=>e("/charts/tags").query(a).get(),e=>e.length>0,10,1e3).then(e=>e).catch(()=>[])}}class R{static splitImageId(e=""){let t;t=e.includes("@")?e.split("@"):e.split(":");const a=t[0],s=a.split("/").slice(0,-1).join("/"),i=t.length>1?t.slice(1).join(":"):"";let n,o;return i&&(i.startsWith("sha256:")?o=i:n=i),{organization:s,repository:a,digest:o,tag:n}}static generateImageId(e){if(!e.repository||!e.digest&&!e.tag)return;let t;return t=e.digest?`${e.repository}@${e.digest}`:`${e.repository}:${e.tag}`,t}}const x=["organization","repository","tag","digest"],T=[{label:"Manually",value:!0},{label:"Select from list",value:!1}];class S extends E.Component{constructor(e){super(e),this.unmounted=!1,this.cachedValues={},this.handleRefreshImages=()=>{this.refreshImages(this.props)},this.lookupTypeChanged=e=>{const t=e.value,a=this.state.lookupType,s=this.props[a],i=this.cachedValues[t];this.valueChanged(a,void 0),this.cachedValues[t]&&this.valueChanged(t,i),this.setState({lookupType:t}),this.cachedValues[a]=s},this.showManualInput=e=>{if(!e){const e=R.splitImageId(this.props.imageId||"");this.props.onChange(e),this.state.switchedManualWarning&&this.setState({switchedManualWarning:void 0,missingFields:void 0})}this.setState({defineManually:e})};const t=e.account?[{label:e.account,value:e.account}]:[],a=e.organization&&e.organization.length?[{label:e.organization,value:e.organization}]:[],s=e.repository&&e.repository.length?[{label:e.repository,value:e.repository}]:[],i=e.tag&&e.tag.length?[{label:e.tag,value:e.tag}]:[],n=R.splitImageId(e.imageId),o=e.allowManualDefinition&&Boolean(e.imageId&&e.imageId.includes("${"));this.state={accountOptions:t,switchedManualWarning:void 0,imagesLoaded:!1,imagesLoading:!1,organizationOptions:a,repositoryOptions:s,defineManually:o,tagOptions:i,lookupType:e.digest||n.digest?"digest":"tag"}}getAccountMap(e){const t=u(e.filter(e=>e.account),"account");return h(t,(e,t,a)=>(e[a]=f(t.map(e=>`${e.repository.split("/").slice(0,-1).join("/")}`)),e),{})}getRegistryMap(e){return e.reduce((e,t)=>(e[t.account]=t.registry,e),{})}getOrganizationMap(e){const t=u(e.filter(e=>e.repository),e=>`${e.account}/${e.repository.split("/").slice(0,-1).join("/")}`);return h(t,(e,t,a)=>(e[a]=f(t.map(e=>e.repository)),e),{})}getRepositoryMap(e){const t=u(e.filter(e=>e.account),"repository");return h(t,(e,t,a)=>(e[a]=f(t.map(e=>e.tag)),e),{})}getOrganizationsList(e){return e&&e[this.props.showRegistry?this.props.account:this.props.registry]||[]}getRepositoryList(e,t,a){if(e){return e[`${this.props.showRegistry?this.props.account:a}/${t||""}`]||[]}return[]}getTags(e,t,a){let s=[];return this.props.specifyTagByRegex?e&&""===v(e)&&(e=void 0):t&&(s=t[a]||[],s.includes(e)||!e||e.includes("${")||(e=void 0)),{tag:e,tags:s}}componentWillReceiveProps(e){!this.images||["account","showRegistry"].some(t=>this.props[t]!==e[t])?this.refreshImages(e):["organization","registry","repository"].some(t=>this.props[t]!==e[t])&&this.updateThings(e),e.imageId&&e.imageId.includes("${")&&this.setState({defineManually:!0})}componentWillUnmount(){this.unmounted=!0}synchronizeChanges(e,t){const{organization:a,repository:s,tag:i,digest:n}=e;if(this.props.onChange){const e=R.generateImageId({organization:a,repository:s,tag:i,digest:n}),o={};i!==this.props.tag&&(o.tag=i),e!==this.props.imageId&&(o.imageId=e),a!==this.props.organization&&(o.organization=a),t!==this.props.registry&&(o.registry=t),s!==this.props.repository&&(o.repository=s),n!==this.props.digest&&(o.digest=n),Object.keys(o).length>0&&this.props.onChange(o)}}updateThings(e,t=!1){if(!this.repositoryMap||this.unmounted)return;const{imageId:a,specifyTagByRegex:s}=e;let{organization:i,registry:n,repository:o}=e;e.showRegistry&&(n=this.registryMap[e.account]);const r=!i||this.organizations.includes(i)||i.includes("${");r||(i="");const l=this.getRepositoryList(this.organizationMap,i,n),c=!o||o.includes("${")||l.includes(o);c||(o="");const{tag:g,tags:m}=this.getTags(e.tag,this.repositoryMap,o),p=g===e.tag||s,d={accountOptions:this.newAccounts.sort().map(e=>({label:e,value:e})),organizationOptions:this.organizations.filter(e=>e).sort().map(e=>({label:e,value:e})),imagesLoaded:!0,repositoryOptions:l.sort().map(e=>({label:e,value:e})),tagOptions:m.sort().map(e=>({label:e,value:e}))};if(!a||this.state.imagesLoaded&&!t||r&&c&&p)a&&a.includes("${")||this.synchronizeChanges(this.state.defineManually?R.splitImageId(a):{organization:i,repository:o,tag:g,digest:this.props.digest},n);else{d.defineManually=!0;const e=[];r||e.push("organization"),c||e.push("image"),p||e.push("tag"),d.missingFields=e,d.switchedManualWarning=`Could not find ${e.join(" or ")}, switched to manual entry`}this.setState(d)}initializeImages(e){if(this.state.imagesLoading)return;const{showRegistry:t,account:a,registry:s}=e,i={provider:"dockerRegistry",account:t?a:s};this.setState({imagesLoading:!0}),L.findImages(i).then(t=>{this.images=t,this.registryMap=this.getRegistryMap(this.images),this.accountMap=this.getAccountMap(this.images),this.newAccounts=this.accounts||Object.keys(this.accountMap),this.organizationMap=this.getOrganizationMap(this.images),this.repositoryMap=this.getRepositoryMap(this.images),this.organizations=this.getOrganizationsList(this.accountMap),this.updateThings(e,!0)}).finally(()=>{this.unmounted||this.setState({imagesLoading:!1})})}refreshImages(e){this.initializeImages(e)}initializeAccounts(e){let{account:t}=e;a.listAccounts("dockerRegistry").then(a=>{const s=a.map(e=>e.name);this.props.showRegistry&&!t&&(t=s[0]),this.accounts=s,this.refreshImages({...e,account:t})})}isNew(){const{account:e,organization:t,registry:a,repository:s,tag:i}=this.props;return!(e||t||a||s||i)}componentDidMount(){this.props.deferInitialization||!this.props.registry&&!this.isNew()||this.initializeAccounts(this.props)}valueChanged(e,t){const a={[e]:t};if(x.some(t=>t===e)){const{organization:e,repository:t,tag:s,digest:i}=this.props,n={organization:e,repository:t,tag:s,digest:i,...a},o=R.generateImageId(n);a.imageId=o}this.props.onChange&&this.props.onChange(a)}render(){const{account:e,allowManualDefinition:t,digest:a,imageId:o,organization:r,repository:l,showDigest:c,showRegistry:g,specifyTagByRegex:m,tag:p}=this.props,{accountOptions:d,switchedManualWarning:u,missingFields:h,imagesLoading:f,lookupType:v,organizationOptions:y,repositoryOptions:N,defineManually:I,tagOptions:k}=this.state,C=R.splitImageId(o),z=E.createElement("div",{className:"sp-formItem groupHeader"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Define Image ID"),E.createElement("div",{className:"sp-formActions sp-formActions--mobile"},E.createElement("span",{className:"action"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{value:I,disabled:f||!t,onChange:e=>this.showManualInput(e.value),options:T,clearable:!1}))))),_=u?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"}),E.createElement("div",{className:"sp-formItem__right"},E.createElement(s,{type:"warning",message:E.createElement(E.Fragment,null,u,(h||[]).map(e=>E.createElement("div",{key:e},E.createElement(i,{expand:!0,id:`pipeline.config.docker.trigger.missing.${e}`}))))}))):null;if(I)return E.createElement("div",{className:"sp-formGroup"},z,E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Image ID"),E.createElement("div",{className:"sp-formActions sp-formActions--mobile"},E.createElement("span",{className:"action"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{className:"form-control input-sm",value:o||"",onChange:e=>this.valueChanged("imageId",e.target.value)}))))),_);const w=g?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Registry Name")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{value:e,disabled:f,onChange:e=>this.valueChanged("account",e?e.value:""),options:d,isLoading:f})),E.createElement("span",{className:"sp-formActions sp-formActions--web"},E.createElement("span",{className:"action"},E.createElement(n,{value:f?"Images refreshing":"Refresh images list"},E.createElement("i",{className:"fa icon-button-refresh-arrows "+(f?"fa-spin":""),onClick:this.handleRefreshImages}))))))):null,L=E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Organization")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},r.includes("${")?E.createElement("input",{disabled:f,className:"form-control input-sm",value:r||"",onChange:e=>this.valueChanged("organization",e.target.value)}):E.createElement(b,{value:r||"",disabled:f,onChange:e=>this.valueChanged("organization",e&&e.value||""),placeholder:"No organization",options:y,isLoading:f}))))),M=E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Image")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},l.includes("${")?E.createElement("input",{className:"form-control input-sm",disabled:f,value:l||"",onChange:e=>this.valueChanged("repository",e.target.value)}):E.createElement(b,{value:l||"",disabled:f,onChange:e=>this.valueChanged("repository",e&&e.value||""),options:N,required:!0,isLoading:f}))))),x="tag"===v?m?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Tag")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{type:"text",className:"form-control input-sm",value:p||"",disabled:f||!l,onChange:e=>this.valueChanged("tag",e.target.value)}))),E.createElement(i,{id:"pipeline.config.docker.trigger.tag",expand:!0}))):E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Tag")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},p&&p.includes("${")?E.createElement("input",{className:"form-control input-sm",disabled:f,value:p||"",onChange:e=>this.valueChanged("tag",e.target.value),required:!0}):E.createElement(E.Fragment,null,E.createElement(b,{value:p||"",disabled:f||!l,isLoading:f,onChange:e=>this.valueChanged("tag",e?e.value:void 0),options:k,placeholder:"No tag",required:!0}),E.createElement(i,{id:"pipeline.config.docker.trigger.tag.additionalInfo",expand:!0})))))):null,S="digest"===v?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Digest ",E.createElement(i,{id:"pipeline.config.docker.trigger.digest"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{className:"form-control input-sm",placeholder:"sha256:abc123",value:a||C.digest||"",onChange:e=>this.valueChanged("digest",e.target.value),required:!0}))))):null,O=c?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Type")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{clearable:!1,value:v,options:[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}],onChange:this.lookupTypeChanged}))))):null;return E.createElement("div",{className:"sp-formGroup"},z,w,L,M,O,S,x)}}S.defaultProps={organization:"",registry:"",repository:"",showDigest:!0,allowManualDefinition:!0};const O="spinnaker.docker.pipeline.stage.bake.executionDetails.controller";N(O,[I]).controller("dockerBakeExecutionDetailsCtrl",["$scope","$stateParams","executionDetailsSectionService","$interpolate",function(e,t,a,s){e.configSections=["bakeConfig","taskStatus"];const i=()=>{e.detailsSection=t.details,e.provider=e.stage.context.cloudProviderType||"docker",e.bakeryDetailUrl=s(e.roscoMode&&o.roscoDetailUrl?o.roscoDetailUrl:o.bakeryDetailUrl)},n=()=>a.synchronizeSection(e.configSections,i);n(),e.$on("$stateChangeSuccess",n)}]);const D="spinnaker.docker.pipeline.stage.bakeStage";N(D,[O]).config(function(){r.pipeline.registerStage({provides:"bake",cloudProvider:"docker",label:"Bake",description:"Bakes an image",templateUrl:"docker/src/pipeline/stages/bake/bakeStage.html",executionDetailsUrl:"docker/src/pipeline/stages/bake/bakeExecutionDetails.html",executionLabelComponent:l,extraLabelLines:e=>e.masterStage.context.allPreviouslyBaked||e.masterStage.context.somePreviouslyBaked?1:0,supportsCustomTimeout:!0,validators:[{type:"requiredField",fieldName:"package"}],restartable:!0})}).controller("dockerBakeStageCtrl",["$scope","$q",function(e,t){e.stage.region="global",e.stage.user||(e.stage.user=c.getAuthenticatedUser().name),e.viewState={loading:!0},e.$watch("stage",function(){d.forOwn(e.stage,function(t,a){""===t&&delete e.stage[a]})},!0),e.viewState.providerSelected=!0,t.all([g.getBaseOsOptions("docker"),g.getBaseLabelOptions()]).then(function([t,a]){e.baseOsOptions=t.baseImages,e.baseLabelOptions=a,!e.stage.baseOs&&e.baseOsOptions&&e.baseOsOptions.length&&(e.stage.baseOs=e.baseOsOptions[0].id),!e.stage.baseLabel&&e.baseLabelOptions&&e.baseLabelOptions.length&&(e.stage.baseLabel=e.baseLabelOptions[0]),e.viewState.loading=!1})}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("docker/src/pipeline/stages/bake/bakeStage.html",'<div ng-controller="dockerBakeStageCtrl as bakeStageCtrl">\n <stage-config-field label="Package" help-key="pipeline.config.bake.package">\n <input type="text" class="form-control input-sm" ng-model="stage.package" />\n </stage-config-field>\n <stage-config-field label="Organization" help-key="pipeline.config.docker.bake.organization">\n <input type="text" class="form-control input-sm" ng-model="stage.organization" />\n </stage-config-field>\n <stage-config-field label="Image Name" help-key="pipeline.config.docker.bake.targetImage">\n <input type="text" class="form-control input-sm" ng-model="stage.ami_name" />\n </stage-config-field>\n <stage-config-field label="Image tag" help-key="pipeline.config.docker.bake.targetImageTag">\n <input type="text" class="form-control input-sm" ng-model="stage.extendedAttributes[\'docker_target_image_tag\']" />\n </stage-config-field>\n <stage-config-field label="Base OS">\n <bake-stage-choose-os model="stage.baseOs" base-os-options="baseOsOptions"></bake-stage-choose-os>\n </stage-config-field>\n\n <stage-config-field label="Base Label">\n <label class="radio-inline" ng-repeat="baseLabel in baseLabelOptions">\n <input type="radio" ng-model="stage.baseLabel" ng-value="baseLabel" />\n {{baseLabel}}\n </label>\n </stage-config-field>\n <stage-config-field label="Rebake">\n <div class="checkbox" style="margin-bottom: 0">\n <label>\n <input type="checkbox" ng-model="stage.rebake" />\n Rebake image without regard to the status of any existing bake\n </label>\n </div>\n </stage-config-field>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("docker/src/pipeline/stages/bake/bakeExecutionDetails.html",'<div ng-controller="dockerBakeExecutionDetailsCtrl">\n <execution-details-section-nav sections="configSections"></execution-details-section-nav>\n <div class="step-section-details" ng-if="detailsSection === \'bakeConfig\'">\n <div class="row">\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt if-multiple-providers>Provider</dt>\n <dd if-multiple-providers>Docker</dd>\n <dt>Organization</dt>\n <dd>{{stage.context.organization}}</dd>\n <dt>Image Name</dt>\n <dd>{{stage.context.ami_name}}</dd>\n <dt>Image Tag</dt>\n <dd>{{stage.context.extendedAttributes[\'docker_target_image_tag\']}}</dd>\n <dt>Image</dt>\n <dd>{{stage.context.ami}}</dd>\n </dl>\n </div>\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt>Base OS</dt>\n <dd>{{stage.context.baseOs}}</dd>\n <dt>Region</dt>\n <dd>{{stage.context.region}}</dd>\n <dt>Package</dt>\n <dd>{{stage.context.package}}</dd>\n <dt>Label</dt>\n <dd>{{stage.context.baseLabel}}</dd>\n </dl>\n </div>\n </div>\n <stage-failure-message stage="stage" message="stage.failureMessage"></stage-failure-message>\n\n <div class="row" ng-if="stage.context.region && stage.context.status.resourceId">\n <div class="col-md-12">\n <div class="alert alert-{{stage.isFailed ? \'danger\' : \'info\'}}">\n <a target="_blank" href="{{ bakeryDetailUrl(stage) }}"> View Bakery Details </a>\n </div>\n </div>\n </div>\n </div>\n <div class="step-section-details" ng-if="detailsSection === \'taskStatus\'">\n <div class="row">\n <execution-step-details item="stage"></execution-step-details>\n </div>\n </div>\n</div>\n')}]);const $=["organization","repository","tag","digest"],A=[{label:"Manually",value:!0},{label:"Select from list",value:!1}];class q extends E.Component{constructor(e){super(e),this.unmounted=!1,this.cachedValues={},this.handleRefreshImages=()=>{this.refreshImages(this.props)},this.lookupTypeChanged=e=>{const t=e.value,a=this.state.lookupType,s=this.props[a],i=this.cachedValues[t];this.valueChanged(a,void 0),this.cachedValues[t]&&this.valueChanged(t,i),this.setState({lookupType:t}),this.cachedValues[a]=s},this.showManualInput=e=>{if(!e){const e=R.splitImageId(this.props.imageId||"");this.props.onChange(e),this.state.switchedManualWarning&&this.setState({switchedManualWarning:void 0,missingFields:void 0})}this.setState({defineManually:e})};const t=e.account?[{label:e.account,value:e.account}]:[],a=e.organization&&e.organization.length?[{label:e.organization,value:e.organization}]:[],s=e.repository&&e.repository.length?[{label:e.repository,value:e.repository}]:[],i=e.tag&&e.tag.length?[{label:e.tag,value:e.tag}]:[],n=R.splitImageId(e.imageId),o=e.allowManualDefinition&&Boolean(e.imageId&&e.imageId.includes("${"));this.state={accountOptions:t,switchedManualWarning:void 0,imagesLoaded:!1,imagesLoading:!1,organizationOptions:a,repositoryOptions:s,defineManually:o,tagOptions:i,lookupType:e.digest||n.digest?"digest":"tag"}}getAccountMap(e){const t=u(e.filter(e=>e.account),"account");return h(t,(e,t,a)=>(e[a]=f(t.map(e=>`${e.repository.split("/").slice(0,-1).join("/")}`)),e),{})}getRegistryMap(e){return e.reduce((e,t)=>(e[t.account]=t.registry,e),{})}getOrganizationMap(e){const t=u(e.filter(e=>e.repository),e=>`${e.account}/${e.repository.split("/").slice(0,-1).join("/")}`);return h(t,(e,t,a)=>(e[a]=f(t.map(e=>e.repository)),e),{})}getRepositoryMap(e){const t=u(e.filter(e=>e.account),"repository");return h(t,(e,t,a)=>(e[a]=f(t.map(e=>e.tag)),e),{})}getOrganizationsList(e){return e&&e[this.props.showRegistry?this.props.account:this.props.registry]||[]}getRepositoryList(e,t,a){if(e){return e[`${this.props.showRegistry?this.props.account:a}/${t||""}`]||[]}return[]}getTags(e,t,a){let s=[];return this.props.specifyTagByRegex?e&&""===v(e)&&(e=void 0):t&&(s=t[a]||[],s.includes(e)||!e||e.includes("${")||(e=void 0)),{tag:e,tags:s}}componentWillReceiveProps(e){!this.images||["account","showRegistry"].some(t=>this.props[t]!==e[t])?this.refreshImages(e):["organization","registry","repository"].some(t=>this.props[t]!==e[t])&&this.updateThings(e),e.imageId&&e.imageId.includes("${")&&this.setState({defineManually:!0})}componentWillUnmount(){this.unmounted=!0}synchronizeChanges(e,t){const{organization:a,repository:s,tag:i,digest:n}=e;if(this.props.onChange){const e=R.generateImageId({organization:a,repository:s,tag:i,digest:n}),o={};i!==this.props.tag&&(o.tag=i),e!==this.props.imageId&&(o.imageId=e),a!==this.props.organization&&(o.organization=a),t!==this.props.registry&&(o.registry=t),s!==this.props.repository&&(o.repository=s),n!==this.props.digest&&(o.digest=n),Object.keys(o).length>0&&this.props.onChange(o)}}updateThings(e,t=!1){if(!this.repositoryMap||this.unmounted)return;const{imageId:a,specifyTagByRegex:s}=e;let{organization:i,registry:n,repository:o}=e;e.showRegistry&&(n=this.registryMap[e.account]);const r=!i||this.organizations.includes(i)||i.includes("${");r||(i="");const l=this.getRepositoryList(this.organizationMap,i,n),c=!o||o.includes("${")||l.includes(o);c||(o="");const{tag:g,tags:m}=this.getTags(e.tag,this.repositoryMap,o),p=g===e.tag||s,d={accountOptions:this.newAccounts.sort().map(e=>({label:e,value:e})),organizationOptions:this.organizations.filter(e=>e).sort().map(e=>({label:e,value:e})),imagesLoaded:!0,repositoryOptions:l.sort().map(e=>({label:e,value:e})),tagOptions:m.sort().map(e=>({label:e,value:e}))};if(!a||this.state.imagesLoaded&&!t||r&&c&&p)a&&a.includes("${")||this.synchronizeChanges(this.state.defineManually?R.splitImageId(a):{organization:i,repository:o,tag:g,digest:this.props.digest},n);else{d.defineManually=!0;const e=[];r||e.push("organization"),c||e.push("image"),p||e.push("tag"),d.missingFields=e,d.switchedManualWarning=`Could not find ${e.join(" or ")}, switched to manual entry`}this.setState(d)}initializeImages(e){if(this.state.imagesLoading)return;const{showRegistry:t,account:a,registry:s}=e,i={provider:"dockerRegistry",account:t?a:s};this.setState({imagesLoading:!0}),M.findImages(i).then(t=>{this.images=t,this.registryMap=this.getRegistryMap(this.images),this.accountMap=this.getAccountMap(this.images),this.newAccounts=this.accounts||Object.keys(this.accountMap),this.organizationMap=this.getOrganizationMap(this.images),this.repositoryMap=this.getRepositoryMap(this.images),this.organizations=this.getOrganizationsList(this.accountMap),this.updateThings(e,!0)}).finally(()=>{this.unmounted||this.setState({imagesLoading:!1})})}refreshImages(e){this.initializeImages(e)}initializeAccounts(e){let{account:t}=e;a.listAccounts("dockerRegistry").then(a=>{const s=a.map(e=>e.name);this.props.showRegistry&&!t&&(t=s[0]),this.accounts=s,this.refreshImages({...e,account:t})})}isNew(){const{account:e,organization:t,registry:a,repository:s,tag:i}=this.props;return!(e||t||a||s||i)}componentDidMount(){this.props.deferInitialization||!this.props.registry&&!this.isNew()||this.initializeAccounts(this.props)}valueChanged(e,t){const a={[e]:t};if($.some(t=>t===e)){const{organization:e,repository:t,tag:s,digest:i}=this.props,n={organization:e,repository:t,tag:s,digest:i,...a},o=R.generateImageId(n);a.imageId=o}this.props.onChange&&this.props.onChange(a)}render(){const{account:e,allowManualDefinition:t,digest:a,imageId:o,organization:r,repository:l,showDigest:c,showRegistry:g,specifyTagByRegex:m,tag:p}=this.props,{accountOptions:d,switchedManualWarning:u,missingFields:h,imagesLoading:f,lookupType:v,organizationOptions:y,repositoryOptions:N,defineManually:I,tagOptions:k}=this.state,C=R.splitImageId(o),z=E.createElement("div",{className:"sp-formItem groupHeader"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Define Image ID"),E.createElement("div",{className:"sp-formActions sp-formActions--mobile"},E.createElement("span",{className:"action"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{value:I,disabled:f||!t,onChange:e=>this.showManualInput(e.value),options:A,clearable:!1}))))),_=u?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"}),E.createElement("div",{className:"sp-formItem__right"},E.createElement(s,{type:"warning",message:E.createElement(E.Fragment,null,u,(h||[]).map(e=>E.createElement("div",{key:e},E.createElement(i,{expand:!0,id:`pipeline.config.docker.trigger.missing.${e}`}))))}))):null;if(I)return E.createElement("div",{className:"sp-formGroup"},z,E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Image ID"),E.createElement("div",{className:"sp-formActions sp-formActions--mobile"},E.createElement("span",{className:"action"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{className:"form-control input-sm",value:o||"",onChange:e=>this.valueChanged("imageId",e.target.value)}))))),_);const w=g?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Registry Name")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{value:e,disabled:f,onChange:e=>this.valueChanged("account",e?e.value:""),options:d,isLoading:f})),E.createElement("span",{className:"sp-formActions sp-formActions--web"},E.createElement("span",{className:"action"},E.createElement(n,{value:f?"Images refreshing":"Refresh images list"},E.createElement("i",{className:"fa icon-button-refresh-arrows "+(f?"fa-spin":""),onClick:this.handleRefreshImages}))))))):null,L=E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Organization")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},r.includes("${")?E.createElement("input",{disabled:f,className:"form-control input-sm",value:r||"",onChange:e=>this.valueChanged("organization",e.target.value)}):E.createElement(b,{value:r||"",disabled:f,onChange:e=>this.valueChanged("organization",e&&e.value||""),placeholder:"No organization",options:y,isLoading:f}))))),M=E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Image")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},l.includes("${")?E.createElement("input",{className:"form-control input-sm",disabled:f,value:l||"",onChange:e=>this.valueChanged("repository",e.target.value)}):E.createElement(b,{value:l||"",disabled:f,onChange:e=>this.valueChanged("repository",e&&e.value||""),options:N,required:!0,isLoading:f}))))),x="tag"===v?m?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Tag")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{type:"text",className:"form-control input-sm",value:p||"",disabled:f||!l,onChange:e=>this.valueChanged("tag",e.target.value)}))),E.createElement(i,{id:"pipeline.config.docker.trigger.tag",expand:!0}))):E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Tag")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},p&&p.includes("${")?E.createElement("input",{className:"form-control input-sm",disabled:f,value:p||"",onChange:e=>this.valueChanged("tag",e.target.value),required:!0}):E.createElement(E.Fragment,null,E.createElement(b,{value:p||"",disabled:f||!l,isLoading:f,onChange:e=>this.valueChanged("tag",e?e.value:void 0),options:k,placeholder:"No tag",required:!0}),E.createElement(i,{id:"pipeline.config.docker.trigger.tag.additionalInfo",expand:!0})))))):null,T="digest"===v?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Digest ",E.createElement(i,{id:"pipeline.config.docker.trigger.digest"}))),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement("input",{className:"form-control input-sm",placeholder:"sha256:abc123",value:a||C.digest||"",onChange:e=>this.valueChanged("digest",e.target.value),required:!0}))))):null,S=c?E.createElement("div",{className:"sp-formItem"},E.createElement("div",{className:"sp-formItem__left"},E.createElement("div",{className:"sp-formLabel"},"Type")),E.createElement("div",{className:"sp-formItem__right"},E.createElement("div",{className:"sp-form"},E.createElement("span",{className:"field"},E.createElement(b,{clearable:!1,value:v,options:[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}],onChange:this.lookupTypeChanged}))))):null;return E.createElement("div",{className:"sp-formGroup"},z,w,L,M,S,T,x)}}q.defaultProps={organization:"",registry:"",repository:"",showDigest:!0,allowManualDefinition:!0};const F=[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}];class B extends E.Component{constructor(e){super(e),this.queryStream=new C,this.handleQuery=()=>{const e=this.props.command.trigger;return"helm/oci"===e.type?z(M.findTags({provider:"dockerRegistry",account:e.account,repository:e.repository})):z(L.findTags({provider:"dockerRegistry",account:e.account,repository:e.repository}))},this.lookupTypeChanged=e=>{const t=e.value;this.updateArtifact(this.props.command,"tag"===t?this.state.selectedTag:this.state.digest),this.setState({lookupType:t})},this.updateSelectedTag=e=>{this.updateArtifact(this.props.command,e),this.setState({selectedTag:e}),this.props.command.triggerInvalid=!1},this.updateDigest=e=>{this.updateArtifact(this.props.command,e),this.setState({digest:e})},this.tagLoadSuccess=e=>{const{command:t}=this.props,a=t.trigger,s={};s.tags=e||[];const i=s.tags.find(e=>e===a.tag);i&&(s.selectedTag=i,this.updateSelectedTag(i)),s.tagsLoading=!1,this.setState(s)},this.tagLoadFailure=()=>{this.setState({tagsLoading:!1,loadError:!0})},this.initialize=()=>{const{command:e}=this.props;this.props.updateCommand("triggerInvalid",!0),this.props.updateCommand("extraFields",{tag:y(e,"extraFields.tag",""),artifacts:y(e,"extraFields.artifacts","")}),this.subscription&&this.subscription.unsubscribe(),"docker"!==e.trigger.type&&"helm/oci"!==e.trigger.type||(this.subscription=this.queryStream.pipe(_(250),w(this.handleQuery)).subscribe(this.tagLoadSuccess,this.tagLoadFailure),this.searchTags())},this.searchTags=(e="")=>{this.setState({tags:[`<span>Finding tags${e&&` matching ${e}`}...</span>`]}),this.queryStream.next()},this.state={digest:"",tags:[],tagsLoading:!0,loadError:!1,lookupType:"tag",selectedTag:""}}static formatLabel(e){return k.when(`(Docker Registry) ${e.account?e.account+":":""} ${e.repository||""}`)}updateArtifact(e,t){this.props.updateCommand("extraFields.tag",t);const a=e.trigger;if(a&&a.repository){let e="";a.registry&&(e+=a.registry+"/"),e+=a.repository;let s="";s="digest"===this.state.lookupType?`${e}@${t}`:`${e}:${t}`;const i="docker"===a.type?"docker/image":"helm/image";this.props.updateCommand("extraFields.artifacts",[{type:i,name:e,version:t,reference:s}])}}componentDidMount(){this.initialize()}componentWillUnmount(){this.subscription&&this.subscription.unsubscribe()}render(){const{digest:e,tags:t,tagsLoading:a,loadError:s,selectedTag:n,lookupType:o}=this.state,r=t.map(e=>({value:e}));return E.createElement(E.Fragment,null,E.createElement("div",{className:"form-group"},E.createElement("div",{className:"sm-label-right col-md-4"},"Type"),E.createElement("div",{className:"col-md-3"},E.createElement(m,{clearable:!1,value:o,options:F,onChange:this.lookupTypeChanged}))),"tag"===o&&E.createElement("div",{className:"form-group"},E.createElement("label",{className:"col-md-4 sm-label-right"},"Tag"),a&&E.createElement("div",{className:"col-md-6"},E.createElement("div",{className:"form-control-static text-center"},E.createElement(p,{size:"small"}))),s&&E.createElement("div",{className:"col-md-6"},"Error loading tags!"),!a&&E.createElement("div",{className:"col-md-6"},0===t.length&&E.createElement("div",null,E.createElement("p",{className:"form-control-static"},"No tags found")),t.length>0&&E.createElement(m,{options:r,optionRenderer:e=>E.createElement("span",null,e.value),clearable:!1,value:n,valueRenderer:e=>E.createElement("span",null,E.createElement("strong",null,e.value)),onChange:e=>this.updateSelectedTag(e.value),placeholder:"Search tags..."}))),"digest"===o&&E.createElement("div",{className:"form-group"},E.createElement("label",{className:"col-md-4 sm-label-right"},"Digest ",E.createElement(i,{id:"pipeline.config.docker.trigger.digest"})),E.createElement("div",{className:"col-md-6"},E.createElement("input",{value:e,onChange:e=>this.updateDigest(e.target.value),className:"form-control input-sm",required:!0}))))}}const W=e=>{const t=e.trigger;return E.createElement("li",null,t.repository,":",t.tag)};r.pipeline.registerTrigger({label:"Docker Registry",description:"Executes the pipeline on an image update",key:"docker",component:function(e){const{formik:t}=e,a=t.values;return E.createElement("div",{className:"form-horizontal"},E.createElement(S,{allowManualDefinition:!1,specifyTagByRegex:!0,account:a.account,organization:a.organization,registry:a.registry,repository:a.repository,tag:a.tag,showRegistry:!0,onChange:t=>{const{imageId:a,...s}=t;e.triggerUpdated(s)},showDigest:!1}))},manualExecutionComponent:B,executionStatusComponent:W,executionTriggerLabel:()=>"Docker Registry",validators:[{type:"requiredField",fieldName:"account",message:"<strong>Registry</strong> is a required field for Docker Registry triggers."},{type:"requiredField",fieldName:"repository",message:"<strong>Image</strong> is a required field for Docker Registry triggers."},{type:"serviceAccountAccess",preventSave:!0,message:"You do not have access to the service account configured in this pipeline's Docker Registry trigger.\n You will not be able to save your edits to this pipeline."}]}),r.pipeline.registerTrigger({label:"Helm Docker Registry",description:"Executes the pipeline on an helm/image update",key:"helm/oci",component:function(e){const{formik:t}=e,a=t.values;return E.createElement("div",{className:"form-horizontal"},E.createElement(q,{allowManualDefinition:!1,specifyTagByRegex:!0,account:a.account,organization:a.organization,registry:a.registry,repository:a.repository,tag:a.tag,showRegistry:!0,onChange:t=>{const{imageId:a,...s}=t;e.triggerUpdated(s)},showDigest:!1}))},manualExecutionComponent:B,executionStatusComponent:W,executionTriggerLabel:()=>"Helm Docker Registry",validators:[{type:"requiredField",fieldName:"account",message:"<strong>Registry</strong> is a required field for Docker Registry triggers."},{type:"requiredField",fieldName:"repository",message:"<strong>Image</strong> is a required field for Docker Registry triggers."},{type:"serviceAccountAccess",preventSave:!0,message:"You do not have access to the service account configured in this pipeline's Docker Registry trigger.\n You will not be able to save your edits to this pipeline."}]});const j="spinnaker.docker";N(j,[D]);export{j as DOCKER_MODULE,M as DockerChartImageReader,S as DockerImageAndTagSelector,L as DockerImageReader,R as DockerImageUtils};
|
|
1
|
+
import{isEqual as e,groupBy as t,reduce as a,uniq as s,trim as i,get as n}from"lodash";import r from"react";import{BakeryReader as o,AuthenticationService as l,Spinner as c,FormikStageConfig as m,Registry as g,BakeExecutionLabel as p,ExecutionDetailsTasks as d,StageConfigField as u,ExecutionDetailsSection as h,StageFailureMessage as f,SETTINGS as v,REST as y,RetryService as E,AccountService as b,ValidationMessage as N,HelpField as I,Tooltip as k,TetheredSelect as C}from"@spinnaker/core";import z from"react-select";import{Subject as R,from as _}from"rxjs";import{debounceTime as w,switchMap as L}from"rxjs/operators";function M(e,t){var a,s;const i=function(e){return Object.keys(e).reduce((t,a)=>(""!==e[a]&&(t[a]=e[a]),t),{})}({...e});return i.region=i.region||"global",i.user=i.user||t.user,!i.baseOs&&(null==(a=t.baseOsOptions)?void 0:a.length)&&(i.baseOs=t.baseOsOptions[0].id),!i.baseLabel&&(null==(s=t.baseLabelOptions)?void 0:s.length)&&(i.baseLabel=t.baseLabelOptions[0]),i}function O(e){var t;const a=e.context||{};return(v.bakeryDetailUrl||"").replace(/\{\{context\.region\}\}/g,a.region||"").replace(/\{\{context\.status\.resourceId\}\}/g,(null==(t=a.status)?void 0:t.resourceId)||"")}function T({baseLabelOptions:e,baseOsOptions:t,formik:a}){const s=a.values,i=s.extendedAttributes||{},n=e=>t=>{a.setFieldValue(e,t.target.value)};return r.createElement(r.Fragment,null,r.createElement(u,{label:"Package",helpKey:"pipeline.config.bake.package"},r.createElement("input",{type:"text",className:"form-control input-sm",value:s.package||"",onChange:n("package")})),r.createElement(u,{label:"Organization",helpKey:"pipeline.config.docker.bake.organization"},r.createElement("input",{type:"text",className:"form-control input-sm",value:s.organization||"",onChange:n("organization")})),r.createElement(u,{label:"Image Name",helpKey:"pipeline.config.docker.bake.targetImage"},r.createElement("input",{type:"text",className:"form-control input-sm",value:s.ami_name||"",onChange:n("ami_name")})),r.createElement(u,{label:"Image tag",helpKey:"pipeline.config.docker.bake.targetImageTag"},r.createElement("input",{type:"text",className:"form-control input-sm",value:i.docker_target_image_tag||"",onChange:n("extendedAttributes.docker_target_image_tag")})),r.createElement(u,{label:"Base OS"},r.createElement("select",{className:"form-control input-sm",value:s.baseOs||"",onChange:n("baseOs")},t.map(e=>r.createElement("option",{key:e.id,value:e.id},function(e){const t=(null==e?void 0:e.displayName)||(null==e?void 0:e.id)||"";return(null==e?void 0:e.shortDescription)?`${t} (${e.shortDescription})`:t}(e))))),r.createElement(u,{label:"Base Label"},e.map(e=>r.createElement("label",{key:e,className:"radio-inline"},r.createElement("input",{type:"radio",checked:s.baseLabel===e,onChange:()=>a.setFieldValue("baseLabel",e)}),e))),r.createElement(u,{label:"Rebake"},r.createElement("div",{className:"checkbox",style:{marginBottom:0}},r.createElement("label",null,r.createElement("input",{type:"checkbox",checked:!!s.rebake,onChange:e=>a.setFieldValue("rebake",e.target.checked)}),"Rebake image without regard to the status of any existing bake"))))}class x extends r.Component{constructor(){super(...arguments),this.mounted=!1,this.state={baseLabelOptions:[],baseOsOptions:[],loadError:!1,loading:!0}}componentDidMount(){this.mounted=!0,Promise.all([o.getBaseOsOptions("docker"),o.getBaseLabelOptions()]).then(([t,a])=>{var s;if(!this.mounted)return;const i=t.baseImages||[],n=M(this.props.stage,{user:null==(s=l.getAuthenticatedUser())?void 0:s.name,baseOsOptions:i,baseLabelOptions:a});e(n,this.props.stage)||this.props.updateStage(n),this.setState({baseLabelOptions:a,baseOsOptions:i,loadError:!1,loading:!1})}).catch(()=>{this.mounted&&this.setState({loadError:!0,loading:!1})})}componentWillUnmount(){this.mounted=!1}render(){if(this.state.loading)return r.createElement(c,null);if(this.state.loadError)return r.createElement("div",{className:"alert alert-danger"},"Unable to load Docker bake options.");const e=l.getAuthenticatedUser(),t=M(this.props.stage,{user:null==e?void 0:e.name,baseOsOptions:this.state.baseOsOptions,baseLabelOptions:this.state.baseLabelOptions});return r.createElement(m,{application:this.props.application,onChange:this.props.updateStage,pipeline:this.props.pipeline,stage:t,render:e=>r.createElement(T,{...e,...this.state})})}}function D(e){var t,a;const{current:s,name:i,stage:n}=e,o=n.context||{},l=null==(t=o.status)?void 0:t.resourceId;return r.createElement(h,{name:i,current:s},r.createElement("div",{className:"row"},r.createElement("div",{className:"col-md-6"},r.createElement("dl",{className:"dl-narrow dl-horizontal"},r.createElement("dt",null,"Organization"),r.createElement("dd",null,o.organization),r.createElement("dt",null,"Image Name"),r.createElement("dd",null,o.ami_name),r.createElement("dt",null,"Image Tag"),r.createElement("dd",null,null==(a=o.extendedAttributes)?void 0:a.docker_target_image_tag),r.createElement("dt",null,"Image"),r.createElement("dd",null,o.ami))),r.createElement("div",{className:"col-md-6"},r.createElement("dl",{className:"dl-narrow dl-horizontal"},r.createElement("dt",null,"Base OS"),r.createElement("dd",null,o.baseOs),r.createElement("dt",null,"Region"),r.createElement("dd",null,o.region),r.createElement("dt",null,"Package"),r.createElement("dd",null,o.package),r.createElement("dt",null,"Label"),r.createElement("dd",null,o.baseLabel)))),r.createElement(f,{stage:n,message:n.failureMessage}),o.region&&l&&r.createElement("div",{className:"row"},r.createElement("div",{className:"col-md-12"},r.createElement("div",{className:"alert alert-"+(n.isFailed?"danger":"info")},r.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:O(n)},"View Bakery Details")))))}D.title="bakeConfig";const q={provides:"bake",cloudProvider:"docker",label:"Bake",description:"Bakes an image",component:x,executionDetailsSections:[D,d],executionLabelComponent:p,extraLabelLines:e=>e.masterStage.context.allPreviouslyBaked||e.masterStage.context.somePreviouslyBaked?1:0,supportsCustomTimeout:!0,validators:[{type:"requiredField",fieldName:"package"}],restartable:!0};g.pipeline.registerStage(q);class S{static getImage(e,t,a){return y("/images").path(a,t,e).query({provider:"docker"}).get().then(e=>e&&e.length?e[0]:null).catch(()=>null)}static findImages(e,t){return E.buildRetrySequence(()=>y("/images/find").query(e).get(),e=>e.length>0,10,1e3,t).then(e=>e).catch(()=>[])}static findTags(e,t){return E.buildRetrySequence(()=>y("/images/tags").query(e).get(),e=>e.length>0,10,1e3,t).then(e=>e).catch(()=>[])}}class ${static getImage(e,t,a){return y("/charts").path(a,t,e).query({provider:"docker"}).get().then(e=>e&&e.length?e[0]:null).catch(()=>null)}static findImages(e,t){return E.buildRetrySequence(()=>y("/charts/find").query(e).get(),e=>e.length>0,10,1e3,t).then(e=>e).catch(()=>[])}static findTags(e,t){return E.buildRetrySequence(()=>y("/charts/tags").query(e).get(),e=>e.length>0,10,1e3,t).then(e=>e).catch(()=>[])}}class A{static splitImageId(e=""){let t;t=e.includes("@")?e.split("@"):e.split(":");const a=t[0],s=a.split("/").slice(0,-1).join("/"),i=t.length>1?t.slice(1).join(":"):"";let n,r;return i&&(i.startsWith("sha256:")?r=i:n=i),{organization:s,repository:a,digest:r,tag:n}}static generateImageId(e){if(!e.repository||!e.digest&&!e.tag)return;let t;return t=e.digest?`${e.repository}@${e.digest}`:`${e.repository}:${e.tag}`,t}}const F=["organization","repository","tag","digest"],B=[{label:"Manually",value:!0},{label:"Select from list",value:!1}];class W extends r.Component{constructor(e){super(e),this.unmounted=!1,this.cachedValues={},this.handleRefreshImages=()=>{this.refreshImages(this.props)},this.lookupTypeChanged=e=>{const t=e.value,a=this.state.lookupType,s=this.props[a],i=this.cachedValues[t];this.valueChanged(a,void 0),this.cachedValues[t]&&this.valueChanged(t,i),this.setState({lookupType:t}),this.cachedValues[a]=s},this.showManualInput=e=>{if(!e){const e=A.splitImageId(this.props.imageId||"");this.props.onChange(e),this.state.switchedManualWarning&&this.setState({switchedManualWarning:void 0,missingFields:void 0})}this.setState({defineManually:e})};const t=e.account?[{label:e.account,value:e.account}]:[],a=e.organization&&e.organization.length?[{label:e.organization,value:e.organization}]:[],s=e.repository&&e.repository.length?[{label:e.repository,value:e.repository}]:[],i=e.tag&&e.tag.length?[{label:e.tag,value:e.tag}]:[],n=A.splitImageId(e.imageId),r=e.allowManualDefinition&&Boolean(e.imageId&&e.imageId.includes("${"));this.state={accountOptions:t,switchedManualWarning:void 0,imagesLoaded:!1,imagesLoading:!1,organizationOptions:a,repositoryOptions:s,defineManually:r,tagOptions:i,lookupType:e.digest||n.digest?"digest":"tag"}}getAccountMap(e){const i=t(e.filter(e=>e.account&&e.repository),"account");return a(i,(e,t,a)=>(e[a]=s(t.map(e=>`${e.repository.split("/").slice(0,-1).join("/")}`)),e),{})}getRegistryMap(e){return e.reduce((e,t)=>(e[t.account]=t.registry,e),{})}getOrganizationMap(e){const i=t(e.filter(e=>e.repository),e=>`${e.account}/${e.repository.split("/").slice(0,-1).join("/")}`);return a(i,(e,t,a)=>(e[a]=s(t.map(e=>e.repository)),e),{})}getRepositoryMap(e){const i=t(e.filter(e=>e.account),"repository");return a(i,(e,t,a)=>(e[a]=s(t.map(e=>e.tag)),e),{})}getOrganizationsList(e){return e&&e[this.props.showRegistry?this.props.account:this.props.registry]||[]}getRepositoryList(e,t,a){if(e){return e[`${this.props.showRegistry?this.props.account:a}/${t||""}`]||[]}return[]}getTags(e,t,a){let s=[];return this.props.specifyTagByRegex?e&&""===i(e)&&(e=void 0):t&&(s=t[a]||[],s.includes(e)||!e||e.includes("${")||(e=void 0)),{tag:e,tags:s}}componentWillReceiveProps(e){const t=this.props.showRegistry?this.props.account:this.props.registry,a=e.showRegistry?e.account:e.registry;!this.images&&!this.imageRequest||this.props.showRegistry!==e.showRegistry||t!==a?this.refreshImages(e):["organization","registry","repository"].some(t=>this.props[t]!==e[t])&&this.updateThings(e),e.imageId&&e.imageId.includes("${")&&this.setState({defineManually:!0})}componentWillUnmount(){var e;this.unmounted=!0,null==(e=this.imageRequest)||e.abort()}synchronizeChanges(e,t){const{organization:a,repository:s,tag:i,digest:n}=e;if(this.props.onChange){const e=A.generateImageId({organization:a,repository:s,tag:i,digest:n}),r={};i!==this.props.tag&&(r.tag=i),e!==this.props.imageId&&(r.imageId=e),a!==this.props.organization&&(r.organization=a),t!==this.props.registry&&(r.registry=t),s!==this.props.repository&&(r.repository=s),n!==this.props.digest&&(r.digest=n),Object.keys(r).length>0&&this.props.onChange(r)}}updateThings(e,t=!1){if(!this.repositoryMap||this.unmounted)return;const{imageId:a,specifyTagByRegex:s}=e;let{organization:i,registry:n,repository:r}=e;e.showRegistry&&(n=this.registryMap[e.account]);const o=!i||this.organizations.includes(i)||i.includes("${");o||(i="");const l=this.getRepositoryList(this.organizationMap,i,n),c=!r||r.includes("${")||l.includes(r);c||(r="");const{tag:m,tags:g}=this.getTags(e.tag,this.repositoryMap,r),p=m===e.tag||s,d={accountOptions:this.newAccounts.sort().map(e=>({label:e,value:e})),organizationOptions:this.organizations.filter(e=>e).sort().map(e=>({label:e,value:e})),imagesLoaded:!0,repositoryOptions:l.sort().map(e=>({label:e,value:e})),tagOptions:g.sort().map(e=>({label:e,value:e}))};if(!a||this.state.imagesLoaded&&!t||o&&c&&p)a&&a.includes("${")||this.synchronizeChanges(this.state.defineManually?A.splitImageId(a):{organization:i,repository:r,tag:m,digest:this.props.digest},n);else{d.defineManually=!0;const e=[];o||e.push("organization"),c||e.push("image"),p||e.push("tag"),d.missingFields=e,d.switchedManualWarning=`Could not find ${e.join(" or ")}, switched to manual entry`}this.setState(d)}initializeImages(e){var t;if(this.unmounted)return;null==(t=this.imageRequest)||t.abort();const a=new AbortController;this.imageRequest=a;const{showRegistry:s,account:i,registry:n}=e,r={provider:"dockerRegistry",account:s?i:n};this.setState({imagesLoading:!0}),$.findImages(r,a.signal).then(e=>{a.signal.aborted||this.unmounted||(this.images=e,this.registryMap=this.getRegistryMap(this.images),this.accountMap=this.getAccountMap(this.images),this.newAccounts=this.accounts||Object.keys(this.accountMap),this.organizationMap=this.getOrganizationMap(this.images),this.repositoryMap=this.getRepositoryMap(this.images),this.organizations=this.getOrganizationsList(this.accountMap),this.updateThings(this.props,!0))}).finally(()=>{this.unmounted||this.imageRequest!==a||(this.imageRequest=null,this.setState({imagesLoading:!1}))})}refreshImages(e){this.initializeImages(e)}initializeAccounts(){b.listAccounts("dockerRegistry").then(e=>{const t=this.props;let{account:a}=t;const s=e.map(e=>e.name);this.props.showRegistry&&!a&&(a=s[0]),this.accounts=s,this.refreshImages({...t,account:a})})}isNew(){const{account:e,organization:t,registry:a,repository:s,tag:i}=this.props;return!(e||t||a||s||i)}componentDidMount(){this.props.deferInitialization||!this.props.registry&&!this.isNew()||this.initializeAccounts()}valueChanged(e,t){const a={[e]:t};if(F.some(t=>t===e)){const{organization:e,repository:t,tag:s,digest:i}=this.props,n={organization:e,repository:t,tag:s,digest:i,...a},r=A.generateImageId(n);a.imageId=r}this.props.onChange&&this.props.onChange(a)}render(){const{account:e,allowManualDefinition:t,digest:a,imageId:s,organization:i,repository:n,showDigest:o,showRegistry:l,specifyTagByRegex:c,tag:m}=this.props,{accountOptions:g,switchedManualWarning:p,missingFields:d,imagesLoading:u,lookupType:h,organizationOptions:f,repositoryOptions:v,defineManually:y,tagOptions:E}=this.state,b=A.splitImageId(s),C=r.createElement("div",{className:"sp-formItem groupHeader"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Define Image ID"),r.createElement("div",{className:"sp-formActions sp-formActions--mobile"},r.createElement("span",{className:"action"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{value:y,disabled:u||!t,onChange:e=>this.showManualInput(e.value),options:B,clearable:!1}))))),R=p?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"}),r.createElement("div",{className:"sp-formItem__right"},r.createElement(N,{type:"warning",message:r.createElement(r.Fragment,null,p,(d||[]).map(e=>r.createElement("div",{key:e},r.createElement(I,{expand:!0,id:`pipeline.config.docker.trigger.missing.${e}`}))))}))):null;if(y)return r.createElement("div",{className:"sp-formGroup"},C,r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Image ID"),r.createElement("div",{className:"sp-formActions sp-formActions--mobile"},r.createElement("span",{className:"action"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{className:"form-control input-sm",value:s||"",onChange:e=>this.valueChanged("imageId",e.target.value)}))))),R);const _=l?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Registry Name")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{value:e,disabled:u,onChange:e=>this.valueChanged("account",e?e.value:""),options:g,isLoading:u})),r.createElement("span",{className:"sp-formActions sp-formActions--web"},r.createElement("span",{className:"action"},r.createElement(k,{value:u?"Images refreshing":"Refresh images list"},r.createElement("i",{className:"fa icon-button-refresh-arrows "+(u?"fa-spin":""),onClick:this.handleRefreshImages}))))))):null,w=r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Organization")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},i.includes("${")?r.createElement("input",{disabled:u,className:"form-control input-sm",value:i||"",onChange:e=>this.valueChanged("organization",e.target.value)}):r.createElement(z,{value:i||"",disabled:u,onChange:e=>this.valueChanged("organization",e&&e.value||""),placeholder:"No organization",options:f,isLoading:u}))))),L=r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Image")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},n.includes("${")?r.createElement("input",{className:"form-control input-sm",disabled:u,value:n||"",onChange:e=>this.valueChanged("repository",e.target.value)}):r.createElement(z,{value:n||"",disabled:u,onChange:e=>this.valueChanged("repository",e&&e.value||""),options:v,required:!0,isLoading:u}))))),M="tag"===h?c?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Tag")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{type:"text",className:"form-control input-sm",value:m||"",disabled:u||!n,onChange:e=>this.valueChanged("tag",e.target.value)}))),r.createElement(I,{id:"pipeline.config.docker.trigger.tag",expand:!0}))):r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Tag")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},m&&m.includes("${")?r.createElement("input",{className:"form-control input-sm",disabled:u,value:m||"",onChange:e=>this.valueChanged("tag",e.target.value),required:!0}):r.createElement(r.Fragment,null,r.createElement(z,{value:m||"",disabled:u||!n,isLoading:u,onChange:e=>this.valueChanged("tag",e?e.value:void 0),options:E,placeholder:"No tag",required:!0}),r.createElement(I,{id:"pipeline.config.docker.trigger.tag.additionalInfo",expand:!0})))))):null,O="digest"===h?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Digest ",r.createElement(I,{id:"pipeline.config.docker.trigger.digest"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{className:"form-control input-sm",placeholder:"sha256:abc123",value:a||b.digest||"",onChange:e=>this.valueChanged("digest",e.target.value),required:!0}))))):null,T=o?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Type")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{clearable:!1,value:h,options:[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}],onChange:this.lookupTypeChanged}))))):null;return r.createElement("div",{className:"sp-formGroup"},C,_,w,L,T,O,M)}}W.defaultProps={organization:"",registry:"",repository:"",showDigest:!0,allowManualDefinition:!0};const j=["organization","repository","tag","digest"],V=[{label:"Manually",value:!0},{label:"Select from list",value:!1}];class P extends r.Component{constructor(e){super(e),this.unmounted=!1,this.cachedValues={},this.handleRefreshImages=()=>{this.refreshImages(this.props)},this.lookupTypeChanged=e=>{const t=e.value,a=this.state.lookupType,s=this.props[a],i=this.cachedValues[t];this.valueChanged(a,void 0),this.cachedValues[t]&&this.valueChanged(t,i),this.setState({lookupType:t}),this.cachedValues[a]=s},this.showManualInput=e=>{if(!e){const e=A.splitImageId(this.props.imageId||"");this.props.onChange(e),this.state.switchedManualWarning&&this.setState({switchedManualWarning:void 0,missingFields:void 0})}this.setState({defineManually:e})};const t=e.account?[{label:e.account,value:e.account}]:[],a=e.organization&&e.organization.length?[{label:e.organization,value:e.organization}]:[],s=e.repository&&e.repository.length?[{label:e.repository,value:e.repository}]:[],i=e.tag&&e.tag.length?[{label:e.tag,value:e.tag}]:[],n=A.splitImageId(e.imageId),r=e.allowManualDefinition&&Boolean(e.imageId&&e.imageId.includes("${"));this.state={accountOptions:t,switchedManualWarning:void 0,imagesLoaded:!1,imagesLoading:!1,organizationOptions:a,repositoryOptions:s,defineManually:r,tagOptions:i,lookupType:e.digest||n.digest?"digest":"tag"}}getAccountMap(e){const i=t(e.filter(e=>e.account&&e.repository),"account");return a(i,(e,t,a)=>(e[a]=s(t.map(e=>`${e.repository.split("/").slice(0,-1).join("/")}`)),e),{})}getRegistryMap(e){return e.reduce((e,t)=>(e[t.account]=t.registry,e),{})}getOrganizationMap(e){const i=t(e.filter(e=>e.repository),e=>`${e.account}/${e.repository.split("/").slice(0,-1).join("/")}`);return a(i,(e,t,a)=>(e[a]=s(t.map(e=>e.repository)),e),{})}getRepositoryMap(e){const i=t(e.filter(e=>e.account),"repository");return a(i,(e,t,a)=>(e[a]=s(t.map(e=>e.tag)),e),{})}getOrganizationsList(e){return e&&e[this.props.showRegistry?this.props.account:this.props.registry]||[]}getRepositoryList(e,t,a){if(e){return e[`${this.props.showRegistry?this.props.account:a}/${t||""}`]||[]}return[]}getTags(e,t,a){let s=[];return this.props.specifyTagByRegex?e&&""===i(e)&&(e=void 0):t&&(s=t[a]||[],s.includes(e)||!e||e.includes("${")||(e=void 0)),{tag:e,tags:s}}componentWillReceiveProps(e){const t=this.props.showRegistry?this.props.account:this.props.registry,a=e.showRegistry?e.account:e.registry;!this.images&&!this.imageRequest||this.props.showRegistry!==e.showRegistry||t!==a?this.refreshImages(e):["organization","registry","repository"].some(t=>this.props[t]!==e[t])&&this.updateThings(e),e.imageId&&e.imageId.includes("${")&&this.setState({defineManually:!0})}componentWillUnmount(){var e;this.unmounted=!0,null==(e=this.imageRequest)||e.abort()}synchronizeChanges(e,t){const{organization:a,repository:s,tag:i,digest:n}=e;if(this.props.onChange){const e=A.generateImageId({organization:a,repository:s,tag:i,digest:n}),r={};i!==this.props.tag&&(r.tag=i),e!==this.props.imageId&&(r.imageId=e),a!==this.props.organization&&(r.organization=a),t!==this.props.registry&&(r.registry=t),s!==this.props.repository&&(r.repository=s),n!==this.props.digest&&(r.digest=n),Object.keys(r).length>0&&this.props.onChange(r)}}updateThings(e,t=!1){if(!this.repositoryMap||this.unmounted)return;const{imageId:a,specifyTagByRegex:s}=e;let{organization:i,registry:n,repository:r}=e;e.showRegistry&&(n=this.registryMap[e.account]);const o=!i||this.organizations.includes(i)||i.includes("${");o||(i="");const l=this.getRepositoryList(this.organizationMap,i,n),c=!r||r.includes("${")||l.includes(r);c||(r="");const{tag:m,tags:g}=this.getTags(e.tag,this.repositoryMap,r),p=m===e.tag||s,d={accountOptions:this.newAccounts.sort().map(e=>({label:e,value:e})),organizationOptions:this.organizations.filter(e=>e).sort().map(e=>({label:e,value:e})),imagesLoaded:!0,repositoryOptions:l.sort().map(e=>({label:e,value:e})),tagOptions:g.sort().map(e=>({label:e,value:e}))};if(!a||this.state.imagesLoaded&&!t||o&&c&&p)a&&a.includes("${")||this.synchronizeChanges(this.state.defineManually?A.splitImageId(a):{organization:i,repository:r,tag:m,digest:this.props.digest},n);else{d.defineManually=!0;const e=[];o||e.push("organization"),c||e.push("image"),p||e.push("tag"),d.missingFields=e,d.switchedManualWarning=`Could not find ${e.join(" or ")}, switched to manual entry`}this.setState(d)}initializeImages(e){var t;if(this.unmounted)return;null==(t=this.imageRequest)||t.abort();const a=new AbortController;this.imageRequest=a;const{showRegistry:s,account:i,registry:n}=e,r={provider:"dockerRegistry",account:s?i:n};this.setState({imagesLoading:!0}),S.findImages(r,a.signal).then(e=>{a.signal.aborted||this.unmounted||(this.images=e,this.registryMap=this.getRegistryMap(this.images),this.accountMap=this.getAccountMap(this.images),this.newAccounts=this.accounts||Object.keys(this.accountMap),this.organizationMap=this.getOrganizationMap(this.images),this.repositoryMap=this.getRepositoryMap(this.images),this.organizations=this.getOrganizationsList(this.accountMap),this.updateThings(this.props,!0))}).finally(()=>{this.unmounted||this.imageRequest!==a||(this.imageRequest=null,this.setState({imagesLoading:!1}))})}refreshImages(e){this.initializeImages(e)}initializeAccounts(){b.listAccounts("dockerRegistry").then(e=>{const t=this.props;let{account:a}=t;const s=e.map(e=>e.name);this.props.showRegistry&&!a&&(a=s[0]),this.accounts=s,this.refreshImages({...t,account:a})})}isNew(){const{account:e,organization:t,registry:a,repository:s,tag:i}=this.props;return!(e||t||a||s||i)}componentDidMount(){this.props.deferInitialization||!this.props.registry&&!this.isNew()||this.initializeAccounts()}valueChanged(e,t){const a={[e]:t};if(j.some(t=>t===e)){const{organization:e,repository:t,tag:s,digest:i}=this.props,n={organization:e,repository:t,tag:s,digest:i,...a},r=A.generateImageId(n);a.imageId=r}this.props.onChange&&this.props.onChange(a)}render(){const{account:e,allowManualDefinition:t,digest:a,imageId:s,organization:i,repository:n,showDigest:o,showRegistry:l,specifyTagByRegex:c,tag:m}=this.props,{accountOptions:g,switchedManualWarning:p,missingFields:d,imagesLoading:u,lookupType:h,organizationOptions:f,repositoryOptions:v,defineManually:y,tagOptions:E}=this.state,b=A.splitImageId(s),C=r.createElement("div",{className:"sp-formItem groupHeader"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Define Image ID"),r.createElement("div",{className:"sp-formActions sp-formActions--mobile"},r.createElement("span",{className:"action"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{value:y,disabled:u||!t,onChange:e=>this.showManualInput(e.value),options:V,clearable:!1}))))),R=p?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"}),r.createElement("div",{className:"sp-formItem__right"},r.createElement(N,{type:"warning",message:r.createElement(r.Fragment,null,p,(d||[]).map(e=>r.createElement("div",{key:e},r.createElement(I,{expand:!0,id:`pipeline.config.docker.trigger.missing.${e}`}))))}))):null;if(y)return r.createElement("div",{className:"sp-formGroup"},C,r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Image ID"),r.createElement("div",{className:"sp-formActions sp-formActions--mobile"},r.createElement("span",{className:"action"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{className:"form-control input-sm",value:s||"",onChange:e=>this.valueChanged("imageId",e.target.value)}))))),R);const _=l?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Registry Name")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{value:e,disabled:u,onChange:e=>this.valueChanged("account",e?e.value:""),options:g,isLoading:u})),r.createElement("span",{className:"sp-formActions sp-formActions--web"},r.createElement("span",{className:"action"},r.createElement(k,{value:u?"Images refreshing":"Refresh images list"},r.createElement("i",{className:"fa icon-button-refresh-arrows "+(u?"fa-spin":""),onClick:this.handleRefreshImages}))))))):null,w=r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Organization")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},i.includes("${")?r.createElement("input",{disabled:u,className:"form-control input-sm",value:i||"",onChange:e=>this.valueChanged("organization",e.target.value)}):r.createElement(z,{value:i||"",disabled:u,onChange:e=>this.valueChanged("organization",e&&e.value||""),placeholder:"No organization",options:f,isLoading:u}))))),L=r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Image")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},n.includes("${")?r.createElement("input",{className:"form-control input-sm",disabled:u,value:n||"",onChange:e=>this.valueChanged("repository",e.target.value)}):r.createElement(z,{value:n||"",disabled:u,onChange:e=>this.valueChanged("repository",e&&e.value||""),options:v,required:!0,isLoading:u}))))),M="tag"===h?c?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Tag")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{type:"text",className:"form-control input-sm",value:m||"",disabled:u||!n,onChange:e=>this.valueChanged("tag",e.target.value)}))),r.createElement(I,{id:"pipeline.config.docker.trigger.tag",expand:!0}))):r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Tag")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},m&&m.includes("${")?r.createElement("input",{className:"form-control input-sm",disabled:u,value:m||"",onChange:e=>this.valueChanged("tag",e.target.value),required:!0}):r.createElement(r.Fragment,null,r.createElement(z,{value:m||"",disabled:u||!n,isLoading:u,onChange:e=>this.valueChanged("tag",e?e.value:void 0),options:E,placeholder:"No tag",required:!0}),r.createElement(I,{id:"pipeline.config.docker.trigger.tag.additionalInfo",expand:!0})))))):null,O="digest"===h?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Digest ",r.createElement(I,{id:"pipeline.config.docker.trigger.digest"}))),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement("input",{className:"form-control input-sm",placeholder:"sha256:abc123",value:a||b.digest||"",onChange:e=>this.valueChanged("digest",e.target.value),required:!0}))))):null,T=o?r.createElement("div",{className:"sp-formItem"},r.createElement("div",{className:"sp-formItem__left"},r.createElement("div",{className:"sp-formLabel"},"Type")),r.createElement("div",{className:"sp-formItem__right"},r.createElement("div",{className:"sp-form"},r.createElement("span",{className:"field"},r.createElement(z,{clearable:!1,value:h,options:[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}],onChange:this.lookupTypeChanged}))))):null;return r.createElement("div",{className:"sp-formGroup"},C,_,w,L,T,O,M)}}P.defaultProps={organization:"",registry:"",repository:"",showDigest:!0,allowManualDefinition:!0};const U=[{value:"digest",label:"Digest"},{value:"tag",label:"Tag"}];class G extends r.Component{constructor(e){super(e),this.queryStream=new R,this.handleQuery=()=>{var e;null==(e=this.tagRequest)||e.abort(),this.tagRequest=new AbortController;const t=this.props.command.trigger;return"helm/oci"===t.type?_($.findTags({provider:"dockerRegistry",account:t.account,repository:t.repository},this.tagRequest.signal)):_(S.findTags({provider:"dockerRegistry",account:t.account,repository:t.repository},this.tagRequest.signal))},this.lookupTypeChanged=e=>{const t=e.value;this.updateArtifact(this.props.command,"tag"===t?this.state.selectedTag:this.state.digest),this.setState({lookupType:t})},this.updateSelectedTag=e=>{this.updateArtifact(this.props.command,e),this.setState({selectedTag:e}),this.props.command.triggerInvalid=!1},this.updateDigest=e=>{this.updateArtifact(this.props.command,e),this.setState({digest:e})},this.tagLoadSuccess=e=>{const{command:t}=this.props,a=t.trigger,s={};s.tags=e||[];const i=s.tags.find(e=>e===a.tag);i&&(s.selectedTag=i,this.updateSelectedTag(i)),s.tagsLoading=!1,this.setState(s)},this.tagLoadFailure=()=>{this.setState({tagsLoading:!1,loadError:!0})},this.initialize=()=>{var e;const{command:t}=this.props;this.props.updateCommand("triggerInvalid",!0),this.props.updateCommand("extraFields",{tag:n(t,"extraFields.tag",""),artifacts:n(t,"extraFields.artifacts","")}),this.subscription&&this.subscription.unsubscribe(),null==(e=this.tagRequest)||e.abort(),"docker"!==t.trigger.type&&"helm/oci"!==t.trigger.type||(this.subscription=this.queryStream.pipe(w(250),L(this.handleQuery)).subscribe(this.tagLoadSuccess,this.tagLoadFailure),this.searchTags())},this.searchTags=(e="")=>{this.setState({tags:[`<span>Finding tags${e&&` matching ${e}`}...</span>`]}),this.queryStream.next()},this.state={digest:"",tags:[],tagsLoading:!0,loadError:!1,lookupType:"tag",selectedTag:""}}static formatLabel(e){return Promise.resolve(`(Docker Registry) ${e.account?e.account+":":""} ${e.repository||""}`)}updateArtifact(e,t){this.props.updateCommand("extraFields.tag",t);const a=e.trigger;if(a&&a.repository){let e="";a.registry&&(e+=a.registry+"/"),e+=a.repository;let s="";s="digest"===this.state.lookupType?`${e}@${t}`:`${e}:${t}`;const i="docker"===a.type?"docker/image":"helm/image";this.props.updateCommand("extraFields.artifacts",[{type:i,name:e,version:t,reference:s}])}}componentDidMount(){this.initialize()}componentWillUnmount(){var e;this.subscription&&this.subscription.unsubscribe(),null==(e=this.tagRequest)||e.abort()}render(){const{digest:e,tags:t,tagsLoading:a,loadError:s,selectedTag:i,lookupType:n}=this.state,o=t.map(e=>({value:e}));return r.createElement(r.Fragment,null,r.createElement("div",{className:"form-group"},r.createElement("div",{className:"sm-label-right col-md-4"},"Type"),r.createElement("div",{className:"col-md-3"},r.createElement(C,{clearable:!1,value:n,options:U,onChange:this.lookupTypeChanged}))),"tag"===n&&r.createElement("div",{className:"form-group"},r.createElement("label",{className:"col-md-4 sm-label-right"},"Tag"),a&&r.createElement("div",{className:"col-md-6"},r.createElement("div",{className:"form-control-static text-center"},r.createElement(c,{size:"small"}))),s&&r.createElement("div",{className:"col-md-6"},"Error loading tags!"),!a&&r.createElement("div",{className:"col-md-6"},0===t.length&&r.createElement("div",null,r.createElement("p",{className:"form-control-static"},"No tags found")),t.length>0&&r.createElement(C,{options:o,optionRenderer:e=>r.createElement("span",null,e.value),clearable:!1,value:i,valueRenderer:e=>r.createElement("span",null,r.createElement("strong",null,e.value)),onChange:e=>this.updateSelectedTag(e.value),placeholder:"Search tags..."}))),"digest"===n&&r.createElement("div",{className:"form-group"},r.createElement("label",{className:"col-md-4 sm-label-right"},"Digest ",r.createElement(I,{id:"pipeline.config.docker.trigger.digest"})),r.createElement("div",{className:"col-md-6"},r.createElement("input",{value:e,onChange:e=>this.updateDigest(e.target.value),className:"form-control input-sm",required:!0}))))}}const K=e=>{const t=e.trigger;return r.createElement("li",null,t.repository,":",t.tag)};g.pipeline.registerTrigger({label:"Docker Registry",description:"Executes the pipeline on an image update",key:"docker",component:function(e){const{formik:t}=e,a=t.values;return r.createElement("div",{className:"form-horizontal"},r.createElement(P,{allowManualDefinition:!1,specifyTagByRegex:!0,account:a.account,organization:a.organization,registry:a.registry,repository:a.repository,tag:a.tag,showRegistry:!0,onChange:t=>{const{imageId:a,...s}=t;e.triggerUpdated(s)},showDigest:!1}))},manualExecutionComponent:G,executionStatusComponent:K,executionTriggerLabel:()=>"Docker Registry",validators:[{type:"requiredField",fieldName:"account",message:"<strong>Registry</strong> is a required field for Docker Registry triggers."},{type:"requiredField",fieldName:"repository",message:"<strong>Image</strong> is a required field for Docker Registry triggers."},{type:"serviceAccountAccess",preventSave:!0,message:"You do not have access to the service account configured in this pipeline's Docker Registry trigger.\n You will not be able to save your edits to this pipeline."}]}),g.pipeline.registerTrigger({label:"Docker Registry (OCI)",description:"Executes the pipeline on a Docker OCI image update",key:"helm/oci",component:function(e){const{formik:t}=e,a=t.values;return r.createElement("div",{className:"form-horizontal"},r.createElement(W,{allowManualDefinition:!1,specifyTagByRegex:!0,account:a.account,organization:a.organization,registry:a.registry,repository:a.repository,tag:a.tag,showRegistry:!0,onChange:t=>{const{imageId:a,...s}=t;e.triggerUpdated(s)},showDigest:!1}))},manualExecutionComponent:G,executionStatusComponent:K,executionTriggerLabel:()=>"Helm Docker Registry",validators:[{type:"requiredField",fieldName:"account",message:"<strong>Registry</strong> is a required field for Docker Registry triggers."},{type:"requiredField",fieldName:"repository",message:"<strong>Image</strong> is a required field for Docker Registry triggers."},{type:"serviceAccountAccess",preventSave:!0,message:"You do not have access to the service account configured in this pipeline's Docker Registry trigger.\n You will not be able to save your edits to this pipeline."}]});export{$ as DockerChartImageReader,P as DockerImageAndTagSelector,S as DockerImageReader,A as DockerImageUtils};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|