diff --git a/generators/input-validators/check-cluster-homogeneity.rb b/generators/input-validators/check-cluster-homogeneity.rb index 7b300d27de50738c35d5beaf8704b82ce6d0626a..0452eff53e12c7935dc2a4f4a01a9720f1f1efb2 100644 --- a/generators/input-validators/check-cluster-homogeneity.rb +++ b/generators/input-validators/check-cluster-homogeneity.rb @@ -140,7 +140,8 @@ def cluster_homogeneity(refapi_hash, options = {:verbose => false}) refapi_hash = load_yaml_file_hierarchy("../../input/grid5000/") count = {} - + total_count = 0 + refapi_hash["sites"].sort.each do |site_uid, site| next if options.key?(:sites) && !options[:sites].include?(site_uid) @@ -153,10 +154,10 @@ def cluster_homogeneity(refapi_hash, options = {:verbose => false}) refnode_uid = cluster['nodes'].keys.sort.first refnode = cluster['nodes'][refnode_uid] - + cluster["nodes"].each_sort_by_node_uid do |node_uid, node| #next if node_uid != 'graphene-2' - + diffs = HashDiff.diff(refnode, node) # Hack HashDiff output for arrays: @@ -184,8 +185,8 @@ def cluster_homogeneity(refapi_hash, options = {:verbose => false}) # Remove keys that are specific to each nodes (ip, mac etc.) ikeys = cignore_keys[site_uid][node_uid] rescue nil diffs.clone.each { |diff| - diffs.delete(diff) if ignore_keys.include?(diff[0] + diff[1]) - diffs.delete(diff) if ikeys && ikeys.include?(diff[0] + diff[1]) + diffs.delete(diff) if ignore_keys.include?(diff[0] + diff[1]) + diffs.delete(diff) if ikeys && ikeys.include?(diff[0] + diff[1]) } if verbose && !diffs.empty? @@ -193,32 +194,31 @@ def cluster_homogeneity(refapi_hash, options = {:verbose => false}) pp diffs end + total_count += diffs.size count[site_uid][cluster_uid] += diffs.size # Remove the following line if you want to compare each nodes to the first cluster node refnode_uid = node_uid refnode = node - end - end end - return count + return [total_count, count] end def check_cluster_homogeneity(refapi_hash, options = {:verbose => false}) verbose = options[:verbose] puts "Differences found between successive nodes, per cluster:\n\n" - count = cluster_homogeneity(refapi_hash, options) + total_count, count = cluster_homogeneity(refapi_hash, options) puts "\n" if verbose puts count.to_yaml unless verbose puts "\nUse '../input-validators/check-cluster-homogeneity.rb -v' for details." unless verbose - - return count + + return total_count end if __FILE__ == $0 @@ -229,25 +229,25 @@ if __FILE__ == $0 OptionParser.new do |opts| opts.banner = "Usage: check-cluster-homogeneity.rb [options]" - + opts.separator "" opts.separator "Example: ruby check-cluster-homogeneity.rb -v" ### - + opts.separator "" opts.separator "Filters:" - + opts.on('-s', '--sites a,b,c', Array, 'Select site(s)', "Default: "+options[:sites].join(", ")) do |s| raise "Wrong argument for -s option." unless (s - options[:sites]).empty? options[:sites] = s end - + opts.on('-c', '--clusters a,b,c', Array, 'Select clusters(s). Default: all') do |s| options[:clusters] = s end - + opts.separator "" opts.separator "Common options:" @@ -255,14 +255,18 @@ if __FILE__ == $0 options[:verbose] ||= 0 options[:verbose] = options[:verbose] + 1 end - + # Print an options summary. opts.on_tail("-h", "--help", "Show this message") do puts opts exit end end.parse! - + refapi_hash = load_yaml_file_hierarchy("#{dir}/../../input/grid5000/") - check_cluster_homogeneity(refapi_hash, options) + total_count = check_cluster_homogeneity(refapi_hash, options) + + # return 0 if all nodes are homogeneous, 1 otherwise + exit total_count == 0 + end diff --git a/generators/input-validators/yaml-input-schema-validator.rb b/generators/input-validators/yaml-input-schema-validator.rb index 25b29441c8933c436d3078a0af32ddc31f053502..dc4e687986b4aa7d491547f5cb457ac3a0986df6 100644 --- a/generators/input-validators/yaml-input-schema-validator.rb +++ b/generators/input-validators/yaml-input-schema-validator.rb @@ -30,23 +30,23 @@ def yaml_input_schema_validator(global_hash, sites = nil, clusters = nil) schema_site = load_yaml_schema("#{dir}/schema-site.yaml") schema_cluster = load_yaml_schema("#{dir}/schema-cluster.yaml") schema_node = load_yaml_schema("#{dir}/schema-node.yaml") - + + r = true + r &= run_validator('global', global_hash, schema_global) # - + global_hash["sites"].each do |site_uid, site| next if sites and not sites.include?(site_uid) - + r &= run_validator(site_uid, site, schema_site) # - + site["clusters"].each do |cluster_uid, cluster| next if clusters and not clusters.include?(cluster_uid) - + r &= run_validator(cluster_uid, cluster, schema_cluster) # - + cluster["nodes"].each do |node_uid, node| - r &= run_validator(node_uid, node, schema_node) # - end end end @@ -60,21 +60,21 @@ if __FILE__ == $0 OptionParser.new do |opts| opts.banner = "Usage: yaml-input-schema-validator.rb [options]" - + ### - + opts.separator "" opts.separator "Filters:" - + opts.on('-s', '--sites a,b,c', Array, 'Select site(s)', "Default: all sites") do |s| options[:sites] = s end - + opts.on('-c', '--clusters a,b,c', Array, 'Select clusters(s). Default: all') do |s| options[:clusters] = s end - + # Print an options summary. opts.on_tail("-h", "--help", "Show this message") do puts opts @@ -86,4 +86,5 @@ if __FILE__ == $0 global_hash = load_yaml_file_hierarchy("#{dir}/../../input/grid5000/") r = yaml_input_schema_validator(global_hash, options[:sites], options[:clusters]) puts 'OK' if r + exit r end diff --git a/generators/oar-properties/oar-properties.rb b/generators/oar-properties/oar-properties.rb index 3fc3e810e5fc581d62fb2acda192d9d6d4011c39..d69b340fcf0f321b704292f54625acc11e81c369 100755 --- a/generators/oar-properties/oar-properties.rb +++ b/generators/oar-properties/oar-properties.rb @@ -71,12 +71,13 @@ OptionParser.new do |opts| opts.on("-d", "--diff [YAML filename]", "Only generates the minimal list of commands needed to update the site configuration", - "The optional YAML file is suppose to be the output of the 'oarnodes -Y' command.", + "The optional YAML file is supposed to be the output of the 'oarnodes -Y' command.", "If the file does not exist, the script will get the data from the OAR server and save the result on disk for future use.", "If no filename is specified, the script will simply connect to the OAR server.", "You can use the '%s' placeholder for 'site'. Ex: oarnodes-%s.yaml") do |d| d = true if d == nil options[:diff] = d + #If diff is set with no --output or --exec, the return code will be 0 if there are no differences, 1 otherwise end ### @@ -143,6 +144,8 @@ puts "Options: #{options}" if options[:verbose] puts "Hint: You might want to use either --verbose, --output or --exec." unless options[:verbose] || options[:output] || options[:exec] +ret = true + nodelist_properties = {} # ["ref"] : properties from the reference-repo # ["oar"] : properties from the OAR server # ["diff"] : diff between "ref" and "oar" @@ -153,8 +156,8 @@ nodelist_properties = {} # ["ref"] : properties from the reference-repo nodelist_properties["ref"] = {} global_hash = load_yaml_file_hierarchy('../../input/grid5000/') -options[:sites].each { |site_uid| - nodelist_properties["ref"][site_uid] = get_nodelist_properties(site_uid, global_hash["sites"][site_uid]) +options[:sites].each { |site_uid| + nodelist_properties["ref"][site_uid] = get_nodelist_properties(site_uid, global_hash["sites"][site_uid]) } # Get the list of property keys from the reference-repo (["ref"]) @@ -193,10 +196,15 @@ if options[:diff] end } } - puts "*** Error: The following nodes exist in the OAR server but are missing in the reference-repo: #{missings_alive.join(', ')}.\n" if missings_alive.size > 0 - puts "*** Warning: The following 'Dead' nodes exist in the OAR server but are missing in the reference-repo: #{missings_dead.join(', ')}. -Those nodes should be marked as 'retired' in the reference-repo.\n" if missings_dead.size > 0 && options[:check] - + if missings_alive.size > 0 + puts "*** Error: The following nodes exist in the OAR server but are missing in the reference-repo: #{missings_alive.join(', ')}.\n" + ret = false unless options[:exec] || options[:output] + end + if missings_dead.size > 0 && options[:check] + puts "*** Warning: The following 'Dead' nodes exist in the OAR server but are missing in the reference-repo: #{missings_dead.join(', ')}. +Those nodes should be marked as 'retired' in the reference-repo.\n" + ret = false unless options[:exec] || options[:output] + end end # @@ -210,7 +218,7 @@ if options[:diff] # header = false prev_diff = {} - + nodelist_properties["diff"] = {} properties_keys["oar"] = Set.new [] @@ -226,7 +234,7 @@ if options[:diff] nodelist_properties["diff"][site_uid][node_uid] = node_properties_ref.select { |key, value| diff_keys.include?(key) } # Verbose output - info = (nodelist_properties["oar"][site_uid][node_uid] == nil ? " new node !" : "") + info = (nodelist_properties["oar"][site_uid][node_uid] == nil ? " new node !" : "") case options[:verbose] when 1 puts "#{node_uid}:#{info}" if info != "" @@ -238,7 +246,7 @@ if options[:diff] header = true puts "Output format: ['~', 'key', 'old value', 'new value']" end - if diff.size==0 + if diff.size == 0 puts " #{node_uid}: OK#{info}" elsif diff == prev_diff puts " #{node_uid}:#{info} same modifications as above" @@ -252,8 +260,10 @@ if options[:diff] puts "#{node_uid}:#{info}" if info != "" puts JSON.pretty_generate({node_uid => {"old values" => node_properties_oar, "new values" => node_properties_ref}}) end + if diff.size != 0 + ret = false unless options[:exec] || options[:output] + end } - } # Get the list of property keys from the OAR scheduler (["oar"]) @@ -267,17 +277,19 @@ if options[:diff] 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 - } - - puts "Properties that need to be created on the server: #{properties_keys["diff"].keys.to_a.join(', ')}" if options[:verbose] && properties_keys["diff"].keys.size>0 + } + + puts "Properties that need to be created on the server: #{properties_keys["diff"].keys.to_a.join(', ')}" if options[:verbose] && properties_keys["diff"].keys.size > 0 # Detect unknown properties unknown_properties = properties_keys["oar"].keys.to_set - properties_keys["ref"].keys.to_set ignore_keys.each { |key| unknown_properties.delete(key) } - 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." + 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." + ret = false unless options[:exec] || options[:output] end end # if options[:diff] @@ -286,8 +298,8 @@ end # if options[:diff] # if options[:output] || options[:exec] opt = options[:diff] ? 'diff' : 'ref' - nodelist_properties[opt].each { |site_uid, site_properties| - + nodelist_properties[opt].each { |site_uid, site_properties| + # Init options[:output].is_a?(String) ? o = File.open(options[:output].gsub("%s", site_uid),'w') : o = $stdout.dup ssh_cmd = [] @@ -344,3 +356,5 @@ if options[:output] || options[:exec] end } # site loop end # if options[:output] || options[:exec] + +exit ret