@spinnaker/docker 2026.0.3 → 2026.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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{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};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/image/DockerImageReader.ts","../src/image/DockerImageUtils.ts","../src/image/DockerImageAndTagSelector.tsx","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/pipeline/stages/bake/dockerBakeStage.js","../src/image/DockerChartAndTagSelector.tsx","../src/pipeline/trigger/DockerTriggerTemplate.tsx","../src/pipeline/trigger/DockerTrigger.tsx","../src/pipeline/trigger/DockerTriggerConfig.tsx","../src/pipeline/trigger/DockerHelmOciTriggerConfig.tsx","../src/docker.module.ts"],"sourcesContent":["import type { IFindImageParams, IFindTagsParams, IImage } from '@spinnaker/core';\nimport { REST, RetryService } from '@spinnaker/core';\n\nexport interface IDockerImage extends IImage {\n account: string;\n registry: string;\n repository: string;\n tag: string;\n}\n\nexport class DockerImageReader {\n public static getImage(imageName: string, region: string, credentials: string): PromiseLike<IDockerImage> {\n return REST('/images')\n .path(credentials, region, imageName)\n .query({ provider: 'docker' })\n .get()\n .then((results: IDockerImage[]) => (results && results.length ? results[0] : null))\n .catch((): IDockerImage => null);\n }\n\n public static findImages(params: IFindImageParams): PromiseLike<IDockerImage[]> {\n return RetryService.buildRetrySequence<IDockerImage[]>(\n () => REST('/images/find').query(params).get(),\n (results: IDockerImage[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: IDockerImage[]) => results)\n .catch((): IDockerImage[] => []);\n }\n\n public static findTags(params: IFindTagsParams): PromiseLike<string[]> {\n return RetryService.buildRetrySequence<string[]>(\n () => REST('/images/tags').query(params).get(),\n (results: string[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: string[]) => results)\n .catch((): string[] => []);\n }\n}\n\nexport class DockerChartImageReader {\n public static getImage(imageName: string, region: string, credentials: string): PromiseLike<IDockerImage> {\n return REST('/charts')\n .path(credentials, region, imageName)\n .query({ provider: 'docker' })\n .get()\n .then((results: IDockerImage[]) => (results && results.length ? results[0] : null))\n .catch((): IDockerImage => null);\n }\n\n public static findImages(params: IFindImageParams): PromiseLike<IDockerImage[]> {\n return RetryService.buildRetrySequence<IDockerImage[]>(\n () => REST('/charts/find').query(params).get(),\n (results: IDockerImage[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: IDockerImage[]) => results)\n .catch((): IDockerImage[] => []);\n }\n\n public static findTags(params: IFindTagsParams): PromiseLike<string[]> {\n return RetryService.buildRetrySequence<string[]>(\n () => REST('/charts/tags').query(params).get(),\n (results: string[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: string[]) => results)\n .catch((): string[] => []);\n }\n}\n","export interface IDockerImageParts {\n organization: string;\n repository: string;\n tag?: string;\n digest?: string;\n}\n\nexport class DockerImageUtils {\n // Split the image id up into the selectable parts to feed the UI\n public static splitImageId(imageId = ''): IDockerImageParts {\n let imageParts: string[];\n if (imageId.includes('@')) {\n imageParts = imageId.split('@');\n } else {\n imageParts = imageId.split(':');\n }\n const repository = imageParts[0];\n const repositoryParts = repository.split('/');\n // Everything before the last slash is considered the organization\n const organization = repositoryParts.slice(0, -1).join('/');\n\n const lookup = imageParts.length > 1 ? imageParts.slice(1).join(':') : '';\n\n let tag: string;\n let digest: string;\n if (lookup) {\n if (lookup.startsWith('sha256:')) {\n digest = lookup;\n } else {\n tag = lookup;\n }\n }\n\n return { organization, repository, digest, tag };\n }\n\n public static generateImageId(parts: IDockerImageParts): string {\n if (!parts.repository || !(parts.digest || parts.tag)) {\n return undefined;\n }\n\n let imageId: string;\n\n if (parts.digest) {\n imageId = `${parts.repository}@${parts.digest}`;\n } else {\n imageId = `${parts.repository}:${parts.tag}`;\n }\n\n return imageId;\n }\n}\n","import { groupBy, reduce, trim, uniq } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IFindImageParams } from '@spinnaker/core';\nimport { AccountService, HelpField, Tooltip, ValidationMessage } from '@spinnaker/core';\n\nimport type { IDockerImage } from './DockerImageReader';\nimport { DockerImageReader } from './DockerImageReader';\nimport type { IDockerImageParts } from './DockerImageUtils';\nimport { DockerImageUtils } from './DockerImageUtils';\n\nexport type IDockerLookupType = 'tag' | 'digest';\n\nexport interface IDockerImageAndTagChanges {\n account?: string;\n organization?: string;\n registry?: string;\n repository?: string;\n tag?: string;\n digest?: string;\n imageId?: string;\n}\n\nexport interface IDockerImageAndTagSelectorProps {\n specifyTagByRegex: boolean;\n imageId: string;\n organization: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n account: string;\n showRegistry?: boolean;\n onChange: (changes: IDockerImageAndTagChanges) => void;\n deferInitialization?: boolean;\n showDigest?: boolean;\n allowManualDefinition?: boolean;\n}\n\nexport interface IDockerImageAndTagSelectorState {\n accountOptions: Array<Option<string>>;\n switchedManualWarning: string;\n missingFields?: string[];\n imagesLoaded: boolean;\n imagesLoading: boolean;\n organizationOptions: Array<Option<string>>;\n repositoryOptions: Array<Option<string>>;\n defineManually: boolean;\n tagOptions: Array<Option<string>>;\n lookupType: IDockerLookupType;\n}\n\nconst imageFields = ['organization', 'repository', 'tag', 'digest'];\nconst defineOptions = [\n { label: 'Manually', value: true },\n { label: 'Select from list', value: false },\n];\n\nexport class DockerImageAndTagSelector extends React.Component<\n IDockerImageAndTagSelectorProps,\n IDockerImageAndTagSelectorState\n> {\n public static defaultProps: Partial<IDockerImageAndTagSelectorProps> = {\n organization: '',\n registry: '',\n repository: '',\n showDigest: true,\n allowManualDefinition: true,\n };\n\n private unmounted = false;\n private images: IDockerImage[];\n private accounts: string[];\n\n private registryMap: { [key: string]: string };\n private accountMap: { [key: string]: string[] };\n private newAccounts: string[];\n private organizationMap: { [key: string]: string[] };\n private repositoryMap: { [key: string]: string[] };\n private organizations: string[];\n private cachedValues: { [key: string]: string } = {};\n\n public constructor(props: IDockerImageAndTagSelectorProps) {\n super(props);\n\n const accountOptions = props.account ? [{ label: props.account, value: props.account }] : [];\n const organizationOptions =\n props.organization && props.organization.length ? [{ label: props.organization, value: props.organization }] : [];\n const repositoryOptions =\n props.repository && props.repository.length ? [{ label: props.repository, value: props.repository }] : [];\n const tagOptions = props.tag && props.tag.length ? [{ label: props.tag, value: props.tag }] : [];\n const parsedImageId = DockerImageUtils.splitImageId(props.imageId);\n const defineManually = props.allowManualDefinition && Boolean(props.imageId && props.imageId.includes('${'));\n\n this.state = {\n accountOptions,\n switchedManualWarning: undefined,\n imagesLoaded: false,\n imagesLoading: false,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n lookupType: props.digest || parsedImageId.digest ? 'digest' : 'tag',\n };\n }\n\n private getAccountMap(images: IDockerImage[]): { [key: string]: string[] } {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'account',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => `${i.repository.split('/').slice(0, -1).join('/')}`));\n return acc;\n },\n {},\n );\n }\n\n private getRegistryMap(images: IDockerImage[]) {\n return images.reduce((m: { [key: string]: string }, image: IDockerImage) => {\n m[image.account] = image.registry;\n return m;\n }, {} as { [key: string]: string });\n }\n\n private getOrganizationMap(images: IDockerImage[]): { [key: string]: string[] } {\n const extractGroupByKey = (image: IDockerImage) =>\n `${image.account}/${image.repository.split('/').slice(0, -1).join('/')}`;\n const groupedImages = groupBy(\n images.filter((image) => image.repository),\n extractGroupByKey,\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.repository));\n return acc;\n },\n {},\n );\n }\n\n private getRepositoryMap(images: IDockerImage[]) {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'repository',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.tag));\n return acc;\n },\n {},\n );\n }\n\n private getOrganizationsList(accountMap: { [key: string]: string[] }) {\n return accountMap ? accountMap[this.props.showRegistry ? this.props.account : this.props.registry] || [] : [];\n }\n\n private getRepositoryList(organizationMap: { [key: string]: string[] }, organization: string, registry: string) {\n if (organizationMap) {\n const key = `${this.props.showRegistry ? this.props.account : registry}/${organization || ''}`;\n return organizationMap[key] || [];\n }\n return [];\n }\n\n private getTags(tag: string, repositoryMap: { [key: string]: string[] }, repository: string) {\n let tags: string[] = [];\n if (this.props.specifyTagByRegex) {\n if (tag && trim(tag) === '') {\n tag = undefined;\n }\n } else {\n if (repositoryMap) {\n tags = repositoryMap[repository] || [];\n if (!tags.includes(tag) && tag && !tag.includes('${')) {\n tag = undefined;\n }\n }\n }\n\n return { tag, tags };\n }\n\n public componentWillReceiveProps(nextProps: IDockerImageAndTagSelectorProps) {\n if (\n !this.images ||\n ['account', 'showRegistry'].some(\n (key: keyof IDockerImageAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.refreshImages(nextProps);\n } else if (\n ['organization', 'registry', 'repository'].some(\n (key: keyof IDockerImageAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.updateThings(nextProps);\n }\n\n if (nextProps.imageId && nextProps.imageId.includes('${')) {\n this.setState({ defineManually: true });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n private synchronizeChanges(values: IDockerImageParts, registry: string) {\n const { organization, repository, tag, digest } = values;\n if (this.props.onChange) {\n const imageId = DockerImageUtils.generateImageId({ organization, repository, tag, digest });\n const changes: IDockerImageAndTagChanges = {};\n if (tag !== this.props.tag) {\n changes.tag = tag;\n }\n if (imageId !== this.props.imageId) {\n changes.imageId = imageId;\n }\n if (organization !== this.props.organization) {\n changes.organization = organization;\n }\n if (registry !== this.props.registry) {\n changes.registry = registry;\n }\n if (repository !== this.props.repository) {\n changes.repository = repository;\n }\n if (digest !== this.props.digest) {\n changes.digest = digest;\n }\n if (Object.keys(changes).length > 0) {\n this.props.onChange(changes);\n }\n }\n }\n\n private updateThings(props: IDockerImageAndTagSelectorProps, allowAutoSwitchToManualEntry = false) {\n if (!this.repositoryMap || this.unmounted) {\n return;\n }\n\n const { imageId, specifyTagByRegex } = props;\n let { organization, registry, repository } = props;\n\n if (props.showRegistry) {\n registry = this.registryMap[props.account];\n }\n\n const organizationFound = !organization || this.organizations.includes(organization) || organization.includes('${');\n if (!organizationFound) {\n organization = '';\n }\n\n const repositories = this.getRepositoryList(this.organizationMap, organization, registry);\n const repositoryFound = !repository || repository.includes('${') || repositories.includes(repository);\n\n if (!repositoryFound) {\n repository = '';\n }\n\n const { tag, tags } = this.getTags(props.tag, this.repositoryMap, repository);\n const tagFound = tag === props.tag || specifyTagByRegex;\n\n const newState = {\n accountOptions: this.newAccounts.sort().map((a) => ({ label: a, value: a })),\n organizationOptions: this.organizations\n .filter((o) => o)\n .sort()\n .map((o) => ({ label: o, value: o })),\n imagesLoaded: true,\n repositoryOptions: repositories.sort().map((r) => ({ label: r, value: r })),\n tagOptions: tags.sort().map((t) => ({ label: t, value: t })),\n } as IDockerImageAndTagSelectorState;\n\n if (\n imageId &&\n (!this.state.imagesLoaded || allowAutoSwitchToManualEntry) &&\n (!organizationFound || !repositoryFound || !tagFound)\n ) {\n newState.defineManually = true;\n\n const missingFields: string[] = [];\n if (!organizationFound) {\n missingFields.push('organization');\n }\n if (!repositoryFound) {\n missingFields.push('image');\n }\n if (!tagFound) {\n missingFields.push('tag');\n }\n newState.missingFields = missingFields;\n newState.switchedManualWarning = `Could not find ${missingFields.join(' or ')}, switched to manual entry`;\n } else if (!imageId || !imageId.includes('${')) {\n this.synchronizeChanges(\n this.state.defineManually\n ? DockerImageUtils.splitImageId(imageId)\n : { organization, repository, tag, digest: this.props.digest },\n registry,\n );\n }\n\n this.setState(newState);\n }\n\n private initializeImages(props: IDockerImageAndTagSelectorProps) {\n if (this.state.imagesLoading) {\n return;\n }\n\n const { showRegistry, account, registry } = props;\n\n const imageConfig: IFindImageParams = {\n provider: 'dockerRegistry',\n account: showRegistry ? account : registry,\n };\n\n this.setState({ imagesLoading: true });\n DockerImageReader.findImages(imageConfig)\n .then((images: IDockerImage[]) => {\n this.images = images;\n this.registryMap = this.getRegistryMap(this.images);\n this.accountMap = this.getAccountMap(this.images);\n this.newAccounts = this.accounts || Object.keys(this.accountMap);\n\n this.organizationMap = this.getOrganizationMap(this.images);\n this.repositoryMap = this.getRepositoryMap(this.images);\n this.organizations = this.getOrganizationsList(this.accountMap);\n this.updateThings(props, true);\n })\n .finally(() => {\n if (!this.unmounted) {\n this.setState({ imagesLoading: false });\n }\n });\n }\n\n public handleRefreshImages = (): void => {\n this.refreshImages(this.props);\n };\n\n public refreshImages(props: IDockerImageAndTagSelectorProps): void {\n this.initializeImages(props);\n }\n\n private initializeAccounts(props: IDockerImageAndTagSelectorProps) {\n let { account } = props;\n AccountService.listAccounts('dockerRegistry').then((allAccounts: IAccount[]) => {\n const accounts = allAccounts.map((a: IAccount) => a.name);\n if (this.props.showRegistry && !account) {\n account = accounts[0];\n }\n this.accounts = accounts;\n this.refreshImages({ ...props, ...{ account } });\n });\n }\n\n private isNew(): boolean {\n const { account, organization, registry, repository, tag } = this.props;\n return !account && !organization && !registry && !repository && !tag;\n }\n\n public componentDidMount() {\n if (!this.props.deferInitialization && (this.props.registry || this.isNew())) {\n this.initializeAccounts(this.props);\n }\n }\n\n private valueChanged(name: string, value: string) {\n const changes = { [name]: value };\n if (imageFields.some((n) => n === name)) {\n // values are parts of the image\n const { organization, repository, tag, digest } = this.props;\n const imageParts = { ...{ organization, repository, tag, digest }, ...changes };\n const imageId = DockerImageUtils.generateImageId(imageParts);\n changes.imageId = imageId;\n }\n this.props.onChange && this.props.onChange(changes);\n }\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n const oldType = this.state.lookupType;\n const oldValue = this.props[oldType];\n const cachedValue = this.cachedValues[newType];\n\n this.valueChanged(oldType, undefined);\n if (this.cachedValues[newType]) {\n this.valueChanged(newType, cachedValue);\n }\n this.setState({ lookupType: newType });\n this.cachedValues[oldType] = oldValue;\n };\n\n private showManualInput = (defineManually: boolean) => {\n if (!defineManually) {\n const newFields = DockerImageUtils.splitImageId(this.props.imageId || '');\n this.props.onChange(newFields);\n if (this.state.switchedManualWarning) {\n this.setState({ switchedManualWarning: undefined, missingFields: undefined });\n }\n }\n this.setState({ defineManually });\n };\n\n public render() {\n const {\n account,\n allowManualDefinition,\n digest,\n imageId,\n organization,\n repository,\n showDigest,\n showRegistry,\n specifyTagByRegex,\n tag,\n } = this.props;\n const {\n accountOptions,\n switchedManualWarning,\n missingFields,\n imagesLoading,\n lookupType,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n } = this.state;\n\n const parsedImageId = DockerImageUtils.splitImageId(imageId);\n\n const manualInputToggle = (\n <div className=\"sp-formItem groupHeader\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Define Image ID</div>\n\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={defineManually}\n disabled={imagesLoading || !allowManualDefinition}\n onChange={(o: Option<boolean>) => this.showManualInput(o.value)}\n options={defineOptions}\n clearable={false}\n />\n </span>\n </div>\n </div>\n </div>\n );\n\n const warning = switchedManualWarning ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\" />\n <div className=\"sp-formItem__right\">\n <ValidationMessage\n type=\"warning\"\n message={\n <>\n {switchedManualWarning}\n {(missingFields || []).map((f) => (\n <div key={f}>\n <HelpField expand={true} id={`pipeline.config.docker.trigger.missing.${f}`} />\n </div>\n ))}\n </>\n }\n />\n </div>\n </div>\n ) : null;\n\n if (defineManually) {\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image ID</div>\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n value={imageId || ''}\n onChange={(e) => this.valueChanged('imageId', e.target.value)}\n />\n </span>\n </div>\n </div>\n </div>\n {warning}\n </div>\n );\n }\n\n const Registry = showRegistry ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Registry Name</div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={account}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('account', o ? o.value : '')}\n options={accountOptions}\n isLoading={imagesLoading}\n />\n </span>\n <span className=\"sp-formActions sp-formActions--web\">\n <span className=\"action\">\n <Tooltip value={imagesLoading ? 'Images refreshing' : 'Refresh images list'}>\n <i\n className={`fa icon-button-refresh-arrows ${imagesLoading ? 'fa-spin' : ''}`}\n onClick={this.handleRefreshImages}\n />\n </Tooltip>\n </span>\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const Organization = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Organization</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {organization.includes('${') ? (\n <input\n disabled={imagesLoading}\n className=\"form-control input-sm\"\n value={organization || ''}\n onChange={(e) => this.valueChanged('organization', e.target.value)}\n />\n ) : (\n <Select\n value={organization || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('organization', (o && o.value) || '')}\n placeholder=\"No organization\"\n options={organizationOptions}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Image = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {repository.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={repository || ''}\n onChange={(e) => this.valueChanged('repository', e.target.value)}\n />\n ) : (\n <Select\n value={repository || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('repository', (o && o.value) || '')}\n options={repositoryOptions}\n required={true}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Tag =\n lookupType === 'tag' ? (\n specifyTagByRegex ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n type=\"text\"\n className=\"form-control input-sm\"\n value={tag || ''}\n disabled={imagesLoading || !repository}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n />\n </span>\n </div>\n <HelpField id=\"pipeline.config.docker.trigger.tag\" expand={true} />\n </div>\n </div>\n ) : (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {tag && tag.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={tag || ''}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n required={true}\n />\n ) : (\n <>\n <Select\n value={tag || ''}\n disabled={imagesLoading || !repository}\n isLoading={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('tag', o ? o.value : undefined)}\n options={tagOptions}\n placeholder=\"No tag\"\n required={true}\n />\n <HelpField id=\"pipeline.config.docker.trigger.tag.additionalInfo\" expand={true} />\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n ) : null;\n\n const Digest =\n lookupType === 'digest' ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n placeholder=\"sha256:abc123\"\n value={digest || parsedImageId.digest || ''}\n onChange={(e) => this.valueChanged('digest', e.target.value)}\n required={true}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const LookupTypeSelector = showDigest ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Type</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n clearable={false}\n value={lookupType}\n options={[\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n ]}\n onChange={this.lookupTypeChanged}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n {Registry}\n {Organization}\n {Image}\n {LookupTypeSelector}\n {Digest}\n {Tag}\n </div>\n );\n }\n}\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { SETTINGS } from '@spinnaker/core';\n\nexport const DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.docker.pipeline.stage.bake.executionDetails.controller';\nexport const name = DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'dockerBakeExecutionDetailsCtrl',\n [\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($scope, $stateParams, executionDetailsSectionService, $interpolate) {\n $scope.configSections = ['bakeConfig', 'taskStatus'];\n\n const initialized = () => {\n $scope.detailsSection = $stateParams.details;\n $scope.provider = $scope.stage.context.cloudProviderType || 'docker';\n $scope.bakeryDetailUrl = $interpolate(\n $scope.roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl,\n );\n };\n\n const initialize = () => executionDetailsSectionService.synchronizeSection($scope.configSections, initialized);\n\n initialize();\n\n $scope.$on('$stateChangeSuccess', initialize);\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AuthenticationService, BakeExecutionLabel, BakeryReader, Registry } from '@spinnaker/core';\nimport { DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\n\n/*\n This stage is just here so that we can experiment with baking Docker containers within pipelines.\n Without this stage, programmatically-created pipelines with Docker bake stages would not render\n execution details.\n */\nexport const DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE = 'spinnaker.docker.pipeline.stage.bakeStage';\nexport const name = DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE; // for backwards compatibility\nmodule(DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE, [DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'docker',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [{ type: 'requiredField', fieldName: 'package' }],\n restartable: true,\n });\n })\n .controller('dockerBakeStageCtrl', [\n '$scope',\n '$q',\n function ($scope, $q) {\n const stage = $scope.stage;\n\n stage.region = 'global';\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n $scope.viewState = {\n loading: true,\n };\n\n function initialize() {\n $scope.viewState.providerSelected = true;\n $q.all([BakeryReader.getBaseOsOptions('docker'), BakeryReader.getBaseLabelOptions()]).then(function ([\n baseOsOptions,\n baseLabelOptions,\n ]) {\n $scope.baseOsOptions = baseOsOptions.baseImages;\n $scope.baseLabelOptions = baseLabelOptions;\n\n if (!$scope.stage.baseOs && $scope.baseOsOptions && $scope.baseOsOptions.length) {\n $scope.stage.baseOs = $scope.baseOsOptions[0].id;\n }\n if (!$scope.stage.baseLabel && $scope.baseLabelOptions && $scope.baseLabelOptions.length) {\n $scope.stage.baseLabel = $scope.baseLabelOptions[0];\n }\n $scope.viewState.loading = false;\n });\n }\n\n function deleteEmptyProperties() {\n _.forOwn($scope.stage, function (val, key) {\n if (val === '') {\n delete $scope.stage[key];\n }\n });\n }\n\n $scope.$watch('stage', deleteEmptyProperties, true);\n\n initialize();\n },\n ]);\n","import { groupBy, reduce, trim, uniq } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IFindImageParams } from '@spinnaker/core';\nimport { AccountService, HelpField, Tooltip, ValidationMessage } from '@spinnaker/core';\n\nimport type { IDockerImage } from './DockerImageReader';\nimport { DockerChartImageReader } from './DockerImageReader';\nimport type { IDockerImageParts } from './DockerImageUtils';\nimport { DockerImageUtils } from './DockerImageUtils';\n\nexport type IDockerLookupType = 'tag' | 'digest';\n\nexport interface IDockerChartAndTagChanges {\n account?: string;\n organization?: string;\n registry?: string;\n repository?: string;\n tag?: string;\n digest?: string;\n imageId?: string;\n}\n\nexport interface IDockerChartAndTagSelectorProps {\n specifyTagByRegex: boolean;\n imageId: string;\n organization: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n account: string;\n showRegistry?: boolean;\n onChange: (changes: IDockerChartAndTagChanges) => void;\n deferInitialization?: boolean;\n showDigest?: boolean;\n allowManualDefinition?: boolean;\n}\n\nexport interface IDockerChartAndTagSelectorState {\n accountOptions: Array<Option<string>>;\n switchedManualWarning: string;\n missingFields?: string[];\n imagesLoaded: boolean;\n imagesLoading: boolean;\n organizationOptions: Array<Option<string>>;\n repositoryOptions: Array<Option<string>>;\n defineManually: boolean;\n tagOptions: Array<Option<string>>;\n lookupType: IDockerLookupType;\n}\n\nconst imageFields = ['organization', 'repository', 'tag', 'digest'];\nconst defineOptions = [\n { label: 'Manually', value: true },\n { label: 'Select from list', value: false },\n];\n\nexport class DockerChartAndTagSelector extends React.Component<\n IDockerChartAndTagSelectorProps,\n IDockerChartAndTagSelectorState\n> {\n public static defaultProps: Partial<IDockerChartAndTagSelectorProps> = {\n organization: '',\n registry: '',\n repository: '',\n showDigest: true,\n allowManualDefinition: true,\n };\n\n private unmounted = false;\n private images: IDockerImage[];\n private accounts: string[];\n\n private registryMap: { [key: string]: string };\n private accountMap: { [key: string]: string[] };\n private newAccounts: string[];\n private organizationMap: { [key: string]: string[] };\n private repositoryMap: { [key: string]: string[] };\n private organizations: string[];\n private cachedValues: { [key: string]: string } = {};\n\n public constructor(props: IDockerChartAndTagSelectorProps) {\n super(props);\n\n const accountOptions = props.account ? [{ label: props.account, value: props.account }] : [];\n const organizationOptions =\n props.organization && props.organization.length ? [{ label: props.organization, value: props.organization }] : [];\n const repositoryOptions =\n props.repository && props.repository.length ? [{ label: props.repository, value: props.repository }] : [];\n const tagOptions = props.tag && props.tag.length ? [{ label: props.tag, value: props.tag }] : [];\n const parsedImageId = DockerImageUtils.splitImageId(props.imageId);\n const defineManually = props.allowManualDefinition && Boolean(props.imageId && props.imageId.includes('${'));\n\n this.state = {\n accountOptions,\n switchedManualWarning: undefined,\n imagesLoaded: false,\n imagesLoading: false,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n lookupType: props.digest || parsedImageId.digest ? 'digest' : 'tag',\n };\n }\n\n private getAccountMap(images: IDockerImage[]): { [key: string]: string[] } {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'account',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => `${i.repository.split('/').slice(0, -1).join('/')}`));\n return acc;\n },\n {},\n );\n }\n\n private getRegistryMap(images: IDockerImage[]) {\n return images.reduce((m: { [key: string]: string }, image: IDockerImage) => {\n m[image.account] = image.registry;\n return m;\n }, {} as { [key: string]: string });\n }\n\n private getOrganizationMap(images: IDockerImage[]): { [key: string]: string[] } {\n const extractGroupByKey = (image: IDockerImage) =>\n `${image.account}/${image.repository.split('/').slice(0, -1).join('/')}`;\n const groupedImages = groupBy(\n images.filter((image) => image.repository),\n extractGroupByKey,\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.repository));\n return acc;\n },\n {},\n );\n }\n\n private getRepositoryMap(images: IDockerImage[]) {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'repository',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.tag));\n return acc;\n },\n {},\n );\n }\n\n private getOrganizationsList(accountMap: { [key: string]: string[] }) {\n return accountMap ? accountMap[this.props.showRegistry ? this.props.account : this.props.registry] || [] : [];\n }\n\n private getRepositoryList(organizationMap: { [key: string]: string[] }, organization: string, registry: string) {\n if (organizationMap) {\n const key = `${this.props.showRegistry ? this.props.account : registry}/${organization || ''}`;\n return organizationMap[key] || [];\n }\n return [];\n }\n\n private getTags(tag: string, repositoryMap: { [key: string]: string[] }, repository: string) {\n let tags: string[] = [];\n if (this.props.specifyTagByRegex) {\n if (tag && trim(tag) === '') {\n tag = undefined;\n }\n } else {\n if (repositoryMap) {\n tags = repositoryMap[repository] || [];\n if (!tags.includes(tag) && tag && !tag.includes('${')) {\n tag = undefined;\n }\n }\n }\n\n return { tag, tags };\n }\n\n public componentWillReceiveProps(nextProps: IDockerChartAndTagSelectorProps) {\n if (\n !this.images ||\n ['account', 'showRegistry'].some(\n (key: keyof IDockerChartAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.refreshImages(nextProps);\n } else if (\n ['organization', 'registry', 'repository'].some(\n (key: keyof IDockerChartAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.updateThings(nextProps);\n }\n\n if (nextProps.imageId && nextProps.imageId.includes('${')) {\n this.setState({ defineManually: true });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n private synchronizeChanges(values: IDockerImageParts, registry: string) {\n const { organization, repository, tag, digest } = values;\n if (this.props.onChange) {\n const imageId = DockerImageUtils.generateImageId({ organization, repository, tag, digest });\n const changes: IDockerChartAndTagChanges = {};\n if (tag !== this.props.tag) {\n changes.tag = tag;\n }\n if (imageId !== this.props.imageId) {\n changes.imageId = imageId;\n }\n if (organization !== this.props.organization) {\n changes.organization = organization;\n }\n if (registry !== this.props.registry) {\n changes.registry = registry;\n }\n if (repository !== this.props.repository) {\n changes.repository = repository;\n }\n if (digest !== this.props.digest) {\n changes.digest = digest;\n }\n if (Object.keys(changes).length > 0) {\n this.props.onChange(changes);\n }\n }\n }\n\n private updateThings(props: IDockerChartAndTagSelectorProps, allowAutoSwitchToManualEntry = false) {\n if (!this.repositoryMap || this.unmounted) {\n return;\n }\n\n const { imageId, specifyTagByRegex } = props;\n let { organization, registry, repository } = props;\n\n if (props.showRegistry) {\n registry = this.registryMap[props.account];\n }\n\n const organizationFound = !organization || this.organizations.includes(organization) || organization.includes('${');\n if (!organizationFound) {\n organization = '';\n }\n\n const repositories = this.getRepositoryList(this.organizationMap, organization, registry);\n const repositoryFound = !repository || repository.includes('${') || repositories.includes(repository);\n\n if (!repositoryFound) {\n repository = '';\n }\n\n const { tag, tags } = this.getTags(props.tag, this.repositoryMap, repository);\n const tagFound = tag === props.tag || specifyTagByRegex;\n\n const newState = {\n accountOptions: this.newAccounts.sort().map((a) => ({ label: a, value: a })),\n organizationOptions: this.organizations\n .filter((o) => o)\n .sort()\n .map((o) => ({ label: o, value: o })),\n imagesLoaded: true,\n repositoryOptions: repositories.sort().map((r) => ({ label: r, value: r })),\n tagOptions: tags.sort().map((t) => ({ label: t, value: t })),\n } as IDockerChartAndTagSelectorState;\n\n if (\n imageId &&\n (!this.state.imagesLoaded || allowAutoSwitchToManualEntry) &&\n (!organizationFound || !repositoryFound || !tagFound)\n ) {\n newState.defineManually = true;\n\n const missingFields: string[] = [];\n if (!organizationFound) {\n missingFields.push('organization');\n }\n if (!repositoryFound) {\n missingFields.push('image');\n }\n if (!tagFound) {\n missingFields.push('tag');\n }\n newState.missingFields = missingFields;\n newState.switchedManualWarning = `Could not find ${missingFields.join(' or ')}, switched to manual entry`;\n } else if (!imageId || !imageId.includes('${')) {\n this.synchronizeChanges(\n this.state.defineManually\n ? DockerImageUtils.splitImageId(imageId)\n : { organization, repository, tag, digest: this.props.digest },\n registry,\n );\n }\n\n this.setState(newState);\n }\n\n private initializeImages(props: IDockerChartAndTagSelectorProps) {\n if (this.state.imagesLoading) {\n return;\n }\n\n const { showRegistry, account, registry } = props;\n\n const imageConfig: IFindImageParams = {\n provider: 'dockerRegistry',\n account: showRegistry ? account : registry,\n };\n\n this.setState({ imagesLoading: true });\n DockerChartImageReader.findImages(imageConfig)\n .then((images: IDockerImage[]) => {\n this.images = images;\n this.registryMap = this.getRegistryMap(this.images);\n this.accountMap = this.getAccountMap(this.images);\n this.newAccounts = this.accounts || Object.keys(this.accountMap);\n\n this.organizationMap = this.getOrganizationMap(this.images);\n this.repositoryMap = this.getRepositoryMap(this.images);\n this.organizations = this.getOrganizationsList(this.accountMap);\n this.updateThings(props, true);\n })\n .finally(() => {\n if (!this.unmounted) {\n this.setState({ imagesLoading: false });\n }\n });\n }\n\n public handleRefreshImages = (): void => {\n this.refreshImages(this.props);\n };\n\n public refreshImages(props: IDockerChartAndTagSelectorProps): void {\n this.initializeImages(props);\n }\n\n private initializeAccounts(props: IDockerChartAndTagSelectorProps) {\n let { account } = props;\n AccountService.listAccounts('dockerRegistry').then((allAccounts: IAccount[]) => {\n const accounts = allAccounts.map((a: IAccount) => a.name);\n if (this.props.showRegistry && !account) {\n account = accounts[0];\n }\n this.accounts = accounts;\n this.refreshImages({ ...props, ...{ account } });\n });\n }\n\n private isNew(): boolean {\n const { account, organization, registry, repository, tag } = this.props;\n return !account && !organization && !registry && !repository && !tag;\n }\n\n public componentDidMount() {\n if (!this.props.deferInitialization && (this.props.registry || this.isNew())) {\n this.initializeAccounts(this.props);\n }\n }\n\n private valueChanged(name: string, value: string) {\n const changes = { [name]: value };\n if (imageFields.some((n) => n === name)) {\n // values are parts of the image\n const { organization, repository, tag, digest } = this.props;\n const imageParts = { ...{ organization, repository, tag, digest }, ...changes };\n const imageId = DockerImageUtils.generateImageId(imageParts);\n changes.imageId = imageId;\n }\n this.props.onChange && this.props.onChange(changes);\n }\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n const oldType = this.state.lookupType;\n const oldValue = this.props[oldType];\n const cachedValue = this.cachedValues[newType];\n\n this.valueChanged(oldType, undefined);\n if (this.cachedValues[newType]) {\n this.valueChanged(newType, cachedValue);\n }\n this.setState({ lookupType: newType });\n this.cachedValues[oldType] = oldValue;\n };\n\n private showManualInput = (defineManually: boolean) => {\n if (!defineManually) {\n const newFields = DockerImageUtils.splitImageId(this.props.imageId || '');\n this.props.onChange(newFields);\n if (this.state.switchedManualWarning) {\n this.setState({ switchedManualWarning: undefined, missingFields: undefined });\n }\n }\n this.setState({ defineManually });\n };\n\n public render() {\n const {\n account,\n allowManualDefinition,\n digest,\n imageId,\n organization,\n repository,\n showDigest,\n showRegistry,\n specifyTagByRegex,\n tag,\n } = this.props;\n const {\n accountOptions,\n switchedManualWarning,\n missingFields,\n imagesLoading,\n lookupType,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n } = this.state;\n\n const parsedImageId = DockerImageUtils.splitImageId(imageId);\n\n const manualInputToggle = (\n <div className=\"sp-formItem groupHeader\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Define Image ID</div>\n\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={defineManually}\n disabled={imagesLoading || !allowManualDefinition}\n onChange={(o: Option<boolean>) => this.showManualInput(o.value)}\n options={defineOptions}\n clearable={false}\n />\n </span>\n </div>\n </div>\n </div>\n );\n\n const warning = switchedManualWarning ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\" />\n <div className=\"sp-formItem__right\">\n <ValidationMessage\n type=\"warning\"\n message={\n <>\n {switchedManualWarning}\n {(missingFields || []).map((f) => (\n <div key={f}>\n <HelpField expand={true} id={`pipeline.config.docker.trigger.missing.${f}`} />\n </div>\n ))}\n </>\n }\n />\n </div>\n </div>\n ) : null;\n\n if (defineManually) {\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image ID</div>\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n value={imageId || ''}\n onChange={(e) => this.valueChanged('imageId', e.target.value)}\n />\n </span>\n </div>\n </div>\n </div>\n {warning}\n </div>\n );\n }\n\n const Registry = showRegistry ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Registry Name</div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={account}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('account', o ? o.value : '')}\n options={accountOptions}\n isLoading={imagesLoading}\n />\n </span>\n <span className=\"sp-formActions sp-formActions--web\">\n <span className=\"action\">\n <Tooltip value={imagesLoading ? 'Images refreshing' : 'Refresh images list'}>\n <i\n className={`fa icon-button-refresh-arrows ${imagesLoading ? 'fa-spin' : ''}`}\n onClick={this.handleRefreshImages}\n />\n </Tooltip>\n </span>\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const Organization = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Organization</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {organization.includes('${') ? (\n <input\n disabled={imagesLoading}\n className=\"form-control input-sm\"\n value={organization || ''}\n onChange={(e) => this.valueChanged('organization', e.target.value)}\n />\n ) : (\n <Select\n value={organization || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('organization', (o && o.value) || '')}\n placeholder=\"No organization\"\n options={organizationOptions}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Image = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {repository.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={repository || ''}\n onChange={(e) => this.valueChanged('repository', e.target.value)}\n />\n ) : (\n <Select\n value={repository || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('repository', (o && o.value) || '')}\n options={repositoryOptions}\n required={true}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Tag =\n lookupType === 'tag' ? (\n specifyTagByRegex ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n type=\"text\"\n className=\"form-control input-sm\"\n value={tag || ''}\n disabled={imagesLoading || !repository}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n />\n </span>\n </div>\n <HelpField id=\"pipeline.config.docker.trigger.tag\" expand={true} />\n </div>\n </div>\n ) : (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {tag && tag.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={tag || ''}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n required={true}\n />\n ) : (\n <>\n <Select\n value={tag || ''}\n disabled={imagesLoading || !repository}\n isLoading={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('tag', o ? o.value : undefined)}\n options={tagOptions}\n placeholder=\"No tag\"\n required={true}\n />\n <HelpField id=\"pipeline.config.docker.trigger.tag.additionalInfo\" expand={true} />\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n ) : null;\n\n const Digest =\n lookupType === 'digest' ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n placeholder=\"sha256:abc123\"\n value={digest || parsedImageId.digest || ''}\n onChange={(e) => this.valueChanged('digest', e.target.value)}\n required={true}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const LookupTypeSelector = showDigest ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Type</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n clearable={false}\n value={lookupType}\n options={[\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n ]}\n onChange={this.lookupTypeChanged}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n {Registry}\n {Organization}\n {Image}\n {LookupTypeSelector}\n {Digest}\n {Tag}\n </div>\n );\n }\n}\n","import { get } from 'lodash';\nimport { $q } from 'ngimport';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport type { Subscription } from 'rxjs';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\n\nimport type { IDockerTrigger, IPipelineCommand, ITriggerTemplateComponentProps } from '@spinnaker/core';\nimport { HelpField, Spinner, TetheredSelect } from '@spinnaker/core';\n\nimport type { IDockerLookupType } from '../../image';\nimport { DockerChartImageReader } from '../../image';\nimport { DockerImageReader } from '../../image';\n\nconst lookupTypeOptions = [\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n];\n\nexport interface IDockerTriggerTemplateState {\n digest: string;\n tags: string[];\n tagsLoading: boolean;\n loadError: boolean;\n lookupType: string;\n selectedTag: string;\n}\n\nexport class DockerTriggerTemplate extends React.Component<\n ITriggerTemplateComponentProps,\n IDockerTriggerTemplateState\n> {\n private queryStream = new Subject();\n private subscription: Subscription;\n\n public static formatLabel(trigger: IDockerTrigger): PromiseLike<string> {\n return $q.when(`(Docker Registry) ${trigger.account ? trigger.account + ':' : ''} ${trigger.repository || ''}`);\n }\n\n public constructor(props: ITriggerTemplateComponentProps) {\n super(props);\n this.state = {\n digest: '',\n tags: [],\n tagsLoading: true,\n loadError: false,\n lookupType: 'tag',\n selectedTag: '',\n };\n }\n\n private handleQuery = () => {\n const trigger = this.props.command.trigger as IDockerTrigger;\n if (trigger.type === 'helm/oci') {\n return observableFrom(\n DockerChartImageReader.findTags({\n provider: 'dockerRegistry', // Use helmOci provider for Helm OCI triggers\n account: trigger.account,\n repository: trigger.repository,\n }),\n );\n } else {\n return observableFrom(\n DockerImageReader.findTags({\n provider: 'dockerRegistry',\n account: trigger.account,\n repository: trigger.repository,\n }),\n );\n }\n };\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n this.updateArtifact(this.props.command, newType === 'tag' ? this.state.selectedTag : this.state.digest);\n this.setState({ lookupType: newType });\n };\n\n private updateArtifact(command: IPipelineCommand, tagOrDigest: string) {\n this.props.updateCommand('extraFields.tag', tagOrDigest);\n const trigger = command.trigger as IDockerTrigger;\n if (trigger && trigger.repository) {\n let imageName = '';\n if (trigger.registry) {\n imageName += trigger.registry + '/';\n }\n imageName += trigger.repository;\n\n let imageReference = '';\n if (this.state.lookupType === 'digest') {\n imageReference = `${imageName}@${tagOrDigest}`;\n } else {\n imageReference = `${imageName}:${tagOrDigest}`;\n }\n // Use 'helm/image' artifact type for helm/oci triggers, otherwise use 'docker/image'\n const artifactType = trigger.type === 'docker' ? 'docker/image' : 'helm/image';\n\n this.props.updateCommand('extraFields.artifacts', [\n {\n type: artifactType,\n name: imageName,\n version: tagOrDigest,\n reference: imageReference,\n },\n ]);\n }\n }\n\n private updateSelectedTag = (tag: string) => {\n this.updateArtifact(this.props.command, tag);\n this.setState({ selectedTag: tag });\n this.props.command.triggerInvalid = false;\n };\n\n private updateDigest = (digest: string) => {\n this.updateArtifact(this.props.command, digest);\n this.setState({ digest });\n };\n\n private tagLoadSuccess = (tags: string[]) => {\n const { command } = this.props;\n const trigger = command.trigger as IDockerTrigger;\n const newState = {} as IDockerTriggerTemplateState;\n newState.tags = tags || [];\n // default to what is supplied by the trigger if possible\n const defaultSelection = newState.tags.find((t) => t === trigger.tag);\n if (defaultSelection) {\n newState.selectedTag = defaultSelection;\n this.updateSelectedTag(defaultSelection);\n }\n newState.tagsLoading = false;\n this.setState(newState);\n };\n\n private tagLoadFailure = () => {\n this.setState({\n tagsLoading: false,\n loadError: true,\n });\n };\n\n private initialize = () => {\n const { command } = this.props;\n this.props.updateCommand('triggerInvalid', true);\n\n // These fields will be added to the trigger when the form is submitted\n this.props.updateCommand('extraFields', {\n tag: get(command, 'extraFields.tag', ''),\n artifacts: get(command, 'extraFields.artifacts', ''),\n });\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n // cancel search stream if trigger has changed to some other type\n if (command.trigger.type !== 'docker' && command.trigger.type !== 'helm/oci') {\n return;\n }\n\n this.subscription = this.queryStream\n .pipe(debounceTime(250), switchMap(this.handleQuery))\n .subscribe(this.tagLoadSuccess, this.tagLoadFailure);\n\n this.searchTags();\n };\n\n public componentDidMount() {\n this.initialize();\n }\n\n public componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n private searchTags = (query = '') => {\n this.setState({ tags: [`<span>Finding tags${query && ` matching ${query}`}...</span>`] });\n this.queryStream.next();\n };\n\n public render() {\n const { digest, tags, tagsLoading, loadError, selectedTag, lookupType } = this.state;\n\n const options = tags.map((tag) => {\n return { value: tag } as Option<string>;\n });\n\n return (\n <>\n <div className=\"form-group\">\n <div className=\"sm-label-right col-md-4\">Type</div>\n <div className=\"col-md-3\">\n <TetheredSelect\n clearable={false}\n value={lookupType}\n options={lookupTypeOptions}\n onChange={this.lookupTypeChanged}\n />\n </div>\n </div>\n {lookupType === 'tag' && (\n <div className=\"form-group\">\n <label className=\"col-md-4 sm-label-right\">Tag</label>\n {tagsLoading && (\n <div className=\"col-md-6\">\n <div className=\"form-control-static text-center\">\n <Spinner size=\"small\" />\n </div>\n </div>\n )}\n {loadError && <div className=\"col-md-6\">Error loading tags!</div>}\n {!tagsLoading && (\n <div className=\"col-md-6\">\n {tags.length === 0 && (\n <div>\n <p className=\"form-control-static\">No tags found</p>\n </div>\n )}\n {tags.length > 0 && (\n <TetheredSelect\n options={options}\n optionRenderer={(o) => <span>{o.value}</span>}\n clearable={false}\n value={selectedTag}\n valueRenderer={(o) => (\n <span>\n <strong>{o.value}</strong>\n </span>\n )}\n onChange={(o: Option<string>) => this.updateSelectedTag(o.value)}\n placeholder=\"Search tags...\"\n />\n )}\n </div>\n )}\n </div>\n )}\n {lookupType === 'digest' && (\n <div className=\"form-group\">\n <label className=\"col-md-4 sm-label-right\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </label>\n <div className=\"col-md-6\">\n <input\n value={digest}\n onChange={(e) => this.updateDigest(e.target.value)}\n className=\"form-control input-sm\"\n required={true}\n />\n </div>\n </div>\n )}\n </>\n );\n }\n}\n","import React from 'react';\n\nimport type { IDockerTrigger, IExecutionTriggerStatusComponentProps } from '@spinnaker/core';\nimport { Registry } from '@spinnaker/core';\n\nimport { DockerHelmOciTriggerConfig } from './DockerHelmOciTriggerConfig';\nimport { DockerTriggerConfig } from './DockerTriggerConfig';\nimport { DockerTriggerTemplate } from './DockerTriggerTemplate';\n\nconst DockerTriggerExecutionStatus = (props: IExecutionTriggerStatusComponentProps) => {\n const trigger = props.trigger as IDockerTrigger;\n return (\n <li>\n {trigger.repository}:{trigger.tag}\n </li>\n );\n};\n\nRegistry.pipeline.registerTrigger({\n label: 'Docker Registry',\n description: 'Executes the pipeline on an image update',\n key: 'docker',\n component: DockerTriggerConfig,\n manualExecutionComponent: DockerTriggerTemplate,\n executionStatusComponent: DockerTriggerExecutionStatus,\n executionTriggerLabel: () => 'Docker Registry',\n validators: [\n {\n type: 'requiredField',\n fieldName: 'account',\n message: '<strong>Registry</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'requiredField',\n fieldName: 'repository',\n message: '<strong>Image</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'serviceAccountAccess',\n preventSave: true,\n 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.`,\n },\n ],\n});\n\nRegistry.pipeline.registerTrigger({\n label: 'Helm Docker Registry',\n description: 'Executes the pipeline on an helm/image update',\n key: 'helm/oci',\n component: DockerHelmOciTriggerConfig,\n manualExecutionComponent: DockerTriggerTemplate,\n executionStatusComponent: DockerTriggerExecutionStatus,\n executionTriggerLabel: () => 'Helm Docker Registry',\n validators: [\n {\n type: 'requiredField',\n fieldName: 'account',\n message: '<strong>Registry</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'requiredField',\n fieldName: 'repository',\n message: '<strong>Image</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'serviceAccountAccess',\n preventSave: true,\n 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.`,\n },\n ],\n});\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IDockerTrigger } from '@spinnaker/core';\n\nimport type { IDockerImageAndTagChanges } from '../../image';\nimport { DockerImageAndTagSelector } from '../../image';\n\nexport interface IDockerTriggerConfigProps {\n formik: FormikProps<IDockerTrigger>;\n triggerUpdated: (trigger: IDockerTrigger) => void;\n}\n\nexport function DockerTriggerConfig(props: IDockerTriggerConfigProps) {\n const { formik } = props;\n const trigger = formik.values;\n\n const dockerChanged = (changes: IDockerImageAndTagChanges) => {\n // Trigger doesn't use imageId.\n const { imageId, ...rest } = changes;\n props.triggerUpdated(rest as IDockerTrigger);\n };\n\n return (\n <div className=\"form-horizontal\">\n <DockerImageAndTagSelector\n allowManualDefinition={false}\n specifyTagByRegex={true}\n account={trigger.account}\n organization={trigger.organization}\n registry={trigger.registry}\n repository={trigger.repository}\n tag={trigger.tag}\n showRegistry={true}\n onChange={dockerChanged}\n showDigest={false}\n />\n </div>\n );\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IDockerTrigger } from '@spinnaker/core';\nimport type { IDockerChartAndTagChanges } from '../../image/DockerChartAndTagSelector';\nimport { DockerChartAndTagSelector } from '../../image/DockerChartAndTagSelector';\n\nexport interface IDockerTriggerConfigProps {\n formik: FormikProps<IDockerTrigger>;\n triggerUpdated: (trigger: IDockerTrigger) => void;\n}\n\nexport function DockerHelmOciTriggerConfig(props: IDockerTriggerConfigProps) {\n const { formik } = props;\n const trigger = formik.values;\n\n const dockerChanged = (changes: IDockerChartAndTagChanges) => {\n // Trigger doesn't use imageId.\n const { imageId, ...rest } = changes;\n props.triggerUpdated(rest as IDockerTrigger);\n };\n\n return (\n <div className=\"form-horizontal\">\n <DockerChartAndTagSelector\n allowManualDefinition={false}\n specifyTagByRegex={true}\n account={trigger.account}\n organization={trigger.organization}\n registry={trigger.registry}\n repository={trigger.repository}\n tag={trigger.tag}\n showRegistry={true}\n onChange={dockerChanged}\n showDigest={false}\n />\n </div>\n );\n}\n","import { module } from 'angular';\n\nimport { DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE } from './pipeline/stages/bake/dockerBakeStage';\nimport './pipeline/trigger/DockerTrigger';\n\nexport const DOCKER_MODULE = 'spinnaker.docker';\nmodule(DOCKER_MODULE, [DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE]);\n"],"names":["DockerImageReader","getImage","imageName","region","credentials","REST","path","query","provider","get","then","results","length","catch","findImages","params","RetryService","buildRetrySequence","findTags","DockerChartImageReader","DockerImageUtils","splitImageId","imageId","imageParts","includes","split","repository","organization","slice","join","lookup","tag","digest","startsWith","generateImageId","parts","imageFields","defineOptions","label","value","DockerImageAndTagSelector","React","Component","constructor","props","super","this","unmounted","cachedValues","handleRefreshImages","refreshImages","lookupTypeChanged","o","newType","oldType","state","lookupType","oldValue","cachedValue","valueChanged","setState","showManualInput","defineManually","newFields","onChange","switchedManualWarning","missingFields","accountOptions","account","organizationOptions","repositoryOptions","tagOptions","parsedImageId","allowManualDefinition","Boolean","imagesLoaded","imagesLoading","getAccountMap","images","groupedImages","groupBy","filter","image","reduce","acc","key","uniq","map","i","getRegistryMap","m","registry","getOrganizationMap","getRepositoryMap","getOrganizationsList","accountMap","showRegistry","getRepositoryList","organizationMap","getTags","repositoryMap","tags","specifyTagByRegex","trim","componentWillReceiveProps","nextProps","some","updateThings","componentWillUnmount","synchronizeChanges","values","changes","Object","keys","allowAutoSwitchToManualEntry","registryMap","organizationFound","organizations","repositories","repositoryFound","tagFound","newState","newAccounts","sort","a","r","t","push","initializeImages","imageConfig","accounts","finally","initializeAccounts","AccountService","listAccounts","allAccounts","name","isNew","componentDidMount","deferInitialization","n","render","showDigest","manualInputToggle","className","Select","disabled","options","clearable","warning","createElement","ValidationMessage","type","message","f","HelpField","expand","id","e","target","Registry","isLoading","Tooltip","onClick","Organization","placeholder","Image","required","Tag","Fragment","Digest","LookupTypeSelector","defaultProps","DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","module","UIROUTER_ANGULARJS","controller","$scope","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","details","stage","context","cloudProviderType","bakeryDetailUrl","roscoMode","SETTINGS","roscoDetailUrl","initialize","synchronizeSection","$on","DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE","config","pipeline","registerStage","provides","cloudProvider","description","templateUrl","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","validators","fieldName","restartable","$q","user","AuthenticationService","getAuthenticatedUser","viewState","loading","$watch","_","forOwn","val","providerSelected","all","BakeryReader","getBaseOsOptions","getBaseLabelOptions","baseOsOptions","baseLabelOptions","baseImages","baseOs","baseLabel","DockerChartAndTagSelector","lookupTypeOptions","DockerTriggerTemplate","queryStream","Subject","handleQuery","trigger","command","observableFrom","updateArtifact","selectedTag","updateSelectedTag","triggerInvalid","updateDigest","tagLoadSuccess","defaultSelection","find","tagsLoading","tagLoadFailure","loadError","updateCommand","artifacts","subscription","unsubscribe","pipe","debounceTime","switchMap","subscribe","searchTags","next","formatLabel","when","tagOrDigest","imageReference","artifactType","version","reference","TetheredSelect","Spinner","size","optionRenderer","valueRenderer","DockerTriggerExecutionStatus","registerTrigger","component","formik","rest","triggerUpdated","manualExecutionComponent","executionStatusComponent","executionTriggerLabel","preventSave","DOCKER_MODULE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/image/DockerImageReader.ts","../src/image/DockerImageUtils.ts","../src/image/DockerImageAndTagSelector.tsx","../src/pipeline/stages/bake/bakeExecutionDetails.controller.js","../src/pipeline/stages/bake/dockerBakeStage.js","../src/image/DockerChartAndTagSelector.tsx","../src/pipeline/trigger/DockerTriggerTemplate.tsx","../src/pipeline/trigger/DockerTrigger.tsx","../src/pipeline/trigger/DockerTriggerConfig.tsx","../src/pipeline/trigger/DockerHelmOciTriggerConfig.tsx","../src/docker.module.ts"],"sourcesContent":["import type { IFindImageParams, IFindTagsParams, IImage } from '@spinnaker/core';\nimport { REST, RetryService } from '@spinnaker/core';\n\nexport interface IDockerImage extends IImage {\n account: string;\n registry: string;\n repository: string;\n tag: string;\n}\n\nexport class DockerImageReader {\n public static getImage(imageName: string, region: string, credentials: string): PromiseLike<IDockerImage> {\n return REST('/images')\n .path(credentials, region, imageName)\n .query({ provider: 'docker' })\n .get()\n .then((results: IDockerImage[]) => (results && results.length ? results[0] : null))\n .catch((): IDockerImage => null);\n }\n\n public static findImages(params: IFindImageParams): PromiseLike<IDockerImage[]> {\n return RetryService.buildRetrySequence<IDockerImage[]>(\n () => REST('/images/find').query(params).get(),\n (results: IDockerImage[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: IDockerImage[]) => results)\n .catch((): IDockerImage[] => []);\n }\n\n public static findTags(params: IFindTagsParams): PromiseLike<string[]> {\n return RetryService.buildRetrySequence<string[]>(\n () => REST('/images/tags').query(params).get(),\n (results: string[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: string[]) => results)\n .catch((): string[] => []);\n }\n}\n\nexport class DockerChartImageReader {\n public static getImage(imageName: string, region: string, credentials: string): PromiseLike<IDockerImage> {\n return REST('/charts')\n .path(credentials, region, imageName)\n .query({ provider: 'docker' })\n .get()\n .then((results: IDockerImage[]) => (results && results.length ? results[0] : null))\n .catch((): IDockerImage => null);\n }\n\n public static findImages(params: IFindImageParams): PromiseLike<IDockerImage[]> {\n return RetryService.buildRetrySequence<IDockerImage[]>(\n () => REST('/charts/find').query(params).get(),\n (results: IDockerImage[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: IDockerImage[]) => results)\n .catch((): IDockerImage[] => []);\n }\n\n public static findTags(params: IFindTagsParams): PromiseLike<string[]> {\n return RetryService.buildRetrySequence<string[]>(\n () => REST('/charts/tags').query(params).get(),\n (results: string[]) => results.length > 0,\n 10,\n 1000,\n )\n .then((results: string[]) => results)\n .catch((): string[] => []);\n }\n}\n","export interface IDockerImageParts {\n organization: string;\n repository: string;\n tag?: string;\n digest?: string;\n}\n\nexport class DockerImageUtils {\n // Split the image id up into the selectable parts to feed the UI\n public static splitImageId(imageId = ''): IDockerImageParts {\n let imageParts: string[];\n if (imageId.includes('@')) {\n imageParts = imageId.split('@');\n } else {\n imageParts = imageId.split(':');\n }\n const repository = imageParts[0];\n const repositoryParts = repository.split('/');\n // Everything before the last slash is considered the organization\n const organization = repositoryParts.slice(0, -1).join('/');\n\n const lookup = imageParts.length > 1 ? imageParts.slice(1).join(':') : '';\n\n let tag: string;\n let digest: string;\n if (lookup) {\n if (lookup.startsWith('sha256:')) {\n digest = lookup;\n } else {\n tag = lookup;\n }\n }\n\n return { organization, repository, digest, tag };\n }\n\n public static generateImageId(parts: IDockerImageParts): string {\n if (!parts.repository || !(parts.digest || parts.tag)) {\n return undefined;\n }\n\n let imageId: string;\n\n if (parts.digest) {\n imageId = `${parts.repository}@${parts.digest}`;\n } else {\n imageId = `${parts.repository}:${parts.tag}`;\n }\n\n return imageId;\n }\n}\n","import { groupBy, reduce, trim, uniq } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IFindImageParams } from '@spinnaker/core';\nimport { AccountService, HelpField, Tooltip, ValidationMessage } from '@spinnaker/core';\n\nimport type { IDockerImage } from './DockerImageReader';\nimport { DockerImageReader } from './DockerImageReader';\nimport type { IDockerImageParts } from './DockerImageUtils';\nimport { DockerImageUtils } from './DockerImageUtils';\n\nexport type IDockerLookupType = 'tag' | 'digest';\n\nexport interface IDockerImageAndTagChanges {\n account?: string;\n organization?: string;\n registry?: string;\n repository?: string;\n tag?: string;\n digest?: string;\n imageId?: string;\n}\n\nexport interface IDockerImageAndTagSelectorProps {\n specifyTagByRegex: boolean;\n imageId: string;\n organization: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n account: string;\n showRegistry?: boolean;\n onChange: (changes: IDockerImageAndTagChanges) => void;\n deferInitialization?: boolean;\n showDigest?: boolean;\n allowManualDefinition?: boolean;\n}\n\nexport interface IDockerImageAndTagSelectorState {\n accountOptions: Array<Option<string>>;\n switchedManualWarning: string;\n missingFields?: string[];\n imagesLoaded: boolean;\n imagesLoading: boolean;\n organizationOptions: Array<Option<string>>;\n repositoryOptions: Array<Option<string>>;\n defineManually: boolean;\n tagOptions: Array<Option<string>>;\n lookupType: IDockerLookupType;\n}\n\nconst imageFields = ['organization', 'repository', 'tag', 'digest'];\nconst defineOptions = [\n { label: 'Manually', value: true },\n { label: 'Select from list', value: false },\n];\n\nexport class DockerImageAndTagSelector extends React.Component<\n IDockerImageAndTagSelectorProps,\n IDockerImageAndTagSelectorState\n> {\n public static defaultProps: Partial<IDockerImageAndTagSelectorProps> = {\n organization: '',\n registry: '',\n repository: '',\n showDigest: true,\n allowManualDefinition: true,\n };\n\n private unmounted = false;\n private images: IDockerImage[];\n private accounts: string[];\n\n private registryMap: { [key: string]: string };\n private accountMap: { [key: string]: string[] };\n private newAccounts: string[];\n private organizationMap: { [key: string]: string[] };\n private repositoryMap: { [key: string]: string[] };\n private organizations: string[];\n private cachedValues: { [key: string]: string } = {};\n\n public constructor(props: IDockerImageAndTagSelectorProps) {\n super(props);\n\n const accountOptions = props.account ? [{ label: props.account, value: props.account }] : [];\n const organizationOptions =\n props.organization && props.organization.length ? [{ label: props.organization, value: props.organization }] : [];\n const repositoryOptions =\n props.repository && props.repository.length ? [{ label: props.repository, value: props.repository }] : [];\n const tagOptions = props.tag && props.tag.length ? [{ label: props.tag, value: props.tag }] : [];\n const parsedImageId = DockerImageUtils.splitImageId(props.imageId);\n const defineManually = props.allowManualDefinition && Boolean(props.imageId && props.imageId.includes('${'));\n\n this.state = {\n accountOptions,\n switchedManualWarning: undefined,\n imagesLoaded: false,\n imagesLoading: false,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n lookupType: props.digest || parsedImageId.digest ? 'digest' : 'tag',\n };\n }\n\n private getAccountMap(images: IDockerImage[]): { [key: string]: string[] } {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'account',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => `${i.repository.split('/').slice(0, -1).join('/')}`));\n return acc;\n },\n {},\n );\n }\n\n private getRegistryMap(images: IDockerImage[]) {\n return images.reduce((m: { [key: string]: string }, image: IDockerImage) => {\n m[image.account] = image.registry;\n return m;\n }, {} as { [key: string]: string });\n }\n\n private getOrganizationMap(images: IDockerImage[]): { [key: string]: string[] } {\n const extractGroupByKey = (image: IDockerImage) =>\n `${image.account}/${image.repository.split('/').slice(0, -1).join('/')}`;\n const groupedImages = groupBy(\n images.filter((image) => image.repository),\n extractGroupByKey,\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.repository));\n return acc;\n },\n {},\n );\n }\n\n private getRepositoryMap(images: IDockerImage[]) {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'repository',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.tag));\n return acc;\n },\n {},\n );\n }\n\n private getOrganizationsList(accountMap: { [key: string]: string[] }) {\n return accountMap ? accountMap[this.props.showRegistry ? this.props.account : this.props.registry] || [] : [];\n }\n\n private getRepositoryList(organizationMap: { [key: string]: string[] }, organization: string, registry: string) {\n if (organizationMap) {\n const key = `${this.props.showRegistry ? this.props.account : registry}/${organization || ''}`;\n return organizationMap[key] || [];\n }\n return [];\n }\n\n private getTags(tag: string, repositoryMap: { [key: string]: string[] }, repository: string) {\n let tags: string[] = [];\n if (this.props.specifyTagByRegex) {\n if (tag && trim(tag) === '') {\n tag = undefined;\n }\n } else {\n if (repositoryMap) {\n tags = repositoryMap[repository] || [];\n if (!tags.includes(tag) && tag && !tag.includes('${')) {\n tag = undefined;\n }\n }\n }\n\n return { tag, tags };\n }\n\n public componentWillReceiveProps(nextProps: IDockerImageAndTagSelectorProps) {\n if (\n !this.images ||\n ['account', 'showRegistry'].some(\n (key: keyof IDockerImageAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.refreshImages(nextProps);\n } else if (\n ['organization', 'registry', 'repository'].some(\n (key: keyof IDockerImageAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.updateThings(nextProps);\n }\n\n if (nextProps.imageId && nextProps.imageId.includes('${')) {\n this.setState({ defineManually: true });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n private synchronizeChanges(values: IDockerImageParts, registry: string) {\n const { organization, repository, tag, digest } = values;\n if (this.props.onChange) {\n const imageId = DockerImageUtils.generateImageId({ organization, repository, tag, digest });\n const changes: IDockerImageAndTagChanges = {};\n if (tag !== this.props.tag) {\n changes.tag = tag;\n }\n if (imageId !== this.props.imageId) {\n changes.imageId = imageId;\n }\n if (organization !== this.props.organization) {\n changes.organization = organization;\n }\n if (registry !== this.props.registry) {\n changes.registry = registry;\n }\n if (repository !== this.props.repository) {\n changes.repository = repository;\n }\n if (digest !== this.props.digest) {\n changes.digest = digest;\n }\n if (Object.keys(changes).length > 0) {\n this.props.onChange(changes);\n }\n }\n }\n\n private updateThings(props: IDockerImageAndTagSelectorProps, allowAutoSwitchToManualEntry = false) {\n if (!this.repositoryMap || this.unmounted) {\n return;\n }\n\n const { imageId, specifyTagByRegex } = props;\n let { organization, registry, repository } = props;\n\n if (props.showRegistry) {\n registry = this.registryMap[props.account];\n }\n\n const organizationFound = !organization || this.organizations.includes(organization) || organization.includes('${');\n if (!organizationFound) {\n organization = '';\n }\n\n const repositories = this.getRepositoryList(this.organizationMap, organization, registry);\n const repositoryFound = !repository || repository.includes('${') || repositories.includes(repository);\n\n if (!repositoryFound) {\n repository = '';\n }\n\n const { tag, tags } = this.getTags(props.tag, this.repositoryMap, repository);\n const tagFound = tag === props.tag || specifyTagByRegex;\n\n const newState = {\n accountOptions: this.newAccounts.sort().map((a) => ({ label: a, value: a })),\n organizationOptions: this.organizations\n .filter((o) => o)\n .sort()\n .map((o) => ({ label: o, value: o })),\n imagesLoaded: true,\n repositoryOptions: repositories.sort().map((r) => ({ label: r, value: r })),\n tagOptions: tags.sort().map((t) => ({ label: t, value: t })),\n } as IDockerImageAndTagSelectorState;\n\n if (\n imageId &&\n (!this.state.imagesLoaded || allowAutoSwitchToManualEntry) &&\n (!organizationFound || !repositoryFound || !tagFound)\n ) {\n newState.defineManually = true;\n\n const missingFields: string[] = [];\n if (!organizationFound) {\n missingFields.push('organization');\n }\n if (!repositoryFound) {\n missingFields.push('image');\n }\n if (!tagFound) {\n missingFields.push('tag');\n }\n newState.missingFields = missingFields;\n newState.switchedManualWarning = `Could not find ${missingFields.join(' or ')}, switched to manual entry`;\n } else if (!imageId || !imageId.includes('${')) {\n this.synchronizeChanges(\n this.state.defineManually\n ? DockerImageUtils.splitImageId(imageId)\n : { organization, repository, tag, digest: this.props.digest },\n registry,\n );\n }\n\n this.setState(newState);\n }\n\n private initializeImages(props: IDockerImageAndTagSelectorProps) {\n if (this.state.imagesLoading) {\n return;\n }\n\n const { showRegistry, account, registry } = props;\n\n const imageConfig: IFindImageParams = {\n provider: 'dockerRegistry',\n account: showRegistry ? account : registry,\n };\n\n this.setState({ imagesLoading: true });\n DockerImageReader.findImages(imageConfig)\n .then((images: IDockerImage[]) => {\n this.images = images;\n this.registryMap = this.getRegistryMap(this.images);\n this.accountMap = this.getAccountMap(this.images);\n this.newAccounts = this.accounts || Object.keys(this.accountMap);\n\n this.organizationMap = this.getOrganizationMap(this.images);\n this.repositoryMap = this.getRepositoryMap(this.images);\n this.organizations = this.getOrganizationsList(this.accountMap);\n this.updateThings(props, true);\n })\n .finally(() => {\n if (!this.unmounted) {\n this.setState({ imagesLoading: false });\n }\n });\n }\n\n public handleRefreshImages = (): void => {\n this.refreshImages(this.props);\n };\n\n public refreshImages(props: IDockerImageAndTagSelectorProps): void {\n this.initializeImages(props);\n }\n\n private initializeAccounts(props: IDockerImageAndTagSelectorProps) {\n let { account } = props;\n AccountService.listAccounts('dockerRegistry').then((allAccounts: IAccount[]) => {\n const accounts = allAccounts.map((a: IAccount) => a.name);\n if (this.props.showRegistry && !account) {\n account = accounts[0];\n }\n this.accounts = accounts;\n this.refreshImages({ ...props, ...{ account } });\n });\n }\n\n private isNew(): boolean {\n const { account, organization, registry, repository, tag } = this.props;\n return !account && !organization && !registry && !repository && !tag;\n }\n\n public componentDidMount() {\n if (!this.props.deferInitialization && (this.props.registry || this.isNew())) {\n this.initializeAccounts(this.props);\n }\n }\n\n private valueChanged(name: string, value: string) {\n const changes = { [name]: value };\n if (imageFields.some((n) => n === name)) {\n // values are parts of the image\n const { organization, repository, tag, digest } = this.props;\n const imageParts = { ...{ organization, repository, tag, digest }, ...changes };\n const imageId = DockerImageUtils.generateImageId(imageParts);\n changes.imageId = imageId;\n }\n this.props.onChange && this.props.onChange(changes);\n }\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n const oldType = this.state.lookupType;\n const oldValue = this.props[oldType];\n const cachedValue = this.cachedValues[newType];\n\n this.valueChanged(oldType, undefined);\n if (this.cachedValues[newType]) {\n this.valueChanged(newType, cachedValue);\n }\n this.setState({ lookupType: newType });\n this.cachedValues[oldType] = oldValue;\n };\n\n private showManualInput = (defineManually: boolean) => {\n if (!defineManually) {\n const newFields = DockerImageUtils.splitImageId(this.props.imageId || '');\n this.props.onChange(newFields);\n if (this.state.switchedManualWarning) {\n this.setState({ switchedManualWarning: undefined, missingFields: undefined });\n }\n }\n this.setState({ defineManually });\n };\n\n public render() {\n const {\n account,\n allowManualDefinition,\n digest,\n imageId,\n organization,\n repository,\n showDigest,\n showRegistry,\n specifyTagByRegex,\n tag,\n } = this.props;\n const {\n accountOptions,\n switchedManualWarning,\n missingFields,\n imagesLoading,\n lookupType,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n } = this.state;\n\n const parsedImageId = DockerImageUtils.splitImageId(imageId);\n\n const manualInputToggle = (\n <div className=\"sp-formItem groupHeader\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Define Image ID</div>\n\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={defineManually}\n disabled={imagesLoading || !allowManualDefinition}\n onChange={(o: Option<boolean>) => this.showManualInput(o.value)}\n options={defineOptions}\n clearable={false}\n />\n </span>\n </div>\n </div>\n </div>\n );\n\n const warning = switchedManualWarning ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\" />\n <div className=\"sp-formItem__right\">\n <ValidationMessage\n type=\"warning\"\n message={\n <>\n {switchedManualWarning}\n {(missingFields || []).map((f) => (\n <div key={f}>\n <HelpField expand={true} id={`pipeline.config.docker.trigger.missing.${f}`} />\n </div>\n ))}\n </>\n }\n />\n </div>\n </div>\n ) : null;\n\n if (defineManually) {\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image ID</div>\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n value={imageId || ''}\n onChange={(e) => this.valueChanged('imageId', e.target.value)}\n />\n </span>\n </div>\n </div>\n </div>\n {warning}\n </div>\n );\n }\n\n const Registry = showRegistry ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Registry Name</div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={account}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('account', o ? o.value : '')}\n options={accountOptions}\n isLoading={imagesLoading}\n />\n </span>\n <span className=\"sp-formActions sp-formActions--web\">\n <span className=\"action\">\n <Tooltip value={imagesLoading ? 'Images refreshing' : 'Refresh images list'}>\n <i\n className={`fa icon-button-refresh-arrows ${imagesLoading ? 'fa-spin' : ''}`}\n onClick={this.handleRefreshImages}\n />\n </Tooltip>\n </span>\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const Organization = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Organization</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {organization.includes('${') ? (\n <input\n disabled={imagesLoading}\n className=\"form-control input-sm\"\n value={organization || ''}\n onChange={(e) => this.valueChanged('organization', e.target.value)}\n />\n ) : (\n <Select\n value={organization || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('organization', (o && o.value) || '')}\n placeholder=\"No organization\"\n options={organizationOptions}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Image = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {repository.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={repository || ''}\n onChange={(e) => this.valueChanged('repository', e.target.value)}\n />\n ) : (\n <Select\n value={repository || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('repository', (o && o.value) || '')}\n options={repositoryOptions}\n required={true}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Tag =\n lookupType === 'tag' ? (\n specifyTagByRegex ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n type=\"text\"\n className=\"form-control input-sm\"\n value={tag || ''}\n disabled={imagesLoading || !repository}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n />\n </span>\n </div>\n <HelpField id=\"pipeline.config.docker.trigger.tag\" expand={true} />\n </div>\n </div>\n ) : (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {tag && tag.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={tag || ''}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n required={true}\n />\n ) : (\n <>\n <Select\n value={tag || ''}\n disabled={imagesLoading || !repository}\n isLoading={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('tag', o ? o.value : undefined)}\n options={tagOptions}\n placeholder=\"No tag\"\n required={true}\n />\n <HelpField id=\"pipeline.config.docker.trigger.tag.additionalInfo\" expand={true} />\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n ) : null;\n\n const Digest =\n lookupType === 'digest' ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n placeholder=\"sha256:abc123\"\n value={digest || parsedImageId.digest || ''}\n onChange={(e) => this.valueChanged('digest', e.target.value)}\n required={true}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const LookupTypeSelector = showDigest ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Type</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n clearable={false}\n value={lookupType}\n options={[\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n ]}\n onChange={this.lookupTypeChanged}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n {Registry}\n {Organization}\n {Image}\n {LookupTypeSelector}\n {Digest}\n {Tag}\n </div>\n );\n }\n}\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport { SETTINGS } from '@spinnaker/core';\n\nexport const DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER =\n 'spinnaker.docker.pipeline.stage.bake.executionDetails.controller';\nexport const name = DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER; // for backwards compatibility\nmodule(DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER, [UIROUTER_ANGULARJS]).controller(\n 'dockerBakeExecutionDetailsCtrl',\n [\n '$scope',\n '$stateParams',\n 'executionDetailsSectionService',\n '$interpolate',\n function ($scope, $stateParams, executionDetailsSectionService, $interpolate) {\n $scope.configSections = ['bakeConfig', 'taskStatus'];\n\n const initialized = () => {\n $scope.detailsSection = $stateParams.details;\n $scope.provider = $scope.stage.context.cloudProviderType || 'docker';\n $scope.bakeryDetailUrl = $interpolate(\n $scope.roscoMode && SETTINGS.roscoDetailUrl ? SETTINGS.roscoDetailUrl : SETTINGS.bakeryDetailUrl,\n );\n };\n\n const initialize = () => executionDetailsSectionService.synchronizeSection($scope.configSections, initialized);\n\n initialize();\n\n $scope.$on('$stateChangeSuccess', initialize);\n },\n ],\n);\n","'use strict';\n\nimport { module } from 'angular';\nimport _ from 'lodash';\n\nimport { AuthenticationService, BakeExecutionLabel, BakeryReader, Registry } from '@spinnaker/core';\nimport { DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER } from './bakeExecutionDetails.controller';\n\n/*\n This stage is just here so that we can experiment with baking Docker containers within pipelines.\n Without this stage, programmatically-created pipelines with Docker bake stages would not render\n execution details.\n */\nexport const DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE = 'spinnaker.docker.pipeline.stage.bakeStage';\nexport const name = DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE; // for backwards compatibility\nmodule(DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE, [DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'bake',\n cloudProvider: 'docker',\n label: 'Bake',\n description: 'Bakes an image',\n templateUrl: require('./bakeStage.html'),\n executionDetailsUrl: require('./bakeExecutionDetails.html'),\n executionLabelComponent: BakeExecutionLabel,\n extraLabelLines: (stage) => {\n return stage.masterStage.context.allPreviouslyBaked || stage.masterStage.context.somePreviouslyBaked ? 1 : 0;\n },\n supportsCustomTimeout: true,\n validators: [{ type: 'requiredField', fieldName: 'package' }],\n restartable: true,\n });\n })\n .controller('dockerBakeStageCtrl', [\n '$scope',\n '$q',\n function ($scope, $q) {\n const stage = $scope.stage;\n\n stage.region = 'global';\n\n if (!$scope.stage.user) {\n $scope.stage.user = AuthenticationService.getAuthenticatedUser().name;\n }\n\n $scope.viewState = {\n loading: true,\n };\n\n function initialize() {\n $scope.viewState.providerSelected = true;\n $q.all([BakeryReader.getBaseOsOptions('docker'), BakeryReader.getBaseLabelOptions()]).then(function ([\n baseOsOptions,\n baseLabelOptions,\n ]) {\n $scope.baseOsOptions = baseOsOptions.baseImages;\n $scope.baseLabelOptions = baseLabelOptions;\n\n if (!$scope.stage.baseOs && $scope.baseOsOptions && $scope.baseOsOptions.length) {\n $scope.stage.baseOs = $scope.baseOsOptions[0].id;\n }\n if (!$scope.stage.baseLabel && $scope.baseLabelOptions && $scope.baseLabelOptions.length) {\n $scope.stage.baseLabel = $scope.baseLabelOptions[0];\n }\n $scope.viewState.loading = false;\n });\n }\n\n function deleteEmptyProperties() {\n _.forOwn($scope.stage, function (val, key) {\n if (val === '') {\n delete $scope.stage[key];\n }\n });\n }\n\n $scope.$watch('stage', deleteEmptyProperties, true);\n\n initialize();\n },\n ]);\n","import { groupBy, reduce, trim, uniq } from 'lodash';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport Select from 'react-select';\n\nimport type { IAccount, IFindImageParams } from '@spinnaker/core';\nimport { AccountService, HelpField, Tooltip, ValidationMessage } from '@spinnaker/core';\n\nimport type { IDockerImage } from './DockerImageReader';\nimport { DockerChartImageReader } from './DockerImageReader';\nimport type { IDockerImageParts } from './DockerImageUtils';\nimport { DockerImageUtils } from './DockerImageUtils';\n\nexport type IDockerLookupType = 'tag' | 'digest';\n\nexport interface IDockerChartAndTagChanges {\n account?: string;\n organization?: string;\n registry?: string;\n repository?: string;\n tag?: string;\n digest?: string;\n imageId?: string;\n}\n\nexport interface IDockerChartAndTagSelectorProps {\n specifyTagByRegex: boolean;\n imageId: string;\n organization: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n account: string;\n showRegistry?: boolean;\n onChange: (changes: IDockerChartAndTagChanges) => void;\n deferInitialization?: boolean;\n showDigest?: boolean;\n allowManualDefinition?: boolean;\n}\n\nexport interface IDockerChartAndTagSelectorState {\n accountOptions: Array<Option<string>>;\n switchedManualWarning: string;\n missingFields?: string[];\n imagesLoaded: boolean;\n imagesLoading: boolean;\n organizationOptions: Array<Option<string>>;\n repositoryOptions: Array<Option<string>>;\n defineManually: boolean;\n tagOptions: Array<Option<string>>;\n lookupType: IDockerLookupType;\n}\n\nconst imageFields = ['organization', 'repository', 'tag', 'digest'];\nconst defineOptions = [\n { label: 'Manually', value: true },\n { label: 'Select from list', value: false },\n];\n\nexport class DockerChartAndTagSelector extends React.Component<\n IDockerChartAndTagSelectorProps,\n IDockerChartAndTagSelectorState\n> {\n public static defaultProps: Partial<IDockerChartAndTagSelectorProps> = {\n organization: '',\n registry: '',\n repository: '',\n showDigest: true,\n allowManualDefinition: true,\n };\n\n private unmounted = false;\n private images: IDockerImage[];\n private accounts: string[];\n\n private registryMap: { [key: string]: string };\n private accountMap: { [key: string]: string[] };\n private newAccounts: string[];\n private organizationMap: { [key: string]: string[] };\n private repositoryMap: { [key: string]: string[] };\n private organizations: string[];\n private cachedValues: { [key: string]: string } = {};\n\n public constructor(props: IDockerChartAndTagSelectorProps) {\n super(props);\n\n const accountOptions = props.account ? [{ label: props.account, value: props.account }] : [];\n const organizationOptions =\n props.organization && props.organization.length ? [{ label: props.organization, value: props.organization }] : [];\n const repositoryOptions =\n props.repository && props.repository.length ? [{ label: props.repository, value: props.repository }] : [];\n const tagOptions = props.tag && props.tag.length ? [{ label: props.tag, value: props.tag }] : [];\n const parsedImageId = DockerImageUtils.splitImageId(props.imageId);\n const defineManually = props.allowManualDefinition && Boolean(props.imageId && props.imageId.includes('${'));\n\n this.state = {\n accountOptions,\n switchedManualWarning: undefined,\n imagesLoaded: false,\n imagesLoading: false,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n lookupType: props.digest || parsedImageId.digest ? 'digest' : 'tag',\n };\n }\n\n private getAccountMap(images: IDockerImage[]): { [key: string]: string[] } {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'account',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => `${i.repository.split('/').slice(0, -1).join('/')}`));\n return acc;\n },\n {},\n );\n }\n\n private getRegistryMap(images: IDockerImage[]) {\n return images.reduce((m: { [key: string]: string }, image: IDockerImage) => {\n m[image.account] = image.registry;\n return m;\n }, {} as { [key: string]: string });\n }\n\n private getOrganizationMap(images: IDockerImage[]): { [key: string]: string[] } {\n const extractGroupByKey = (image: IDockerImage) =>\n `${image.account}/${image.repository.split('/').slice(0, -1).join('/')}`;\n const groupedImages = groupBy(\n images.filter((image) => image.repository),\n extractGroupByKey,\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.repository));\n return acc;\n },\n {},\n );\n }\n\n private getRepositoryMap(images: IDockerImage[]) {\n const groupedImages = groupBy(\n images.filter((image) => image.account),\n 'repository',\n );\n return reduce<IDockerImage[], { [key: string]: string[] }>(\n groupedImages,\n (acc, image, key) => {\n acc[key] = uniq(image.map((i) => i.tag));\n return acc;\n },\n {},\n );\n }\n\n private getOrganizationsList(accountMap: { [key: string]: string[] }) {\n return accountMap ? accountMap[this.props.showRegistry ? this.props.account : this.props.registry] || [] : [];\n }\n\n private getRepositoryList(organizationMap: { [key: string]: string[] }, organization: string, registry: string) {\n if (organizationMap) {\n const key = `${this.props.showRegistry ? this.props.account : registry}/${organization || ''}`;\n return organizationMap[key] || [];\n }\n return [];\n }\n\n private getTags(tag: string, repositoryMap: { [key: string]: string[] }, repository: string) {\n let tags: string[] = [];\n if (this.props.specifyTagByRegex) {\n if (tag && trim(tag) === '') {\n tag = undefined;\n }\n } else {\n if (repositoryMap) {\n tags = repositoryMap[repository] || [];\n if (!tags.includes(tag) && tag && !tag.includes('${')) {\n tag = undefined;\n }\n }\n }\n\n return { tag, tags };\n }\n\n public componentWillReceiveProps(nextProps: IDockerChartAndTagSelectorProps) {\n if (\n !this.images ||\n ['account', 'showRegistry'].some(\n (key: keyof IDockerChartAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.refreshImages(nextProps);\n } else if (\n ['organization', 'registry', 'repository'].some(\n (key: keyof IDockerChartAndTagSelectorProps) => this.props[key] !== nextProps[key],\n )\n ) {\n this.updateThings(nextProps);\n }\n\n if (nextProps.imageId && nextProps.imageId.includes('${')) {\n this.setState({ defineManually: true });\n }\n }\n\n componentWillUnmount() {\n this.unmounted = true;\n }\n\n private synchronizeChanges(values: IDockerImageParts, registry: string) {\n const { organization, repository, tag, digest } = values;\n if (this.props.onChange) {\n const imageId = DockerImageUtils.generateImageId({ organization, repository, tag, digest });\n const changes: IDockerChartAndTagChanges = {};\n if (tag !== this.props.tag) {\n changes.tag = tag;\n }\n if (imageId !== this.props.imageId) {\n changes.imageId = imageId;\n }\n if (organization !== this.props.organization) {\n changes.organization = organization;\n }\n if (registry !== this.props.registry) {\n changes.registry = registry;\n }\n if (repository !== this.props.repository) {\n changes.repository = repository;\n }\n if (digest !== this.props.digest) {\n changes.digest = digest;\n }\n if (Object.keys(changes).length > 0) {\n this.props.onChange(changes);\n }\n }\n }\n\n private updateThings(props: IDockerChartAndTagSelectorProps, allowAutoSwitchToManualEntry = false) {\n if (!this.repositoryMap || this.unmounted) {\n return;\n }\n\n const { imageId, specifyTagByRegex } = props;\n let { organization, registry, repository } = props;\n\n if (props.showRegistry) {\n registry = this.registryMap[props.account];\n }\n\n const organizationFound = !organization || this.organizations.includes(organization) || organization.includes('${');\n if (!organizationFound) {\n organization = '';\n }\n\n const repositories = this.getRepositoryList(this.organizationMap, organization, registry);\n const repositoryFound = !repository || repository.includes('${') || repositories.includes(repository);\n\n if (!repositoryFound) {\n repository = '';\n }\n\n const { tag, tags } = this.getTags(props.tag, this.repositoryMap, repository);\n const tagFound = tag === props.tag || specifyTagByRegex;\n\n const newState = {\n accountOptions: this.newAccounts.sort().map((a) => ({ label: a, value: a })),\n organizationOptions: this.organizations\n .filter((o) => o)\n .sort()\n .map((o) => ({ label: o, value: o })),\n imagesLoaded: true,\n repositoryOptions: repositories.sort().map((r) => ({ label: r, value: r })),\n tagOptions: tags.sort().map((t) => ({ label: t, value: t })),\n } as IDockerChartAndTagSelectorState;\n\n if (\n imageId &&\n (!this.state.imagesLoaded || allowAutoSwitchToManualEntry) &&\n (!organizationFound || !repositoryFound || !tagFound)\n ) {\n newState.defineManually = true;\n\n const missingFields: string[] = [];\n if (!organizationFound) {\n missingFields.push('organization');\n }\n if (!repositoryFound) {\n missingFields.push('image');\n }\n if (!tagFound) {\n missingFields.push('tag');\n }\n newState.missingFields = missingFields;\n newState.switchedManualWarning = `Could not find ${missingFields.join(' or ')}, switched to manual entry`;\n } else if (!imageId || !imageId.includes('${')) {\n this.synchronizeChanges(\n this.state.defineManually\n ? DockerImageUtils.splitImageId(imageId)\n : { organization, repository, tag, digest: this.props.digest },\n registry,\n );\n }\n\n this.setState(newState);\n }\n\n private initializeImages(props: IDockerChartAndTagSelectorProps) {\n if (this.state.imagesLoading) {\n return;\n }\n\n const { showRegistry, account, registry } = props;\n\n const imageConfig: IFindImageParams = {\n provider: 'dockerRegistry',\n account: showRegistry ? account : registry,\n };\n\n this.setState({ imagesLoading: true });\n DockerChartImageReader.findImages(imageConfig)\n .then((images: IDockerImage[]) => {\n this.images = images;\n this.registryMap = this.getRegistryMap(this.images);\n this.accountMap = this.getAccountMap(this.images);\n this.newAccounts = this.accounts || Object.keys(this.accountMap);\n\n this.organizationMap = this.getOrganizationMap(this.images);\n this.repositoryMap = this.getRepositoryMap(this.images);\n this.organizations = this.getOrganizationsList(this.accountMap);\n this.updateThings(props, true);\n })\n .finally(() => {\n if (!this.unmounted) {\n this.setState({ imagesLoading: false });\n }\n });\n }\n\n public handleRefreshImages = (): void => {\n this.refreshImages(this.props);\n };\n\n public refreshImages(props: IDockerChartAndTagSelectorProps): void {\n this.initializeImages(props);\n }\n\n private initializeAccounts(props: IDockerChartAndTagSelectorProps) {\n let { account } = props;\n AccountService.listAccounts('dockerRegistry').then((allAccounts: IAccount[]) => {\n const accounts = allAccounts.map((a: IAccount) => a.name);\n if (this.props.showRegistry && !account) {\n account = accounts[0];\n }\n this.accounts = accounts;\n this.refreshImages({ ...props, ...{ account } });\n });\n }\n\n private isNew(): boolean {\n const { account, organization, registry, repository, tag } = this.props;\n return !account && !organization && !registry && !repository && !tag;\n }\n\n public componentDidMount() {\n if (!this.props.deferInitialization && (this.props.registry || this.isNew())) {\n this.initializeAccounts(this.props);\n }\n }\n\n private valueChanged(name: string, value: string) {\n const changes = { [name]: value };\n if (imageFields.some((n) => n === name)) {\n // values are parts of the image\n const { organization, repository, tag, digest } = this.props;\n const imageParts = { ...{ organization, repository, tag, digest }, ...changes };\n const imageId = DockerImageUtils.generateImageId(imageParts);\n changes.imageId = imageId;\n }\n this.props.onChange && this.props.onChange(changes);\n }\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n const oldType = this.state.lookupType;\n const oldValue = this.props[oldType];\n const cachedValue = this.cachedValues[newType];\n\n this.valueChanged(oldType, undefined);\n if (this.cachedValues[newType]) {\n this.valueChanged(newType, cachedValue);\n }\n this.setState({ lookupType: newType });\n this.cachedValues[oldType] = oldValue;\n };\n\n private showManualInput = (defineManually: boolean) => {\n if (!defineManually) {\n const newFields = DockerImageUtils.splitImageId(this.props.imageId || '');\n this.props.onChange(newFields);\n if (this.state.switchedManualWarning) {\n this.setState({ switchedManualWarning: undefined, missingFields: undefined });\n }\n }\n this.setState({ defineManually });\n };\n\n public render() {\n const {\n account,\n allowManualDefinition,\n digest,\n imageId,\n organization,\n repository,\n showDigest,\n showRegistry,\n specifyTagByRegex,\n tag,\n } = this.props;\n const {\n accountOptions,\n switchedManualWarning,\n missingFields,\n imagesLoading,\n lookupType,\n organizationOptions,\n repositoryOptions,\n defineManually,\n tagOptions,\n } = this.state;\n\n const parsedImageId = DockerImageUtils.splitImageId(imageId);\n\n const manualInputToggle = (\n <div className=\"sp-formItem groupHeader\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Define Image ID</div>\n\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={defineManually}\n disabled={imagesLoading || !allowManualDefinition}\n onChange={(o: Option<boolean>) => this.showManualInput(o.value)}\n options={defineOptions}\n clearable={false}\n />\n </span>\n </div>\n </div>\n </div>\n );\n\n const warning = switchedManualWarning ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\" />\n <div className=\"sp-formItem__right\">\n <ValidationMessage\n type=\"warning\"\n message={\n <>\n {switchedManualWarning}\n {(missingFields || []).map((f) => (\n <div key={f}>\n <HelpField expand={true} id={`pipeline.config.docker.trigger.missing.${f}`} />\n </div>\n ))}\n </>\n }\n />\n </div>\n </div>\n ) : null;\n\n if (defineManually) {\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image ID</div>\n <div className=\"sp-formActions sp-formActions--mobile\">\n <span className=\"action\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n value={imageId || ''}\n onChange={(e) => this.valueChanged('imageId', e.target.value)}\n />\n </span>\n </div>\n </div>\n </div>\n {warning}\n </div>\n );\n }\n\n const Registry = showRegistry ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Registry Name</div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n value={account}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('account', o ? o.value : '')}\n options={accountOptions}\n isLoading={imagesLoading}\n />\n </span>\n <span className=\"sp-formActions sp-formActions--web\">\n <span className=\"action\">\n <Tooltip value={imagesLoading ? 'Images refreshing' : 'Refresh images list'}>\n <i\n className={`fa icon-button-refresh-arrows ${imagesLoading ? 'fa-spin' : ''}`}\n onClick={this.handleRefreshImages}\n />\n </Tooltip>\n </span>\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const Organization = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Organization</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {organization.includes('${') ? (\n <input\n disabled={imagesLoading}\n className=\"form-control input-sm\"\n value={organization || ''}\n onChange={(e) => this.valueChanged('organization', e.target.value)}\n />\n ) : (\n <Select\n value={organization || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('organization', (o && o.value) || '')}\n placeholder=\"No organization\"\n options={organizationOptions}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Image = (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Image</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {repository.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={repository || ''}\n onChange={(e) => this.valueChanged('repository', e.target.value)}\n />\n ) : (\n <Select\n value={repository || ''}\n disabled={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('repository', (o && o.value) || '')}\n options={repositoryOptions}\n required={true}\n isLoading={imagesLoading}\n />\n )}\n </span>\n </div>\n </div>\n </div>\n );\n\n const Tag =\n lookupType === 'tag' ? (\n specifyTagByRegex ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n type=\"text\"\n className=\"form-control input-sm\"\n value={tag || ''}\n disabled={imagesLoading || !repository}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n />\n </span>\n </div>\n <HelpField id=\"pipeline.config.docker.trigger.tag\" expand={true} />\n </div>\n </div>\n ) : (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Tag</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n {tag && tag.includes('${') ? (\n <input\n className=\"form-control input-sm\"\n disabled={imagesLoading}\n value={tag || ''}\n onChange={(e) => this.valueChanged('tag', e.target.value)}\n required={true}\n />\n ) : (\n <>\n <Select\n value={tag || ''}\n disabled={imagesLoading || !repository}\n isLoading={imagesLoading}\n onChange={(o: Option<string>) => this.valueChanged('tag', o ? o.value : undefined)}\n options={tagOptions}\n placeholder=\"No tag\"\n required={true}\n />\n <HelpField id=\"pipeline.config.docker.trigger.tag.additionalInfo\" expand={true} />\n </>\n )}\n </span>\n </div>\n </div>\n </div>\n )\n ) : null;\n\n const Digest =\n lookupType === 'digest' ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </div>\n </div>\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <input\n className=\"form-control input-sm\"\n placeholder=\"sha256:abc123\"\n value={digest || parsedImageId.digest || ''}\n onChange={(e) => this.valueChanged('digest', e.target.value)}\n required={true}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n const LookupTypeSelector = showDigest ? (\n <div className=\"sp-formItem\">\n <div className=\"sp-formItem__left\">\n <div className=\"sp-formLabel\">Type</div>\n </div>\n\n <div className=\"sp-formItem__right\">\n <div className=\"sp-form\">\n <span className=\"field\">\n <Select\n clearable={false}\n value={lookupType}\n options={[\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n ]}\n onChange={this.lookupTypeChanged}\n />\n </span>\n </div>\n </div>\n </div>\n ) : null;\n\n return (\n <div className=\"sp-formGroup\">\n {manualInputToggle}\n {Registry}\n {Organization}\n {Image}\n {LookupTypeSelector}\n {Digest}\n {Tag}\n </div>\n );\n }\n}\n","import { get } from 'lodash';\nimport { $q } from 'ngimport';\nimport React from 'react';\nimport type { Option } from 'react-select';\nimport type { Subscription } from 'rxjs';\nimport { from as observableFrom, Subject } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\n\nimport type { IDockerTrigger, IPipelineCommand, ITriggerTemplateComponentProps } from '@spinnaker/core';\nimport { HelpField, Spinner, TetheredSelect } from '@spinnaker/core';\n\nimport type { IDockerLookupType } from '../../image';\nimport { DockerChartImageReader } from '../../image';\nimport { DockerImageReader } from '../../image';\n\nconst lookupTypeOptions = [\n { value: 'digest', label: 'Digest' },\n { value: 'tag', label: 'Tag' },\n];\n\nexport interface IDockerTriggerTemplateState {\n digest: string;\n tags: string[];\n tagsLoading: boolean;\n loadError: boolean;\n lookupType: string;\n selectedTag: string;\n}\n\nexport class DockerTriggerTemplate extends React.Component<\n ITriggerTemplateComponentProps,\n IDockerTriggerTemplateState\n> {\n private queryStream = new Subject();\n private subscription: Subscription;\n\n public static formatLabel(trigger: IDockerTrigger): PromiseLike<string> {\n return $q.when(`(Docker Registry) ${trigger.account ? trigger.account + ':' : ''} ${trigger.repository || ''}`);\n }\n\n public constructor(props: ITriggerTemplateComponentProps) {\n super(props);\n this.state = {\n digest: '',\n tags: [],\n tagsLoading: true,\n loadError: false,\n lookupType: 'tag',\n selectedTag: '',\n };\n }\n\n private handleQuery = () => {\n const trigger = this.props.command.trigger as IDockerTrigger;\n if (trigger.type === 'helm/oci') {\n return observableFrom(\n DockerChartImageReader.findTags({\n provider: 'dockerRegistry', // Use helmOci provider for Helm OCI triggers\n account: trigger.account,\n repository: trigger.repository,\n }),\n );\n } else {\n return observableFrom(\n DockerImageReader.findTags({\n provider: 'dockerRegistry',\n account: trigger.account,\n repository: trigger.repository,\n }),\n );\n }\n };\n\n private lookupTypeChanged = (o: Option<IDockerLookupType>) => {\n const newType = o.value;\n this.updateArtifact(this.props.command, newType === 'tag' ? this.state.selectedTag : this.state.digest);\n this.setState({ lookupType: newType });\n };\n\n private updateArtifact(command: IPipelineCommand, tagOrDigest: string) {\n this.props.updateCommand('extraFields.tag', tagOrDigest);\n const trigger = command.trigger as IDockerTrigger;\n if (trigger && trigger.repository) {\n let imageName = '';\n if (trigger.registry) {\n imageName += trigger.registry + '/';\n }\n imageName += trigger.repository;\n\n let imageReference = '';\n if (this.state.lookupType === 'digest') {\n imageReference = `${imageName}@${tagOrDigest}`;\n } else {\n imageReference = `${imageName}:${tagOrDigest}`;\n }\n // Use 'helm/image' artifact type for helm/oci triggers, otherwise use 'docker/image'\n const artifactType = trigger.type === 'docker' ? 'docker/image' : 'helm/image';\n\n this.props.updateCommand('extraFields.artifacts', [\n {\n type: artifactType,\n name: imageName,\n version: tagOrDigest,\n reference: imageReference,\n },\n ]);\n }\n }\n\n private updateSelectedTag = (tag: string) => {\n this.updateArtifact(this.props.command, tag);\n this.setState({ selectedTag: tag });\n this.props.command.triggerInvalid = false;\n };\n\n private updateDigest = (digest: string) => {\n this.updateArtifact(this.props.command, digest);\n this.setState({ digest });\n };\n\n private tagLoadSuccess = (tags: string[]) => {\n const { command } = this.props;\n const trigger = command.trigger as IDockerTrigger;\n const newState = {} as IDockerTriggerTemplateState;\n newState.tags = tags || [];\n // default to what is supplied by the trigger if possible\n const defaultSelection = newState.tags.find((t) => t === trigger.tag);\n if (defaultSelection) {\n newState.selectedTag = defaultSelection;\n this.updateSelectedTag(defaultSelection);\n }\n newState.tagsLoading = false;\n this.setState(newState);\n };\n\n private tagLoadFailure = () => {\n this.setState({\n tagsLoading: false,\n loadError: true,\n });\n };\n\n private initialize = () => {\n const { command } = this.props;\n this.props.updateCommand('triggerInvalid', true);\n\n // These fields will be added to the trigger when the form is submitted\n this.props.updateCommand('extraFields', {\n tag: get(command, 'extraFields.tag', ''),\n artifacts: get(command, 'extraFields.artifacts', ''),\n });\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n // cancel search stream if trigger has changed to some other type\n if (command.trigger.type !== 'docker' && command.trigger.type !== 'helm/oci') {\n return;\n }\n\n this.subscription = this.queryStream\n .pipe(debounceTime(250), switchMap(this.handleQuery))\n .subscribe(this.tagLoadSuccess, this.tagLoadFailure);\n\n this.searchTags();\n };\n\n public componentDidMount() {\n this.initialize();\n }\n\n public componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n private searchTags = (query = '') => {\n this.setState({ tags: [`<span>Finding tags${query && ` matching ${query}`}...</span>`] });\n this.queryStream.next();\n };\n\n public render() {\n const { digest, tags, tagsLoading, loadError, selectedTag, lookupType } = this.state;\n\n const options = tags.map((tag) => {\n return { value: tag } as Option<string>;\n });\n\n return (\n <>\n <div className=\"form-group\">\n <div className=\"sm-label-right col-md-4\">Type</div>\n <div className=\"col-md-3\">\n <TetheredSelect\n clearable={false}\n value={lookupType}\n options={lookupTypeOptions}\n onChange={this.lookupTypeChanged}\n />\n </div>\n </div>\n {lookupType === 'tag' && (\n <div className=\"form-group\">\n <label className=\"col-md-4 sm-label-right\">Tag</label>\n {tagsLoading && (\n <div className=\"col-md-6\">\n <div className=\"form-control-static text-center\">\n <Spinner size=\"small\" />\n </div>\n </div>\n )}\n {loadError && <div className=\"col-md-6\">Error loading tags!</div>}\n {!tagsLoading && (\n <div className=\"col-md-6\">\n {tags.length === 0 && (\n <div>\n <p className=\"form-control-static\">No tags found</p>\n </div>\n )}\n {tags.length > 0 && (\n <TetheredSelect\n options={options}\n optionRenderer={(o) => <span>{o.value}</span>}\n clearable={false}\n value={selectedTag}\n valueRenderer={(o) => (\n <span>\n <strong>{o.value}</strong>\n </span>\n )}\n onChange={(o: Option<string>) => this.updateSelectedTag(o.value)}\n placeholder=\"Search tags...\"\n />\n )}\n </div>\n )}\n </div>\n )}\n {lookupType === 'digest' && (\n <div className=\"form-group\">\n <label className=\"col-md-4 sm-label-right\">\n Digest <HelpField id=\"pipeline.config.docker.trigger.digest\" />\n </label>\n <div className=\"col-md-6\">\n <input\n value={digest}\n onChange={(e) => this.updateDigest(e.target.value)}\n className=\"form-control input-sm\"\n required={true}\n />\n </div>\n </div>\n )}\n </>\n );\n }\n}\n","import React from 'react';\n\nimport type { IDockerTrigger, IExecutionTriggerStatusComponentProps } from '@spinnaker/core';\nimport { Registry } from '@spinnaker/core';\n\nimport { DockerHelmOciTriggerConfig } from './DockerHelmOciTriggerConfig';\nimport { DockerTriggerConfig } from './DockerTriggerConfig';\nimport { DockerTriggerTemplate } from './DockerTriggerTemplate';\n\nconst DockerTriggerExecutionStatus = (props: IExecutionTriggerStatusComponentProps) => {\n const trigger = props.trigger as IDockerTrigger;\n return (\n <li>\n {trigger.repository}:{trigger.tag}\n </li>\n );\n};\n\nRegistry.pipeline.registerTrigger({\n label: 'Docker Registry',\n description: 'Executes the pipeline on an image update',\n key: 'docker',\n component: DockerTriggerConfig,\n manualExecutionComponent: DockerTriggerTemplate,\n executionStatusComponent: DockerTriggerExecutionStatus,\n executionTriggerLabel: () => 'Docker Registry',\n validators: [\n {\n type: 'requiredField',\n fieldName: 'account',\n message: '<strong>Registry</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'requiredField',\n fieldName: 'repository',\n message: '<strong>Image</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'serviceAccountAccess',\n preventSave: true,\n 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.`,\n },\n ],\n});\n\nRegistry.pipeline.registerTrigger({\n label: 'Helm Docker Registry',\n description: 'Executes the pipeline on an helm/image update',\n key: 'helm/oci',\n component: DockerHelmOciTriggerConfig,\n manualExecutionComponent: DockerTriggerTemplate,\n executionStatusComponent: DockerTriggerExecutionStatus,\n executionTriggerLabel: () => 'Helm Docker Registry',\n validators: [\n {\n type: 'requiredField',\n fieldName: 'account',\n message: '<strong>Registry</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'requiredField',\n fieldName: 'repository',\n message: '<strong>Image</strong> is a required field for Docker Registry triggers.',\n },\n {\n type: 'serviceAccountAccess',\n preventSave: true,\n 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.`,\n },\n ],\n});\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IDockerTrigger } from '@spinnaker/core';\n\nimport type { IDockerImageAndTagChanges } from '../../image';\nimport { DockerImageAndTagSelector } from '../../image';\n\nexport interface IDockerTriggerConfigProps {\n formik: FormikProps<IDockerTrigger>;\n triggerUpdated: (trigger: IDockerTrigger) => void;\n}\n\nexport function DockerTriggerConfig(props: IDockerTriggerConfigProps) {\n const { formik } = props;\n const trigger = formik.values;\n\n const dockerChanged = (changes: IDockerImageAndTagChanges) => {\n // Trigger doesn't use imageId.\n const { imageId, ...rest } = changes;\n props.triggerUpdated(rest as IDockerTrigger);\n };\n\n return (\n <div className=\"form-horizontal\">\n <DockerImageAndTagSelector\n allowManualDefinition={false}\n specifyTagByRegex={true}\n account={trigger.account}\n organization={trigger.organization}\n registry={trigger.registry}\n repository={trigger.repository}\n tag={trigger.tag}\n showRegistry={true}\n onChange={dockerChanged}\n showDigest={false}\n />\n </div>\n );\n}\n","import type { FormikProps } from 'formik';\nimport React from 'react';\n\nimport type { IDockerTrigger } from '@spinnaker/core';\nimport type { IDockerChartAndTagChanges } from '../../image/DockerChartAndTagSelector';\nimport { DockerChartAndTagSelector } from '../../image/DockerChartAndTagSelector';\n\nexport interface IDockerTriggerConfigProps {\n formik: FormikProps<IDockerTrigger>;\n triggerUpdated: (trigger: IDockerTrigger) => void;\n}\n\nexport function DockerHelmOciTriggerConfig(props: IDockerTriggerConfigProps) {\n const { formik } = props;\n const trigger = formik.values;\n\n const dockerChanged = (changes: IDockerChartAndTagChanges) => {\n // Trigger doesn't use imageId.\n const { imageId, ...rest } = changes;\n props.triggerUpdated(rest as IDockerTrigger);\n };\n\n return (\n <div className=\"form-horizontal\">\n <DockerChartAndTagSelector\n allowManualDefinition={false}\n specifyTagByRegex={true}\n account={trigger.account}\n organization={trigger.organization}\n registry={trigger.registry}\n repository={trigger.repository}\n tag={trigger.tag}\n showRegistry={true}\n onChange={dockerChanged}\n showDigest={false}\n />\n </div>\n );\n}\n","import { module } from 'angular';\n\nimport { DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE } from './pipeline/stages/bake/dockerBakeStage';\nimport './pipeline/trigger/DockerTrigger';\n\nexport const DOCKER_MODULE = 'spinnaker.docker';\nmodule(DOCKER_MODULE, [DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE]);\n"],"names":["DockerImageReader","getImage","imageName","region","credentials","REST","path","query","provider","get","then","results","length","catch","findImages","params","RetryService","buildRetrySequence","findTags","DockerChartImageReader","DockerImageUtils","splitImageId","imageId","imageParts","includes","split","repository","organization","slice","join","lookup","tag","digest","startsWith","generateImageId","parts","imageFields","defineOptions","label","value","DockerImageAndTagSelector","React","Component","constructor","props","super","this","unmounted","cachedValues","handleRefreshImages","refreshImages","lookupTypeChanged","o","newType","oldType","state","lookupType","oldValue","cachedValue","valueChanged","setState","showManualInput","defineManually","newFields","onChange","switchedManualWarning","missingFields","accountOptions","account","organizationOptions","repositoryOptions","tagOptions","parsedImageId","allowManualDefinition","Boolean","imagesLoaded","imagesLoading","getAccountMap","images","groupedImages","groupBy","filter","image","reduce","acc","key","uniq","map","i","getRegistryMap","m","registry","getOrganizationMap","getRepositoryMap","getOrganizationsList","accountMap","showRegistry","getRepositoryList","organizationMap","getTags","repositoryMap","tags","specifyTagByRegex","trim","componentWillReceiveProps","nextProps","some","updateThings","componentWillUnmount","synchronizeChanges","values","changes","Object","keys","allowAutoSwitchToManualEntry","registryMap","organizationFound","organizations","repositories","repositoryFound","tagFound","newState","newAccounts","sort","a","r","t","push","initializeImages","imageConfig","accounts","finally","initializeAccounts","AccountService","listAccounts","allAccounts","name","isNew","componentDidMount","deferInitialization","n","render","showDigest","manualInputToggle","createElement","className","Select","disabled","options","clearable","warning","ValidationMessage","type","message","f","HelpField","expand","id","e","target","Registry","isLoading","Tooltip","onClick","Organization","placeholder","Image","required","Tag","Fragment","Digest","LookupTypeSelector","defaultProps","DOCKER_PIPELINE_STAGES_BAKE_BAKEEXECUTIONDETAILS_CONTROLLER","module","UIROUTER_ANGULARJS","controller","$scope","$stateParams","executionDetailsSectionService","$interpolate","configSections","initialized","detailsSection","details","stage","context","cloudProviderType","bakeryDetailUrl","roscoMode","SETTINGS","roscoDetailUrl","initialize","synchronizeSection","$on","DOCKER_PIPELINE_STAGES_BAKE_DOCKERBAKESTAGE","config","pipeline","registerStage","provides","cloudProvider","description","templateUrl","executionDetailsUrl","executionLabelComponent","BakeExecutionLabel","extraLabelLines","masterStage","allPreviouslyBaked","somePreviouslyBaked","supportsCustomTimeout","validators","fieldName","restartable","$q","user","AuthenticationService","getAuthenticatedUser","viewState","loading","$watch","_","forOwn","val","providerSelected","all","BakeryReader","getBaseOsOptions","getBaseLabelOptions","baseOsOptions","baseLabelOptions","baseImages","baseOs","baseLabel","DockerChartAndTagSelector","lookupTypeOptions","DockerTriggerTemplate","queryStream","Subject","handleQuery","trigger","command","observableFrom","updateArtifact","selectedTag","updateSelectedTag","triggerInvalid","updateDigest","tagLoadSuccess","defaultSelection","find","tagsLoading","tagLoadFailure","loadError","updateCommand","artifacts","subscription","unsubscribe","pipe","debounceTime","switchMap","subscribe","searchTags","next","formatLabel","when","tagOrDigest","imageReference","artifactType","version","reference","TetheredSelect","Spinner","size","optionRenderer","valueRenderer","DockerTriggerExecutionStatus","registerTrigger","component","formik","rest","triggerUpdated","manualExecutionComponent","executionStatusComponent","executionTriggerLabel","preventSave","DOCKER_MODULE"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"url": "https://github.com/spinnaker/spinnaker.git"
|
|
6
6
|
},
|
|
7
7
|
"license": "Apache-2.0",
|
|
8
|
-
"version": "2026.
|
|
8
|
+
"version": "2026.1.1",
|
|
9
9
|
"module": "dist/index.js",
|
|
10
10
|
"typings": "dist/index.d.ts",
|
|
11
11
|
"publishConfig": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"@uirouter/angularjs": "1.0.26",
|
|
26
26
|
"angular": "1.6.10",
|
|
27
27
|
"formik": "1.5.1",
|
|
28
|
-
"lodash": "4.
|
|
28
|
+
"lodash": "4.18.1",
|
|
29
29
|
"ngimport": "0.6.1",
|
|
30
30
|
"react": "16.14.0",
|
|
31
31
|
"react-select": "1.2.1",
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"shx": "0.3.3",
|
|
42
42
|
"typescript": "5.0.4"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "f842aaebe413ea1a14ccec06dd6824e07dc7426b"
|
|
45
45
|
}
|