From 6353540f6b8f865fccbf8e13c1c6179574feaf50 Mon Sep 17 00:00:00 2001 From: Florent Didier <florent.didier@inria.fr> Date: Fri, 8 Dec 2017 18:06:40 +0100 Subject: [PATCH] [dev] oar-properties: compute property keys on each site individually The property keys were generated globaly (for all sites), which caused errors when different sites had different properties (one site can have reservable disks with key 'disk', but not the other). In this commit I compute properties on each site individually. --- .../oar-properties/lib/lib-oar-properties.rb | 8 +-- generators/oar-properties/oar-properties.rb | 60 +++++++++---------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/generators/oar-properties/lib/lib-oar-properties.rb b/generators/oar-properties/lib/lib-oar-properties.rb index 6873eaf995d..8f860e20060 100755 --- a/generators/oar-properties/lib/lib-oar-properties.rb +++ b/generators/oar-properties/lib/lib-oar-properties.rb @@ -200,7 +200,7 @@ def get_ref_disk_properties_internal(site_uid, cluster_uid, node_uid, node) node['storage_devices'].to_a.each_with_index do |v, index| device_uid, device = v disk = [device_uid, node_uid].join('.') - if index > 0 && device['reservation'] + if index > 0 && device['reservation'] # index > 0 is used to exclude sda key = [node_uid, disk] h = {} node_address = [node_uid, site_uid, 'grid5000.fr'].join('.') @@ -293,10 +293,8 @@ end # We detect the type of the property (Fixnum/String) by looking at the existing values def get_property_keys(properties) properties_keys = {} - properties.each do |_site_uid, site_properties| - site_properties.each do |type, type_properties| - properties_keys.merge!(get_property_keys_internal(type, type_properties)) - end + properties.each do |type, type_properties| + properties_keys.merge!(get_property_keys_internal(type, type_properties)) end return properties_keys end diff --git a/generators/oar-properties/oar-properties.rb b/generators/oar-properties/oar-properties.rb index 7337cf6f3c7..61fdc6a5878 100755 --- a/generators/oar-properties/oar-properties.rb +++ b/generators/oar-properties/oar-properties.rb @@ -213,16 +213,11 @@ global_hash = load_yaml_file_hierarchy(File.expand_path('../../input/grid5000/', properties = {} properties['ref'] = get_oar_properties_from_the_ref_repo(global_hash, options) - -# Get the list of property keys from the reference-repo (['ref']) -properties_keys = {} -properties_keys['ref'] = get_property_keys(properties['ref']) +properties['oar'] = get_oar_properties_from_oar(options) ignore_default_keys = ignore_default_keys() # Diff if options[:diff] - properties['oar'] = get_oar_properties_from_oar(options) - # Build the list of nodes that are listed in properties['oar'], # but does not exist in properties['ref'] # We distinguish 'Dead' nodes and 'Alive'/'Absent'/etc. nodes @@ -250,7 +245,6 @@ Those nodes should be marked as 'retired' in the reference-repo.\n" skipped_nodes = [] prev_diff = {} properties['diff'] = {} - properties_keys['oar'] = Set.new [] header = false properties['ref'].each do |site_uid, site_properties| @@ -306,29 +300,6 @@ Those nodes should be marked as 'retired' in the reference-repo.\n" end end - # Get the list of property keys from the OAR scheduler (['oar']) - properties_keys['oar'] = get_property_keys(properties['oar']) - - # Build the list of properties that must be created in the OAR server - properties_keys['diff'] = {} - properties_keys['ref'].each do |k, v_ref| - v_oar = properties_keys['oar'][k] - properties_keys['diff'][k] = v_ref unless v_oar - if v_oar && v_oar != v_ref && v_ref != NilClass && v_oar != NilClass - # Detect inconsistency between the type (String/Fixnum) of properties generated by this script and the existing values on the server. - puts "Error: the OAR property '#{k}' is a '#{v_oar}' on the server and this script uses '#{v_ref}' for this property." - ret = false unless options[:exec] || options[:output] - end - end - - puts "Properties that need to be created on the server: #{properties_keys['diff'].keys.to_a.delete_if { |e| ignore_default_keys.include?(e) }.join(', ')}" if options[:verbose] && properties_keys['diff'].keys.to_a.delete_if { |e| ignore_default_keys.include?(e) }.size > 0 - - # Detect unknown properties - unknown_properties = properties_keys['oar'].keys.to_set - properties_keys['ref'].keys.to_set - ignore_default_keys.each do |key| - unknown_properties.delete(key) - end - if options[:verbose] && unknown_properties.size > 0 puts "Properties existing on the server but not managed/known by the generator: #{unknown_properties.to_a.join(', ')}." puts "Hint: you can delete properties with 'oarproperty -d <property>' or add them to the ignore list in lib/lib-oar-properties.rb." @@ -350,8 +321,35 @@ if options[:output] || options[:exec] cmd << oarcmd_script_header cmd << oarcmd_separator + # Get the list of property keys from the reference-repo (['ref']) + properties_keys = {} + properties_keys['ref'] = get_property_keys(properties['ref'][site_uid]) + # Create properties keys - properties_keys[opt].delete_if { |k, _v| ignore_default_keys.include?(k) } + # Get the list of property keys from the OAR scheduler (['oar']) + properties_keys['oar'] = get_property_keys(properties['oar'][site_uid]) + + # Build the list of properties that must be created in the OAR server + properties_keys['diff'] = {} + properties_keys['ref'].each do |k, v_ref| + v_oar = properties_keys['oar'][k] + properties_keys['diff'][k] = v_ref unless v_oar + if v_oar && v_oar != v_ref && v_ref != NilClass && v_oar != NilClass + # Detect inconsistency between the type (String/Fixnum) of properties generated by this script and the existing values on the server. + puts "Error: the OAR property '#{k}' is a '#{v_oar}' on the #{site_uid} server and this script uses '#{v_ref}' for this property." + ret = false unless options[:exec] || options[:output] + end + end + + puts "Properties that need to be created on the #{site_uid} server: #{properties_keys['diff'].keys.to_a.delete_if { |e| ignore_default_keys.include?(e) }.join(', ')}" if options[:verbose] && properties_keys['diff'].keys.to_a.delete_if { |e| ignore_default_keys.include?(e) }.size > 0 + + # Detect unknown properties + unknown_properties = properties_keys['oar'].keys.to_set - properties_keys['ref'].keys.to_set + ignore_default_keys.each do |key| + unknown_properties.delete(key) + properties_keys[opt].delete(key) + end + unless properties_keys[opt].empty? cmd << oarcmd_create_properties(properties_keys[opt]) + "\n" cmd << oarcmd_separator -- GitLab