279 lines
8.6 KiB
JavaScript
279 lines
8.6 KiB
JavaScript
|
/**
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||
|
* or more contributor license agreements. See the NOTICE file
|
||
|
* distributed with this work for additional information
|
||
|
* regarding copyright ownership. The ASF licenses this file
|
||
|
* to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance
|
||
|
* with the License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
import DS from 'ember-data';
|
||
|
import Ember from 'ember';
|
||
|
|
||
|
export default DS.Model.extend({
|
||
|
name: DS.attr('string', {defaultValue: ''}),
|
||
|
queue: DS.attr('string', {defaultValue: ''}),
|
||
|
lifetime: DS.attr('string', {defaultValue: ''}),
|
||
|
isCached: DS.attr('boolean', {defaultValue: false}),
|
||
|
|
||
|
serviceComponents: DS.attr({defaultValue: function() {
|
||
|
return Ember.A();
|
||
|
}}),
|
||
|
|
||
|
serviceConfigs: DS.attr({defaultValue: function() {
|
||
|
return Ember.A();
|
||
|
}}),
|
||
|
|
||
|
fileConfigs: DS.attr({defaultValue: function() {
|
||
|
return Ember.A();
|
||
|
}}),
|
||
|
|
||
|
quicklinks: DS.attr({defaultValue: function() {
|
||
|
return {};
|
||
|
}}),
|
||
|
|
||
|
clear() {
|
||
|
this.set('name', '');
|
||
|
this.set('queue', '');
|
||
|
this.set('lifetime', '');
|
||
|
this.get('serviceComponents').clear();
|
||
|
this.get('serviceConfigs').clear();
|
||
|
this.get('fileConfigs').clear();
|
||
|
this.set('quicklinks', {});
|
||
|
},
|
||
|
|
||
|
isValidServiceDef() {
|
||
|
return this.get('name') !== '' && this.get('queue') !== '' && this.get('serviceComponents.length') > 0;
|
||
|
},
|
||
|
|
||
|
createNewServiceComponent() {
|
||
|
return Ember.Object.create({
|
||
|
name: '',
|
||
|
numOfContainers: '',
|
||
|
cpus: '',
|
||
|
memory: '',
|
||
|
artifactId: '',
|
||
|
artifactType: 'DOCKER',
|
||
|
launchCommand: '',
|
||
|
dependencies: [],
|
||
|
uniqueComponentSupport: false,
|
||
|
configuration: null
|
||
|
});
|
||
|
},
|
||
|
|
||
|
createNewServiceConfig(name, value) {
|
||
|
var Config = Ember.Object.extend({
|
||
|
name: name || '',
|
||
|
value: value || '',
|
||
|
type: 'property', // property OR env OR quicklink
|
||
|
scope: 'service', // service OR component
|
||
|
componentName: '',
|
||
|
capitalizedType: Ember.computed('type', function() {
|
||
|
return Ember.String.capitalize(this.get('type'));
|
||
|
}),
|
||
|
formattedScope: Ember.computed('scope', 'componentName', function() {
|
||
|
if (this.get('scope') !== 'service') {
|
||
|
return this.get('componentName') + ' [Component]';
|
||
|
}
|
||
|
return Ember.String.capitalize(this.get('scope'));
|
||
|
})
|
||
|
});
|
||
|
return Config.create();
|
||
|
},
|
||
|
|
||
|
createNewFileConfig(src, dest) {
|
||
|
var FileConfig = Ember.Object.extend({
|
||
|
type: 'TEMPLATE', // HADOOP_XML OR TEMPLATE
|
||
|
srcFile: src || '',
|
||
|
destFile: dest || '',
|
||
|
scope: 'service', // service OR component
|
||
|
componentName: '',
|
||
|
props: null,
|
||
|
formattedScope: Ember.computed('scope', 'componentName', function() {
|
||
|
if (this.get('scope') !== 'service') {
|
||
|
return this.get('componentName') + ' [Component]';
|
||
|
}
|
||
|
return Ember.String.capitalize(this.get('scope'));
|
||
|
})
|
||
|
});
|
||
|
return FileConfig.create();
|
||
|
},
|
||
|
|
||
|
getServiceJSON() {
|
||
|
return this.serializeServiceDef();
|
||
|
},
|
||
|
|
||
|
serializeServiceDef() {
|
||
|
var json = {
|
||
|
name: "",
|
||
|
queue: "",
|
||
|
lifetime: "-1",
|
||
|
components: [],
|
||
|
configuration: {
|
||
|
properties: {},
|
||
|
env: {},
|
||
|
files: []
|
||
|
},
|
||
|
quicklinks: {}
|
||
|
};
|
||
|
|
||
|
var components = this.get('serviceComponents');
|
||
|
var configs = this.get('serviceConfigs');
|
||
|
var fileConfigs = this.get('fileConfigs');
|
||
|
|
||
|
json['name'] = this.get('name');
|
||
|
json['queue'] = this.get('queue');
|
||
|
|
||
|
if (this.get('lifetime')) {
|
||
|
json['lifetime'] = this.get('lifetime');
|
||
|
}
|
||
|
|
||
|
components.forEach(function(component) {
|
||
|
json.components.push(this.serializeComponent(component));
|
||
|
}.bind(this));
|
||
|
|
||
|
configs.forEach(function(config) {
|
||
|
let conf = this.serializeConfiguration(config);
|
||
|
if (conf.scope === "service") {
|
||
|
if (conf.type === "property") {
|
||
|
json.configuration.properties[conf.name] = conf.value;
|
||
|
} else if (conf.type === "env") {
|
||
|
json.configuration.env[conf.name] = conf.value;
|
||
|
} else if (conf.type === "quicklink") {
|
||
|
json.quicklinks[conf.name] = conf.value;
|
||
|
}
|
||
|
} else if (conf.scope === "component") {
|
||
|
let requiredCmp = json.components.findBy('name', conf.componentName);
|
||
|
if (requiredCmp) {
|
||
|
requiredCmp.configuration = requiredCmp.configuration || {};
|
||
|
requiredCmp.configuration.properties = requiredCmp.configuration.properties || {};
|
||
|
requiredCmp.configuration.env = requiredCmp.configuration.env || {};
|
||
|
if (conf.type === "property") {
|
||
|
requiredCmp.configuration.properties[conf.name] = conf.value;
|
||
|
} else if (conf.type === "env") {
|
||
|
requiredCmp.configuration.env[conf.name] = conf.value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}.bind(this));
|
||
|
|
||
|
fileConfigs.forEach(function(file) {
|
||
|
let scope = file.get('scope');
|
||
|
if (scope === "service") {
|
||
|
json.configuration.files.push(this.serializeFileConfig(file));
|
||
|
} else if (scope === "component") {
|
||
|
let requiredCmp = json.components.findBy('name', file.get('componentName'));
|
||
|
if (requiredCmp) {
|
||
|
requiredCmp.configuration = requiredCmp.configuration || {};
|
||
|
requiredCmp.configuration.files = requiredCmp.configuration.files || [];
|
||
|
requiredCmp.configuration.files.push(this.serializeFileConfig(file));
|
||
|
}
|
||
|
}
|
||
|
}.bind(this));
|
||
|
|
||
|
return json;
|
||
|
},
|
||
|
|
||
|
serializeComponent(record) {
|
||
|
var json = {};
|
||
|
json['name'] = record.get('name');
|
||
|
json['number_of_containers'] = record.get('numOfContainers');
|
||
|
json['launch_command'] = record.get('launchCommand');
|
||
|
json['dependencies'] = [];
|
||
|
json['artifact'] = {
|
||
|
id: record.get('artifactId'),
|
||
|
type: record.get('artifactType')
|
||
|
};
|
||
|
json['resource'] = {
|
||
|
cpus: record.get('cpus'),
|
||
|
memory: record.get('memory')
|
||
|
};
|
||
|
if (record.get('uniqueComponentSupport')) {
|
||
|
json['unique_component_support'] = "true";
|
||
|
}
|
||
|
if (record.get('configuration')) {
|
||
|
json['configuration'] = record.get('configuration');
|
||
|
}
|
||
|
return json;
|
||
|
},
|
||
|
|
||
|
serializeConfiguration(config) {
|
||
|
var json = {};
|
||
|
json["type"] = config.get('type');
|
||
|
json["scope"] = config.get('scope');
|
||
|
json["componentName"] = config.get('componentName');
|
||
|
json["name"] = config.get('name');
|
||
|
json["value"] = config.get('value');
|
||
|
return json;
|
||
|
},
|
||
|
|
||
|
serializeFileConfig(file) {
|
||
|
var json = {};
|
||
|
json["type"] = file.get('type');
|
||
|
json["dest_file"] = file.get('destFile');
|
||
|
json["src_file"] = file.get('srcFile');
|
||
|
if (file.get('type') === "HADOOP_XML" && file.get('props')) {
|
||
|
json["props"] = file.get('props');
|
||
|
}
|
||
|
return json;
|
||
|
},
|
||
|
|
||
|
createNewServiceDef() {
|
||
|
return this.get('store').createRecord('yarn-servicedef', {
|
||
|
id: 'yarn_servicedef_' + Date.now()
|
||
|
});
|
||
|
},
|
||
|
|
||
|
convertJsonServiceConfigs(json) {
|
||
|
var parsedJson = JSON.parse(json);
|
||
|
if (parsedJson.properties) {
|
||
|
for (let prop in parsedJson.properties) {
|
||
|
if (parsedJson.properties.hasOwnProperty(prop)) {
|
||
|
let newPropObj = this.createNewServiceConfig(prop, parsedJson.properties[prop]);
|
||
|
this.get('serviceConfigs').addObject(newPropObj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (parsedJson.env) {
|
||
|
for (let envprop in parsedJson.env) {
|
||
|
if (parsedJson.env.hasOwnProperty(envprop)) {
|
||
|
let newEnvObj = this.createNewServiceConfig(envprop, parsedJson.env[envprop]);
|
||
|
newEnvObj.set('type', 'env');
|
||
|
this.get('serviceConfigs').addObject(newEnvObj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
convertJsonFileConfigs(json) {
|
||
|
var parsedJson = JSON.parse(json);
|
||
|
if (parsedJson.files) {
|
||
|
parsedJson.files.forEach(function(file) {
|
||
|
let newFileObj = this.createNewFileConfig(file.src_file, file.dest_file);
|
||
|
this.get('fileConfigs').addObject(newFileObj);
|
||
|
}.bind(this));
|
||
|
}
|
||
|
},
|
||
|
|
||
|
cloneServiceDef() {
|
||
|
var clone = this.createNewServiceDef();
|
||
|
clone.set('name', this.get('name'));
|
||
|
clone.set('queue', this.get('queue'));
|
||
|
clone.set('lifetime', this.get('lifetime'));
|
||
|
clone.get('serviceComponents', this.get('serviceComponents'));
|
||
|
clone.get('serviceConfigs', this.get('serviceConfigs'));
|
||
|
clone.get('fileConfigs', this.get('fileConfigs'));
|
||
|
clone.set('quicklinks', this.get('quicklinks'));
|
||
|
return clone;
|
||
|
}
|
||
|
});
|