From e26d773fb7335f3c712004d5b38f1589becb5455 Mon Sep 17 00:00:00 2001 From: Dmitry Ilyin Date: Fri, 1 Apr 2016 23:43:59 +0300 Subject: [PATCH] Add ROLE: annotation Set the list of roles this spec should find hirera files for Change-Id: Iaa803e4cbf6f6d83ad1334d3288eab09d354902b --- doc/usage.rst | 16 +++++++++++++ lib/noop/manager/library.rb | 47 ++++++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/doc/usage.rst b/doc/usage.rst index 1294b77..a0caf82 100644 --- a/doc/usage.rst +++ b/doc/usage.rst @@ -159,6 +159,13 @@ possible run combinations you can use the **RUN:** annotation.:: It can be specified many times an all entered combinations will be added to the list. +You can use **ROLE** annotation to specify the list of node roles this +spec should be running at. It will find the list of Hiera yaml files +that have roles matching this list.:: + + # ROLE: controller + # ROLE: primary-controller + There is also a way to use the reverse logic. You can specify the Hiera and facts yaml files that you want to exclude from the list instead of providing the list of included files.:: @@ -171,6 +178,15 @@ you have used both include and exclude options, the exclude option will have the priority over the include option. If there are no included Hiera files the list of Hiera files will be generated from the node roles. +Note, that all these options can be combined all together. It will mean +to take all 'compute' yamls, add neut_vlan_l3ha.ceph.ceil-primary-controller +and remove 'neut_vlan.compute.ssl' and then add master/master_centos7 run.:: + + # ROLE: compute + # HIERA: neut_vlan_l3ha.ceph.ceil-primary-controller.yaml + # RUN: master master_centos7 + # SKIP_HIERA: neut_vlan.compute.ssl.yaml + The final annotation **DISABLE_SPEC** allows you to temporarily disable the spec from being seen the framework. It can use useful if you want to turn off a spec with run problems and fix them later without breaking the tests.:: diff --git a/lib/noop/manager/library.rb b/lib/noop/manager/library.rb index 5e6921f..99c0fbb 100644 --- a/lib/noop/manager/library.rb +++ b/lib/noop/manager/library.rb @@ -172,14 +172,7 @@ module Noop return @assign_spec_to_hiera if @assign_spec_to_hiera @assign_spec_to_hiera = {} assign_spec_to_roles.each do |file_name_spec, spec_roles_set| - if spec_roles_set.include? '*' - hiera_files = assign_hiera_to_roles.keys - else - hiera_files = assign_hiera_to_roles.select do |file_name_hiera, hiera_roles_set| - roles_intersection = hiera_roles_set & spec_roles_set - roles_intersection.any? - end.keys - end + hiera_files = get_hiera_for_roles spec_roles_set @assign_spec_to_hiera[file_name_spec] = hiera_files if hiera_files.any? end @assign_spec_to_hiera @@ -231,10 +224,16 @@ module Noop task_spec_metadata[:skip_facts] += get_list_of_yamls $1 end - if line =~ /disable_spec/ + if line =~ /^\s*#\s*disable_spec/ task_spec_metadata[:disable] = true end + if line =~ /^\s*#\s*role:\s*(.*)/ + task_spec_metadata[:roles] = [] unless task_spec_metadata[:roles].is_a? Array + roles = line.split /\s*,\s*|\s+/ + task_spec_metadata[:roles] += roles + end + if line =~ /^\s*#\s*run:\s*(.*)/ run_record = get_list_of_yamls $1 if run_record.length >= 2 @@ -278,6 +277,13 @@ module Noop file_name_spec = Noop::Utils.convert_to_path file_name_spec metadata = spec_run_metadata.fetch file_name_spec, {} metadata[:facts] = [Noop::Config.default_facts_file_name] unless metadata[:facts] + + if metadata[:roles] + metadata[:hiera] = [] unless metadata[:hiera] + metadata[:hiera] += get_hiera_for_roles metadata[:roles] + end + + # the last default way to get hiera files list metadata[:hiera] = assign_spec_to_hiera.fetch file_name_spec, [] unless metadata[:hiera] runs = [] @@ -294,6 +300,29 @@ module Noop runs end + # Get a list of Hiera YAML files which roles + # include the given set of roles + # @param roles [Array,Set,String] + # @return [Array] + def get_hiera_for_roles(*roles) + all_roles = Set.new + roles.flatten.each do |role| + if role.is_a? Set + all_roles += role + else + all_roles.add role + end + end + if all_roles.include? '*' + assign_hiera_to_roles.keys + else + assign_hiera_to_roles.select do |_file_name_hiera, hiera_roles_set| + roles_intersection = hiera_roles_set & all_roles + roles_intersection.any? + end.keys + end + end + # Check if the given element matches this filter # @param [Array] def filter_is_matched?(filter, element)