mirror of https://github.com/rancher/ui.git
default template version support in infra
This commit is contained in:
parent
c246628457
commit
470f4607f3
|
|
@ -6,6 +6,7 @@ export default ModalBase.extend({
|
||||||
|
|
||||||
serviceChoices: Ember.computed.alias('modalService.modalOpts.serviceChoices'),
|
serviceChoices: Ember.computed.alias('modalService.modalOpts.serviceChoices'),
|
||||||
originalModel: Ember.computed.alias('modalService.modalOpts.originalModel'),
|
originalModel: Ember.computed.alias('modalService.modalOpts.originalModel'),
|
||||||
|
selectedTemplateUrl: Ember.computed.alias('modalService.modalOpts.selectedTemplateUrl'),
|
||||||
|
|
||||||
model: null,
|
model: null,
|
||||||
|
|
||||||
|
|
@ -26,7 +27,7 @@ export default ModalBase.extend({
|
||||||
stack: orig.get('stack').clone(),
|
stack: orig.get('stack').clone(),
|
||||||
serviceChoices: this.get('serviceChoices'),
|
serviceChoices: this.get('serviceChoices'),
|
||||||
tpl: tpl,
|
tpl: tpl,
|
||||||
currentUrl: orig.get('tplVersion.links.self'),
|
currentUrl: this.get('selectedTemplateUrl')||orig.get('tplVersion.links.self'),
|
||||||
versionLinks: links,
|
versionLinks: links,
|
||||||
versionsArray: verArr,
|
versionsArray: verArr,
|
||||||
};
|
};
|
||||||
|
|
@ -35,16 +36,17 @@ export default ModalBase.extend({
|
||||||
}.on('init'),
|
}.on('init'),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
doSave(templateId, newStack, tpl) {
|
doSave(opt) {
|
||||||
let orig = this.get('originalModel');
|
let orig = this.get('originalModel');
|
||||||
let stack = orig.get('stack');
|
let stack = orig.get('stack');
|
||||||
stack.merge(newStack);
|
|
||||||
|
|
||||||
orig.setProperties({
|
stack.setProperties({
|
||||||
enabled: true,
|
templateId: opt.templateId,
|
||||||
stack: stack,
|
templateVersionId: opt.templateVersionId,
|
||||||
tplVersion: tpl,
|
answers: opt.answers
|
||||||
});
|
});
|
||||||
|
|
||||||
|
orig.set('enabled', true);
|
||||||
this.send('cancel');
|
this.send('cancel');
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
serviceChoices=serviceChoices
|
serviceChoices=serviceChoices
|
||||||
stackResource=model.stack
|
stackResource=model.stack
|
||||||
templateResource=model.tpl
|
templateResource=model.tpl
|
||||||
selectedTemplateUrl=currentUrl
|
selectedTemplateUrl=selectedTemplateUrl
|
||||||
versionLinks=model.versionLinks
|
versionLinks=model.versionLinks
|
||||||
versionsArray=model.versionsArray
|
versionsArray=model.versionsArray
|
||||||
cancel=(action "cancel")
|
cancel=(action "cancel")
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
editing=true
|
editing=true
|
||||||
showHeader=false
|
showHeader=false
|
||||||
showPreview=false
|
showPreview=false
|
||||||
|
showDefaultVersionOption=true
|
||||||
titleUpgrade='newCatalog.titleConfigure'
|
titleUpgrade='newCatalog.titleConfigure'
|
||||||
selectVersionUpgrade='newCatalog.selectVersionConfigure'
|
selectVersionUpgrade='newCatalog.selectVersionConfigure'
|
||||||
saveUpgrade='newCatalog.saveConfigure'
|
saveUpgrade='newCatalog.saveConfigure'
|
||||||
|
|
|
||||||
|
|
@ -64,9 +64,15 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
},
|
},
|
||||||
|
|
||||||
enableStack(obj) {
|
enableStack(obj) {
|
||||||
|
let url = 'default';
|
||||||
|
if ( obj.stack.templateVersionId ) {
|
||||||
|
url = null;
|
||||||
|
}
|
||||||
|
|
||||||
this.get('modalService').toggleModal('catalog-configure', {
|
this.get('modalService').toggleModal('catalog-configure', {
|
||||||
serviceChoices: this.get('serviceChoices'),
|
serviceChoices: this.get('serviceChoices'),
|
||||||
originalModel: obj,
|
originalModel: obj,
|
||||||
|
selectedTemplateUrl: url
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -106,13 +112,7 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
compatible: null,
|
compatible: null,
|
||||||
tpl: tpl,
|
tpl: tpl,
|
||||||
stack: this.get('store').createRecord({
|
stack: cur.clone(),
|
||||||
type: 'stack',
|
|
||||||
name: cur.get('name'),
|
|
||||||
description: cur.get('description'),
|
|
||||||
environment: cur.get('answers'),
|
|
||||||
templateVersionId: cur.get('externalId'),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
map[tplId] = Ember.Object.create({
|
map[tplId] = Ember.Object.create({
|
||||||
|
|
@ -121,9 +121,10 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
tpl: tpl,
|
tpl: tpl,
|
||||||
compatible: null,
|
compatible: null,
|
||||||
stack: this.get('store').createRecord({
|
stack: this.get('store').createRecord({
|
||||||
type: 'stack',
|
type: 'catalogTemplate',
|
||||||
name: tpl.get('defaultName'),
|
name: tpl.get('defaultName'),
|
||||||
environment: {},
|
answers: {},
|
||||||
|
templateId: tplId,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -203,29 +204,6 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
return drivers;
|
return drivers;
|
||||||
}.property('activeOrchestration'),
|
}.property('activeOrchestration'),
|
||||||
|
|
||||||
applyDefaultTemplateVersions() {
|
|
||||||
let promises = [];
|
|
||||||
let map = this.get('stacksMap');
|
|
||||||
Object.keys(map).forEach((key) => {
|
|
||||||
let stack = map[key];
|
|
||||||
if ( stack && stack.get('enabled') && !stack.get('tplVersion') ) {
|
|
||||||
let tpl = stack.get('tpl');
|
|
||||||
let version = tpl.defaultVersion;
|
|
||||||
if ( tpl.versionLinks[version] ) {
|
|
||||||
promises.push(
|
|
||||||
this.get('store').request({url: tpl.versionLinks[version]}).then((tplVersion) => {
|
|
||||||
stack.set('tplVersion', tplVersion);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.warn('No default template for ' + tpl.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return Ember.RSVP.all(promises);
|
|
||||||
},
|
|
||||||
|
|
||||||
willSave() {
|
willSave() {
|
||||||
let intl = this.get('intl');
|
let intl = this.get('intl');
|
||||||
|
|
||||||
|
|
@ -234,58 +212,50 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.applyDefaultTemplateVersions().then(() => {
|
let map = this.get('stacksMap');
|
||||||
let map = this.get('stacksMap');
|
let orch = this.get('activeOrchestration');
|
||||||
let orch = this.get('activeOrchestration');
|
let ok = true;
|
||||||
let ok = true;
|
|
||||||
|
|
||||||
Object.keys(map).forEach((key) => {
|
Object.keys(map).forEach((key) => {
|
||||||
let obj = map[key];
|
let obj = map[key];
|
||||||
let tpl = obj.get('tpl');
|
let tpl = obj.get('tpl');
|
||||||
if ( obj.enabled && !tpl.supportsOrchestration(orch) ) {
|
if ( obj.enabled && !tpl.supportsOrchestration(orch) ) {
|
||||||
this.get('growl').error(
|
this.get('growl').error(
|
||||||
intl.t('editProjectTemplate.error.conflict'),
|
intl.t('editProjectTemplate.error.conflict'),
|
||||||
intl.t('editProjectTemplate.error.enabling', {
|
intl.t('editProjectTemplate.error.enabling', {
|
||||||
tplCategory: tpl.get('category'),
|
tplCategory: tpl.get('category'),
|
||||||
stackName: tpl.get('name'),
|
stackName: tpl.get('name'),
|
||||||
orchestration: Util.ucFirst(orch),
|
orchestration: Util.ucFirst(orch),
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}).catch(() => {
|
|
||||||
return false;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return ok;
|
||||||
},
|
},
|
||||||
|
|
||||||
doSave() {
|
doSave() {
|
||||||
let map = this.get('stacksMap');
|
let map = this.get('stacksMap');
|
||||||
let ary = [];
|
let ary = [];
|
||||||
|
|
||||||
// Only look at enabled stacks
|
// only look at enabled stacks
|
||||||
Object.keys(map).forEach((key) => {
|
Object.keys(map).forEach((key) => {
|
||||||
let obj = map[key];
|
let obj = map[key];
|
||||||
if ( obj && obj.enabled ) {
|
if ( obj && obj.enabled ) {
|
||||||
ary.push(obj);
|
let stack = obj.stack;
|
||||||
|
if ( stack.templateVersionId ) {
|
||||||
|
delete stack.templateId;
|
||||||
|
} else {
|
||||||
|
delete stack.templateVersionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
ary.push(obj.stack);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Map to the catalogTemplate objects the API wants
|
this.set('projectTemplate.stacks', ary);
|
||||||
let stacks = ary.map((obj) => {
|
|
||||||
let s = obj.stack;
|
|
||||||
return {
|
|
||||||
name: s.name,
|
|
||||||
description: s.description,
|
|
||||||
answers: s.environment,
|
|
||||||
templateVersionId: obj.tplVersion.id,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
this.set('projectTemplate.stacks', stacks);
|
|
||||||
return this._super();
|
return this._super();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import { compare as compareVersion } from 'ui/utils/parse-version';
|
||||||
|
|
||||||
export default Ember.Component.extend(NewOrEdit, {
|
export default Ember.Component.extend(NewOrEdit, {
|
||||||
k8s: Ember.inject.service(),
|
k8s: Ember.inject.service(),
|
||||||
|
intl: Ember.inject.service(),
|
||||||
projects: Ember.inject.service(),
|
projects: Ember.inject.service(),
|
||||||
settings: Ember.inject.service(),
|
settings: Ember.inject.service(),
|
||||||
|
|
||||||
|
|
@ -27,6 +28,7 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
saveUpgrade: 'newCatalog.saveUpgrade',
|
saveUpgrade: 'newCatalog.saveUpgrade',
|
||||||
saveNew: 'newCatalog.saveNew',
|
saveNew: 'newCatalog.saveNew',
|
||||||
sectionClass: 'well',
|
sectionClass: 'well',
|
||||||
|
showDefaultVersionOption: false,
|
||||||
|
|
||||||
classNames: ['launch-catalog'],
|
classNames: ['launch-catalog'],
|
||||||
|
|
||||||
|
|
@ -64,12 +66,16 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
this.set('selectedTemplateModel', null);
|
this.set('selectedTemplateModel', null);
|
||||||
|
|
||||||
Ember.run.scheduleOnce('afterRender', () => {
|
Ember.run.scheduleOnce('afterRender', () => {
|
||||||
var def = this.get('templateResource.defaultVersion');
|
if ( this.get('selectedTemplateUrl') === 'default') {
|
||||||
var links = this.get('versionLinks');
|
this.templateChanged();
|
||||||
if (links[def]) {
|
|
||||||
this.set('selectedTemplateUrl', links[def]);
|
|
||||||
} else {
|
} else {
|
||||||
this.set('selectedTemplateUrl', null);
|
var def = this.get('templateResource.defaultVersion');
|
||||||
|
var links = this.get('versionLinks');
|
||||||
|
if (links[def]) {
|
||||||
|
this.set('selectedTemplateUrl', links[def]);
|
||||||
|
} else {
|
||||||
|
this.set('selectedTemplateUrl', null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}.on('init'),
|
}.on('init'),
|
||||||
|
|
@ -85,22 +91,42 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
}.observes('selectedTemplateModel.links.readme'),
|
}.observes('selectedTemplateModel.links.readme'),
|
||||||
|
|
||||||
sortedVersions: function() {
|
sortedVersions: function() {
|
||||||
return this.get('versionsArray').sort((a,b) => {
|
let out = this.get('versionsArray').sort((a,b) => {
|
||||||
return compareVersion(a.version, b.version);
|
return compareVersion(a.version, b.version);
|
||||||
});
|
});
|
||||||
}.property('versionsArray'),
|
|
||||||
|
let def = this.get('templateResource.defaultVersion');
|
||||||
|
if ( this.get('showDefaultVersionOption') && def ) {
|
||||||
|
out.unshift({version: this.get('intl').t('newCatalog.version.default', {version: def}), link: 'default'});
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}.property('versionsArray','templateResource.defaultVersion'),
|
||||||
|
|
||||||
templateChanged: function() {
|
templateChanged: function() {
|
||||||
var url = this.get('selectedTemplateUrl');
|
var url = this.get('selectedTemplateUrl');
|
||||||
if (url) {
|
if (url) {
|
||||||
this.set('loading', true);
|
this.set('loading', true);
|
||||||
|
|
||||||
|
if ( url === 'default' ) {
|
||||||
|
var def = this.get('templateResource.defaultVersion');
|
||||||
|
var links = this.get('versionLinks');
|
||||||
|
if ( def && links ) {
|
||||||
|
url = links[def];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var version = this.get('settings.rancherVersion');
|
var version = this.get('settings.rancherVersion');
|
||||||
if ( version ) {
|
if ( version ) {
|
||||||
url = Util.addQueryParam(url, 'minimumRancherVersion_lte', version);
|
url = Util.addQueryParam(url, 'minimumRancherVersion_lte', version);
|
||||||
}
|
}
|
||||||
|
|
||||||
var current = this.get('stackResource.environment');
|
var current = this.get('stackResource.environment');
|
||||||
|
if ( !current ) {
|
||||||
|
current = {};
|
||||||
|
this.set('stackResource.environment', current);
|
||||||
|
}
|
||||||
|
|
||||||
this.get('store').request({
|
this.get('store').request({
|
||||||
url: url
|
url: url
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
|
|
@ -135,7 +161,7 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
this.set('selectedTemplateModel', null);
|
this.set('selectedTemplateModel', null);
|
||||||
this.set('readmeContent', null);
|
this.set('readmeContent', null);
|
||||||
}
|
}
|
||||||
}.observes('selectedTemplateUrl'),
|
}.observes('selectedTemplateUrl','templateResource.defaultVersion'),
|
||||||
|
|
||||||
answers: function() {
|
answers: function() {
|
||||||
var out = {};
|
var out = {};
|
||||||
|
|
@ -197,17 +223,26 @@ export default Ember.Component.extend(NewOrEdit, {
|
||||||
let files = this.get('selectedTemplateModel.files');
|
let files = this.get('selectedTemplateModel.files');
|
||||||
let stack = this.get('stackResource');
|
let stack = this.get('stackResource');
|
||||||
|
|
||||||
stack.setProperties({
|
|
||||||
dockerCompose: files['docker-compose.yml'],
|
|
||||||
rancherCompose: files['rancher-compose.yml'],
|
|
||||||
environment: this.get('answers'),
|
|
||||||
externalId: this.get('newExternalId'),
|
|
||||||
});
|
|
||||||
|
|
||||||
if ( this.get('actuallySave') ) {
|
if ( this.get('actuallySave') ) {
|
||||||
|
stack.setProperties({
|
||||||
|
dockerCompose: files['docker-compose.yml'],
|
||||||
|
rancherCompose: files['rancher-compose.yml'],
|
||||||
|
environment: this.get('answers'),
|
||||||
|
externalId: this.get('newExternalId'),
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
this.sendAction('doSave', this.get('templateResource.id'), stack, this.get('selectedTemplateModel'));
|
let versionId = null;
|
||||||
|
if ( this.get('selectedTemplateUrl') !== 'default' && this.get('selectedTemplateModel') ) {
|
||||||
|
versionId = this.get('selectedTemplateModel.id');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sendAction('doSave', {
|
||||||
|
templateId: this.get('templateResource.id'),
|
||||||
|
templateVersionId: versionId,
|
||||||
|
answers: this.get('answers'),
|
||||||
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@
|
||||||
<td data-title="{{t 'generic.description'}}:">
|
<td data-title="{{t 'generic.description'}}:">
|
||||||
{{#if model.description}}{{model.description}}{{else}}<span class="text-muted">{{t 'projectRow.none'}}</span>{{/if}}
|
{{#if model.description}}{{model.description}}{{else}}<span class="text-muted">{{t 'projectRow.none'}}</span>{{/if}}
|
||||||
</td>
|
</td>
|
||||||
<td data-title="{{t 'projectTemplateRow.stacks'}}:">
|
<td data-title="{{t 'settingsPage.indexTemplate.table.header.stacks'}}:">
|
||||||
{{model.displayStacks}}
|
{{model.displayStacks}}
|
||||||
</td>
|
</td>
|
||||||
<td data-title="{{t 'settingsPage.indexTemplates.table.header.isPublic'}}:">
|
<td data-title="{{t 'settingsPage.indexTemplate.table.header.isPublic'}}:">
|
||||||
{{#if model.isPublic}}<i class="icon icon-check"></i>{{else}}<span class="text-muted">–</span>{{/if}}
|
{{#if model.isPublic}}<i class="icon icon-check"></i>{{else}}<span class="text-muted">–</span>{{/if}}
|
||||||
</td>
|
</td>
|
||||||
<td data-title="{{t 'generic.actions'}}:"class="actions">
|
<td data-title="{{t 'generic.actions'}}:"class="actions">
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,11 @@ export default Resource.extend({
|
||||||
type: 'catalogTemplate',
|
type: 'catalogTemplate',
|
||||||
|
|
||||||
externalId: function() {
|
externalId: function() {
|
||||||
let id = this.get('templateVersionId') || this.get('templateVersion');
|
let id = this.get('templateVersionId') || this.get('templateId');
|
||||||
if ( id ) {
|
if ( id ) {
|
||||||
return C.EXTERNAL_ID.KIND_CATALOG + C.EXTERNAL_ID.KIND_SEPARATOR + id;
|
return C.EXTERNAL_ID.KIND_CATALOG + C.EXTERNAL_ID.KIND_SEPARATOR + id;
|
||||||
}
|
}
|
||||||
}.property('templateVersionId','templateVersion'),
|
}.property('templateVersionId','templateId'),
|
||||||
|
|
||||||
externalIdInfo: function() {
|
externalIdInfo: function() {
|
||||||
return parseExternalId(this.get('externalId'));
|
return parseExternalId(this.get('externalId'));
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,11 @@ export default Ember.Route.extend({
|
||||||
|
|
||||||
let def = existing.find((tpl) => tpl.get('name').toLowerCase() === C.PROJECT_TEMPLATE.DEFAULT);
|
let def = existing.find((tpl) => tpl.get('name').toLowerCase() === C.PROJECT_TEMPLATE.DEFAULT);
|
||||||
if ( def ) {
|
if ( def ) {
|
||||||
hash.projectTemplate = def.cloneForNew();
|
let tpl = def.cloneForNew();
|
||||||
hash.projectTemplate.isPublic = false;
|
tpl.isPublic = false;
|
||||||
|
tpl.name = '';
|
||||||
|
tpl.description = '';
|
||||||
|
hash.projectTemplate = tpl;
|
||||||
} else {
|
} else {
|
||||||
hash.projectTemplate = this.get('userStore').createRecord({
|
hash.projectTemplate = this.get('userStore').createRecord({
|
||||||
type: 'projectTemplate',
|
type: 'projectTemplate',
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "ui",
|
"name": "ui",
|
||||||
"version": "1.2.19",
|
"version": "1.2.20",
|
||||||
"private": true,
|
"private": true,
|
||||||
"directories": {
|
"directories": {
|
||||||
"doc": "doc",
|
"doc": "doc",
|
||||||
|
|
|
||||||
|
|
@ -2894,6 +2894,7 @@ newBalancer:
|
||||||
newCatalog:
|
newCatalog:
|
||||||
version:
|
version:
|
||||||
prompt: Choose a version...
|
prompt: Choose a version...
|
||||||
|
default: The default at the time (currently {version})
|
||||||
saveUpgrade: Upgrade
|
saveUpgrade: Upgrade
|
||||||
saveNew: Launch
|
saveNew: Launch
|
||||||
saveConfigure: Configure
|
saveConfigure: Configure
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue