default template version support in infra

This commit is contained in:
Vincent Fiduccia 2016-11-07 18:17:01 -07:00
parent c246628457
commit 470f4607f3
9 changed files with 112 additions and 100 deletions

View File

@ -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');
}, },
}, },

View File

@ -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'

View File

@ -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();
}, },

View File

@ -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;
} }
}, },

View File

@ -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">&ndash;</span>{{/if}} {{#if model.isPublic}}<i class="icon icon-check"></i>{{else}}<span class="text-muted">&ndash;</span>{{/if}}
</td> </td>
<td data-title="{{t 'generic.actions'}}:"class="actions"> <td data-title="{{t 'generic.actions'}}:"class="actions">

View File

@ -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'));

View File

@ -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',

View File

@ -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",

View File

@ -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