diff --git a/src/flow/lib/models/service.rb b/src/flow/lib/models/service.rb index 5c7d4e3b99..9ef486bd70 100644 --- a/src/flow/lib/models/service.rb +++ b/src/flow/lib/models/service.rb @@ -403,6 +403,34 @@ module OpenNebula return @body['shutdown_action'] end + # Replaces the template contents + # + # @param template_json [String] New template contents + # @param append [true, false] True to append new attributes instead of + # replace the whole template + # + # @return [nil, OpenNebula::Error] nil in case of success, Error + # otherwise + def update(template_json=nil, append=false) + if template_json + template = JSON.parse(template_json) + + if append + rc = info + + if OpenNebula.is_error? rc + return rc + end + + template = @body.merge(template) + end + + template_json = template.to_json + end + + super(template_json, append) + end + # Replaces the raw template contents # # @param template [String] New template contents, in the form KEY = VAL diff --git a/src/flow/lib/models/service_template.rb b/src/flow/lib/models/service_template.rb index 39e7f2affc..ba8c7b15c9 100644 --- a/src/flow/lib/models/service_template.rb +++ b/src/flow/lib/models/service_template.rb @@ -209,10 +209,10 @@ module OpenNebula def update(template_json, append=false) template = JSON.parse(template_json) - if(append) - rc = info() + if append + rc = info - if(OpenNebula.is_error?(rc)) + if OpenNebula.is_error? rc return rc end diff --git a/src/flow/oneflow-server.rb b/src/flow/oneflow-server.rb index 866d1d4217..74b696df85 100644 --- a/src/flow/oneflow-server.rb +++ b/src/flow/oneflow-server.rb @@ -248,20 +248,24 @@ post '/service/:id/action' do when 'rename' service.rename(opts['name']) when 'update' - if opts && opts['template_raw'] - if (opts['append'] == true) - rc = service.update_raw( - opts['template_raw'], - (opts['append'] == true)) - + if opts && opts['append'] + if opts['template_json'] + begin + rc = service.update(opts['template_json'], true) + status 204 + rescue Validator::ParseException, JSON::ParserError + OpenNebula::Error.new($!.message) + end + elsif opts['template_raw'] + rc = service.update_raw(opts['template_raw'], true) status 204 else OpenNebula::Error.new("Action #{action['perform']}: " << - "Only supported for append") + "You have to provide a template") end else OpenNebula::Error.new("Action #{action['perform']}: " << - "You have to provide a raw template") + "Only supported for append") end else OpenNebula::Error.new("Action #{action['perform']} not supported") diff --git a/src/sunstone/public/app/tabs/oneflow-services-tab/form-panels/create.js b/src/sunstone/public/app/tabs/oneflow-services-tab/form-panels/create.js index b30895bc42..c93975fae1 100644 --- a/src/sunstone/public/app/tabs/oneflow-services-tab/form-panels/create.js +++ b/src/sunstone/public/app/tabs/oneflow-services-tab/form-panels/create.js @@ -23,6 +23,8 @@ define(function(require) { var Locale = require('utils/locale'); var Tips = require('utils/tips'); var TemplatesTable = require('tabs/oneflow-templates-tab/datatable'); + var TemplateUtils = require('utils/template-utils'); + /* CONSTANTS */ diff --git a/src/sunstone/public/app/tabs/oneflow-templates-tab/form-panels/create.js b/src/sunstone/public/app/tabs/oneflow-templates-tab/form-panels/create.js index 12bd2b5de2..32be38d488 100644 --- a/src/sunstone/public/app/tabs/oneflow-templates-tab/form-panels/create.js +++ b/src/sunstone/public/app/tabs/oneflow-templates-tab/form-panels/create.js @@ -25,6 +25,7 @@ define(function(require) { var Locale = require('utils/locale'); var Tips = require('utils/tips'); var RoleTab = require('tabs/oneflow-templates-tab/utils/role-tab'); + var TemplateUtils = require('utils/template-utils'); /* TEMPLATES @@ -230,7 +231,7 @@ define(function(require) { json_template['ready_status_gate'] = ready_status_gate; var templateStr = $('textarea#template', $("form#createServiceTemplateFormAdvanced")).val(); - var template_final = TemplateUtils.mergeTemplates(templateJSON, templateStr); + var template_final = TemplateUtils.mergeTemplates(json_template, templateStr); if (this.action == "create") { Sunstone.runAction("ServiceTemplate.create", template_final ); return false; diff --git a/src/sunstone/public/app/utils/labels/utils.js b/src/sunstone/public/app/utils/labels/utils.js index 64ef6c2d25..4f9354abac 100644 --- a/src/sunstone/public/app/utils/labels/utils.js +++ b/src/sunstone/public/app/utils/labels/utils.js @@ -260,10 +260,15 @@ define(function(require) { } function _updateResouceLabels(tabName, resourceId, labelsArray) { - var templateStr = LABELS_ATTR + '="' + labelsArray.join(',') + '"'; var resource = Sunstone.getResource(tabName); var tabTable = Sunstone.getDataTable(tabName); + if (resource == "ServiceTemplate" || resource == "Service") { + var templateStr = '{"' + LABELS_ATTR.toLowerCase() + '":"' + labelsArray.join(',') + '"}'; + } else { + var templateStr = LABELS_ATTR + '="' + labelsArray.join(',') + '"'; + } + OpenNebula[resource].append({ timeout: true, data : { @@ -294,7 +299,11 @@ define(function(require) { } function _labelsStr(elementTemplate) { - return TemplateUtils.htmlEncode( elementTemplate[LABELS_ATTR] ); + if (elementTemplate['BODY'] && elementTemplate["BODY"][LABELS_ATTR.toLowerCase()]) { + return TemplateUtils.htmlEncode(elementTemplate["BODY"][LABELS_ATTR.toLowerCase()]); + } else { + return TemplateUtils.htmlEncode( elementTemplate[LABELS_ATTR] ); + } } function _deserializeLabels(labelsStr) { @@ -415,7 +424,13 @@ define(function(require) { } else { template = element.TEMPLATE; } - return template[LABELS_ATTR]||''; + + if (template["BODY"] && template["BODY"][LABELS_ATTR.toLowerCase()]) { + return template["BODY"][LABELS_ATTR.toLowerCase()]; + } else { + return template[LABELS_ATTR]||''; + } + } else { return ''; }