diff --git a/src/cli/one_helper/oneflowtemplate_helper.rb b/src/cli/one_helper/oneflowtemplate_helper.rb index d0c63ed069..89697b6119 100644 --- a/src/cli/one_helper/oneflowtemplate_helper.rb +++ b/src/cli/one_helper/oneflowtemplate_helper.rb @@ -193,35 +193,6 @@ class OneFlowTemplateHelper < OpenNebulaHelper::OneHelper ret end - # Get custom role attributes values from user - # - # @param role [Hash] Service role with custom attributes - # - # @return [Hash] Role with custom attributes values - def custom_role_attrs(roles) - return if roles.nil? || roles.empty? - - ret = {} - role_with_custom_attrs = false - - roles.each do |role| - next unless role.key?('custom_attrs') - - #################################################################### - # Display Role Information - #################################################################### - header = "> Please insert the user inputs for the role \"#{role['name']}\"" - puts header - - role.merge!(custom_attrs(role['custom_attrs'])) - role_with_custom_attrs = true - end - - ret['roles'] = roles if role_with_custom_attrs - - ret - end - def networks(vnets) return unless vnets diff --git a/src/cli/oneflow-template b/src/cli/oneflow-template index 9b3f091964..c092bd87df 100755 --- a/src/cli/oneflow-template +++ b/src/cli/oneflow-template @@ -61,7 +61,6 @@ require 'command_parser' require 'opennebula/oneflow_client' require 'cli_helper' require 'one_helper/oneflowtemplate_helper' -require 'one_helper/onetemplate_helper' USER_AGENT = 'CLI' @@ -254,18 +253,14 @@ CommandParser::CmdParser.new(ARGV) do break end - params['merge_template'] = {} body = JSON.parse(response.body)['DOCUMENT']['TEMPLATE']['BODY'] - # Check global custom attributes - custom_attrs = helper.custom_attrs(body['custom_attrs']) - params['merge_template'].merge!(custom_attrs) unless custom_attrs.nil? + params['merge_template'] = helper.custom_attrs( + body['custom_attrs'] + ) - # Check role level custom attributes - custom_role_attrs = helper.custom_role_attrs(body['roles']) - params['merge_template'].merge!(custom_role_attrs) unless custom_role_attrs.nil? + params['merge_template'] = {} unless params['merge_template'] - # Check vnets attributes vnets = helper.networks(body['networks']) params['merge_template'].merge!(vnets) unless vnets.nil? end diff --git a/src/flow/lib/models/service.rb b/src/flow/lib/models/service.rb index 253db3af82..5f6410ad53 100644 --- a/src/flow/lib/models/service.rb +++ b/src/flow/lib/models/service.rb @@ -323,9 +323,6 @@ module OpenNebula template['start_time'] = Integer(Time.now) - # Replace $attibute by the corresponding value - resolve_attributes(template) - super(template.to_json, template['name']) end @@ -663,7 +660,7 @@ module OpenNebula end if deploy # Replace $attibute by the corresponding value - resolve_networks(body) + resolve_attributes(body) # @body = template.to_hash @@ -787,49 +784,31 @@ module OpenNebula end # rubocop:disable Layout/LineLength - def resolve_networks(template) - template['roles'].each do |role| - next unless role['vm_template_contents'] - - # $CUSTOM1_VAR Any word character - # (letter, number, underscore) - role['vm_template_contents'].scan(/\$(\w+)/).each do |key| - net = template['networks_values'].find {|att| att.key? key[0] } - - next if net.nil? - - role['vm_template_contents'].gsub!( - '$'+key[0], - net[net.keys[0]]['id'].to_s - ) - end - end - end - def resolve_attributes(template) template['roles'].each do |role| if role['vm_template_contents'] # $CUSTOM1_VAR Any word character # (letter, number, underscore) role['vm_template_contents'].scan(/\$(\w+)/).each do |key| - # Check if $ var value is in custom_attrs_values within the role - if !role['custom_attrs_values'].nil? && \ - role['custom_attrs_values'].key?(key[0]) + # Check if $ var value is in custom_attrs_values + if !template['custom_attrs_values'].nil? && + template['custom_attrs_values'].key?(key[0]) role['vm_template_contents'].gsub!( '$'+key[0], - role['custom_attrs_values'][key[0]] + template['custom_attrs_values'][key[0]] ) next end - # Check if $ var value is in custom_attrs_values + # Check if $ var value is in networks + net = template['networks_values'] + .find {|att| att.key? key[0] } - next unless !template['custom_attrs_values'].nil? && \ - template['custom_attrs_values'].key?(key[0]) + next if net.nil? role['vm_template_contents'].gsub!( '$'+key[0], - template['custom_attrs_values'][key[0]] + net[net.keys[0]]['id'].to_s ) end end diff --git a/src/flow/oneflow-server.rb b/src/flow/oneflow-server.rb index 683ca8d61f..2ee67669f8 100644 --- a/src/flow/oneflow-server.rb +++ b/src/flow/oneflow-server.rb @@ -186,22 +186,6 @@ def one_error_to_http(error) end end -# Check if the custom_attrs and their respective values are correct -# -# @param custom_attrs [Hash] Custom attrs of the service/role -# @param custom_attrs_values [Hash] Custom attrs values to check -def check_custom_attrs(custom_attrs, custom_attrs_values) - return if custom_attrs.nil? || custom_attrs.empty? - - if !custom_attrs.is_a?(Hash) || !custom_attrs_values.is_a?(Hash) - raise 'Wrong custom_attrs or custom_attrs_values format' - end - - return if (custom_attrs.keys - custom_attrs_values.keys).empty? - - raise 'Verify that every custom attribute have its corresponding value defined' -end - ############################################################################## # Defaults ############################################################################## @@ -645,40 +629,36 @@ post '/service_template/:id/action' do merge_template = opts['merge_template'] service_json = JSON.parse(service_template.to_json) - body = service_json['DOCUMENT']['TEMPLATE']['BODY'] + # Check custom_attrs + body = service_json['DOCUMENT']['TEMPLATE']['BODY'] + custom_attrs = body['custom_attrs'] - begin - # Check service custom_attrs - custom_attrs = body['custom_attrs'] + if merge_template custom_attrs_values = merge_template['custom_attrs_values'] - check_custom_attrs(custom_attrs, custom_attrs_values) + end - # Check custom attrs in each role - body['roles'].each do |role| - next if role['custom_attrs'].nil? + if custom_attrs && !(custom_attrs.is_a? Hash) + return internal_error('Wrong custom_attrs format', + VALIDATION_EC) + end - roles_merge_template = merge_template['roles'] + if custom_attrs_values && !(custom_attrs_values.is_a? Hash) + return internal_error('Wrong custom_attrs_values format', + VALIDATION_EC) + end - # merge_template must have 'role' key if role has custom attributes - if roles_merge_template.nil? - raise 'The Service template specifies custom attributes for roles ' \ - 'but no values have been found' - end + if custom_attrs && !custom_attrs.empty? && !custom_attrs_values + return internal_error('No custom_attrs_values found', + VALIDATION_EC) + end - if !roles_merge_template.is_a?(Array) || roles_merge_template.empty? - raise 'The role custom attributes are empty or do not have a valid format' - end - - # Select role from merge_template by role name - merge_role = roles_merge_template.find {|item| item['name'] == role['name'] } - - role_custom_attrs = role['custom_attrs'] - role_custom_attrs_values = merge_role['custom_attrs_values'] - - check_custom_attrs(role_custom_attrs, role_custom_attrs_values) - end - rescue StandardError => e - return internal_error(e.message, VALIDATION_EC) + if custom_attrs && + !custom_attrs.empty? && + custom_attrs_values && + !(custom_attrs.keys - custom_attrs_values.keys).empty? + return internal_error('Every custom_attrs key must have its ' \ + 'value defined at custom_attrs_value', + VALIDATION_EC) end # Check networks diff --git a/src/oca/ruby/opennebula/flow/service_template.rb b/src/oca/ruby/opennebula/flow/service_template.rb index d511b58df6..6f6a18556e 100644 --- a/src/oca/ruby/opennebula/flow/service_template.rb +++ b/src/oca/ruby/opennebula/flow/service_template.rb @@ -42,16 +42,6 @@ module OpenNebula :type => :string, :required => false }, - 'custom_attrs' => { - :type => :object, - :properties => {}, - :required => false - }, - 'custom_attrs_values' => { - :type => :object, - :properties => {}, - :required => false - }, 'parents' => { :type => :array, :items => { @@ -497,7 +487,7 @@ module OpenNebula instantiate_template = JSON.parse(@body.to_json) else instantiate_template = JSON.parse(@body.to_json) - .deep_merge(merge_template) + .merge(merge_template) end begin