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'),
originalModel: Ember.computed.alias('modalService.modalOpts.originalModel'),
selectedTemplateUrl: Ember.computed.alias('modalService.modalOpts.selectedTemplateUrl'),
model: null,
@ -26,7 +27,7 @@ export default ModalBase.extend({
stack: orig.get('stack').clone(),
serviceChoices: this.get('serviceChoices'),
tpl: tpl,
currentUrl: orig.get('tplVersion.links.self'),
currentUrl: this.get('selectedTemplateUrl')||orig.get('tplVersion.links.self'),
versionLinks: links,
versionsArray: verArr,
};
@ -35,16 +36,17 @@ export default ModalBase.extend({
}.on('init'),
actions: {
doSave(templateId, newStack, tpl) {
doSave(opt) {
let orig = this.get('originalModel');
let stack = orig.get('stack');
stack.merge(newStack);
orig.setProperties({
enabled: true,
stack: stack,
tplVersion: tpl,
stack.setProperties({
templateId: opt.templateId,
templateVersionId: opt.templateVersionId,
answers: opt.answers
});
orig.set('enabled', true);
this.send('cancel');
},
},

View File

@ -2,7 +2,7 @@
serviceChoices=serviceChoices
stackResource=model.stack
templateResource=model.tpl
selectedTemplateUrl=currentUrl
selectedTemplateUrl=selectedTemplateUrl
versionLinks=model.versionLinks
versionsArray=model.versionsArray
cancel=(action "cancel")
@ -10,6 +10,7 @@
editing=true
showHeader=false
showPreview=false
showDefaultVersionOption=true
titleUpgrade='newCatalog.titleConfigure'
selectVersionUpgrade='newCatalog.selectVersionConfigure'
saveUpgrade='newCatalog.saveConfigure'

View File

@ -64,9 +64,15 @@ export default Ember.Component.extend(NewOrEdit, {
},
enableStack(obj) {
let url = 'default';
if ( obj.stack.templateVersionId ) {
url = null;
}
this.get('modalService').toggleModal('catalog-configure', {
serviceChoices: this.get('serviceChoices'),
originalModel: obj,
selectedTemplateUrl: url
});
},
@ -106,13 +112,7 @@ export default Ember.Component.extend(NewOrEdit, {
enabled: true,
compatible: null,
tpl: tpl,
stack: this.get('store').createRecord({
type: 'stack',
name: cur.get('name'),
description: cur.get('description'),
environment: cur.get('answers'),
templateVersionId: cur.get('externalId'),
}),
stack: cur.clone(),
});
} else {
map[tplId] = Ember.Object.create({
@ -121,9 +121,10 @@ export default Ember.Component.extend(NewOrEdit, {
tpl: tpl,
compatible: null,
stack: this.get('store').createRecord({
type: 'stack',
type: 'catalogTemplate',
name: tpl.get('defaultName'),
environment: {},
answers: {},
templateId: tplId,
}),
});
}
@ -203,29 +204,6 @@ export default Ember.Component.extend(NewOrEdit, {
return drivers;
}.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() {
let intl = this.get('intl');
@ -234,58 +212,50 @@ export default Ember.Component.extend(NewOrEdit, {
return out;
}
return this.applyDefaultTemplateVersions().then(() => {
let map = this.get('stacksMap');
let orch = this.get('activeOrchestration');
let ok = true;
let map = this.get('stacksMap');
let orch = this.get('activeOrchestration');
let ok = true;
Object.keys(map).forEach((key) => {
let obj = map[key];
let tpl = obj.get('tpl');
if ( obj.enabled && !tpl.supportsOrchestration(orch) ) {
this.get('growl').error(
intl.t('editProjectTemplate.error.conflict'),
intl.t('editProjectTemplate.error.enabling', {
tplCategory: tpl.get('category'),
stackName: tpl.get('name'),
orchestration: Util.ucFirst(orch),
})
);
Object.keys(map).forEach((key) => {
let obj = map[key];
let tpl = obj.get('tpl');
if ( obj.enabled && !tpl.supportsOrchestration(orch) ) {
this.get('growl').error(
intl.t('editProjectTemplate.error.conflict'),
intl.t('editProjectTemplate.error.enabling', {
tplCategory: tpl.get('category'),
stackName: tpl.get('name'),
orchestration: Util.ucFirst(orch),
})
);
ok = false;
}
});
return ok;
}).catch(() => {
return false;
ok = false;
}
});
return ok;
},
doSave() {
let map = this.get('stacksMap');
let ary = [];
// Only look at enabled stacks
// only look at enabled stacks
Object.keys(map).forEach((key) => {
let obj = map[key];
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
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);
this.set('projectTemplate.stacks', ary);
return this._super();
},

View File

@ -7,6 +7,7 @@ import { compare as compareVersion } from 'ui/utils/parse-version';
export default Ember.Component.extend(NewOrEdit, {
k8s: Ember.inject.service(),
intl: Ember.inject.service(),
projects: Ember.inject.service(),
settings: Ember.inject.service(),
@ -27,6 +28,7 @@ export default Ember.Component.extend(NewOrEdit, {
saveUpgrade: 'newCatalog.saveUpgrade',
saveNew: 'newCatalog.saveNew',
sectionClass: 'well',
showDefaultVersionOption: false,
classNames: ['launch-catalog'],
@ -64,12 +66,16 @@ export default Ember.Component.extend(NewOrEdit, {
this.set('selectedTemplateModel', null);
Ember.run.scheduleOnce('afterRender', () => {
var def = this.get('templateResource.defaultVersion');
var links = this.get('versionLinks');
if (links[def]) {
this.set('selectedTemplateUrl', links[def]);
if ( this.get('selectedTemplateUrl') === 'default') {
this.templateChanged();
} 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'),
@ -85,22 +91,42 @@ export default Ember.Component.extend(NewOrEdit, {
}.observes('selectedTemplateModel.links.readme'),
sortedVersions: function() {
return this.get('versionsArray').sort((a,b) => {
let out = this.get('versionsArray').sort((a,b) => {
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() {
var url = this.get('selectedTemplateUrl');
if (url) {
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');
if ( version ) {
url = Util.addQueryParam(url, 'minimumRancherVersion_lte', version);
}
var current = this.get('stackResource.environment');
if ( !current ) {
current = {};
this.set('stackResource.environment', current);
}
this.get('store').request({
url: url
}).then((response) => {
@ -135,7 +161,7 @@ export default Ember.Component.extend(NewOrEdit, {
this.set('selectedTemplateModel', null);
this.set('readmeContent', null);
}
}.observes('selectedTemplateUrl'),
}.observes('selectedTemplateUrl','templateResource.defaultVersion'),
answers: function() {
var out = {};
@ -197,17 +223,26 @@ export default Ember.Component.extend(NewOrEdit, {
let files = this.get('selectedTemplateModel.files');
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') ) {
stack.setProperties({
dockerCompose: files['docker-compose.yml'],
rancherCompose: files['rancher-compose.yml'],
environment: this.get('answers'),
externalId: this.get('newExternalId'),
});
return true;
} 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;
}
},

View File

@ -4,10 +4,10 @@
<td data-title="{{t 'generic.description'}}:">
{{#if model.description}}{{model.description}}{{else}}<span class="text-muted">{{t 'projectRow.none'}}</span>{{/if}}
</td>
<td data-title="{{t 'projectTemplateRow.stacks'}}:">
<td data-title="{{t 'settingsPage.indexTemplate.table.header.stacks'}}:">
{{model.displayStacks}}
</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}}
</td>
<td data-title="{{t 'generic.actions'}}:"class="actions">

View File

@ -9,11 +9,11 @@ export default Resource.extend({
type: 'catalogTemplate',
externalId: function() {
let id = this.get('templateVersionId') || this.get('templateVersion');
let id = this.get('templateVersionId') || this.get('templateId');
if ( id ) {
return C.EXTERNAL_ID.KIND_CATALOG + C.EXTERNAL_ID.KIND_SEPARATOR + id;
}
}.property('templateVersionId','templateVersion'),
}.property('templateVersionId','templateId'),
externalIdInfo: function() {
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);
if ( def ) {
hash.projectTemplate = def.cloneForNew();
hash.projectTemplate.isPublic = false;
let tpl = def.cloneForNew();
tpl.isPublic = false;
tpl.name = '';
tpl.description = '';
hash.projectTemplate = tpl;
} else {
hash.projectTemplate = this.get('userStore').createRecord({
type: 'projectTemplate',

View File

@ -1,6 +1,6 @@
{
"name": "ui",
"version": "1.2.19",
"version": "1.2.20",
"private": true,
"directories": {
"doc": "doc",

View File

@ -2894,6 +2894,7 @@ newBalancer:
newCatalog:
version:
prompt: Choose a version...
default: The default at the time (currently {version})
saveUpgrade: Upgrade
saveNew: Launch
saveConfigure: Configure