From e7fe8c16ae873834ccf145b2bcbc62081a957241 Mon Sep 17 00:00:00 2001 From: Bartek Zurawski Date: Wed, 15 Jun 2016 14:47:19 +0000 Subject: [PATCH] Add MultiStrOpt for scheduler_available_filters scheduler_available_filters option defines filter classes made available to the nova scheduler. This parameter can be used multiple times or it can be set as array value. It is helpful when owner want to add to nova scheduler external filters. Co-Authored-By: Daniel Pawlik Change-Id: I6be7bb4cea1906bd98c513bd2d01153e4643e3ac Closes-Bug: #1591998 --- .../{ini_setting.rb => openstackconfig.rb} | 4 ++-- lib/puppet/type/nova_config.rb | 12 ++++++++++-- manifests/scheduler/filter.pp | 17 +++++++++++++---- ...uler_available_filters-dc4b95337739526e.yaml | 3 +++ spec/classes/nova_scheduler_filter_spec.rb | 7 +++++-- ..._setting_spec.rb => openstackconfig_spec.rb} | 2 +- spec/unit/type/nova_config_spec.rb | 4 ++-- 7 files changed, 36 insertions(+), 13 deletions(-) rename lib/puppet/provider/nova_config/{ini_setting.rb => openstackconfig.rb} (54%) create mode 100644 releasenotes/notes/add_MultiStrOpt_for_scheduler_available_filters-dc4b95337739526e.yaml rename spec/unit/provider/nova_config/{ini_setting_spec.rb => openstackconfig_spec.rb} (96%) diff --git a/lib/puppet/provider/nova_config/ini_setting.rb b/lib/puppet/provider/nova_config/openstackconfig.rb similarity index 54% rename from lib/puppet/provider/nova_config/ini_setting.rb rename to lib/puppet/provider/nova_config/openstackconfig.rb index 43f673593..85dfce79e 100644 --- a/lib/puppet/provider/nova_config/ini_setting.rb +++ b/lib/puppet/provider/nova_config/openstackconfig.rb @@ -1,6 +1,6 @@ Puppet::Type.type(:nova_config).provide( - :ini_setting, - :parent => Puppet::Type.type(:openstack_config).provider(:ini_setting) + :openstackconfig, + :parent => Puppet::Type.type(:openstack_config).provider(:ruby) ) do def self.file_path diff --git a/lib/puppet/type/nova_config.rb b/lib/puppet/type/nova_config.rb index 611819dce..e6bd15ee1 100644 --- a/lib/puppet/type/nova_config.rb +++ b/lib/puppet/type/nova_config.rb @@ -7,14 +7,22 @@ Puppet::Type.newtype(:nova_config) do newvalues(/\S+\/\S+/) end - newproperty(:value) do + newproperty(:value, :array_matching => :all) do desc 'The value of the setting to be defined.' + def insync?(is) + return true if @should.empty? + return false unless is.is_a? Array + return false unless is.length == @should.length + return ( + is & @should == is or + is & @should.map(&:to_s) == is + ) + end munge do |value| value = value.to_s.strip value.capitalize! if value =~ /^(true|false)$/i value end - newvalues(/^[\S ]*$/) def is_to_s( currentvalue ) if resource.secret? diff --git a/manifests/scheduler/filter.pp b/manifests/scheduler/filter.pp index 6b3975d72..f0aab7b4c 100644 --- a/manifests/scheduler/filter.pp +++ b/manifests/scheduler/filter.pp @@ -33,8 +33,9 @@ # Defaults to '50' # # [*scheduler_available_filters*] -# (optional) Filter classes available to the scheduler -# Defaults to 'nova.scheduler.filters.all_filters' +# (optional) An array with filter classes available to the scheduler. +# Example: ['first.filter.class', 'second.filter.class'] +# Defaults to ['nova.scheduler.filters.all_filters'] # # [*scheduler_default_filters*] # (optional) An array of filters to be used by default @@ -74,7 +75,7 @@ class nova::scheduler::filter ( $max_instances_per_host = '50', $isolated_images = $::os_service_default, $isolated_hosts = $::os_service_default, - $scheduler_available_filters = 'nova.scheduler.filters.all_filters', + $scheduler_available_filters = ['nova.scheduler.filters.all_filters'], $scheduler_default_filters = $::os_service_default, $scheduler_weight_classes = 'nova.scheduler.weights.all_weighers', $baremetal_scheduler_default_filters = $::os_service_default, @@ -97,6 +98,14 @@ class nova::scheduler::filter ( } else { $scheduler_default_filters_real = $::os_service_default } + + if is_array($scheduler_available_filters) { + $scheduler_available_filters_real = $scheduler_available_filters + } else { + warning('scheduler_available_filters must be an array and will fail in the future') + $scheduler_available_filters_real = any2array($scheduler_available_filters) + } + if !is_service_default($baremetal_scheduler_default_filters) and !empty($baremetal_scheduler_default_filters){ validate_array($baremetal_scheduler_default_filters) $baremetal_scheduler_default_filters_real = join($baremetal_scheduler_default_filters, ',') @@ -134,7 +143,7 @@ class nova::scheduler::filter ( 'DEFAULT/scheduler_host_subset_size': value => $scheduler_host_subset_size; 'DEFAULT/max_io_ops_per_host': value => $max_io_ops_per_host; 'DEFAULT/max_instances_per_host': value => $max_instances_per_host; - 'DEFAULT/scheduler_available_filters': value => $scheduler_available_filters; + 'DEFAULT/scheduler_available_filters': value => $scheduler_available_filters_real; 'DEFAULT/scheduler_weight_classes': value => $scheduler_weight_classes; 'DEFAULT/scheduler_use_baremetal_filters': value => $scheduler_use_baremetal_filters; 'DEFAULT/scheduler_default_filters': value => $scheduler_default_filters_real; diff --git a/releasenotes/notes/add_MultiStrOpt_for_scheduler_available_filters-dc4b95337739526e.yaml b/releasenotes/notes/add_MultiStrOpt_for_scheduler_available_filters-dc4b95337739526e.yaml new file mode 100644 index 000000000..6eba15962 --- /dev/null +++ b/releasenotes/notes/add_MultiStrOpt_for_scheduler_available_filters-dc4b95337739526e.yaml @@ -0,0 +1,3 @@ +--- +upgrade: + - Add MultiStrOpt for scheduler_available_filters parameter. diff --git a/spec/classes/nova_scheduler_filter_spec.rb b/spec/classes/nova_scheduler_filter_spec.rb index 615a86846..3c1a0bad2 100644 --- a/spec/classes/nova_scheduler_filter_spec.rb +++ b/spec/classes/nova_scheduler_filter_spec.rb @@ -14,7 +14,7 @@ describe 'nova::scheduler::filter' do it { is_expected.to contain_nova_config('DEFAULT/scheduler_host_subset_size').with_value('1') } it { is_expected.to contain_nova_config('DEFAULT/max_io_ops_per_host').with_value('8') } it { is_expected.to contain_nova_config('DEFAULT/max_instances_per_host').with_value('50') } - it { is_expected.to contain_nova_config('DEFAULT/scheduler_available_filters').with_value('nova.scheduler.filters.all_filters') } + it { is_expected.to contain_nova_config('DEFAULT/scheduler_available_filters').with_value(['nova.scheduler.filters.all_filters']) } it { is_expected.to contain_nova_config('DEFAULT/scheduler_weight_classes').with_value('nova.scheduler.weights.all_weighers') } it { is_expected.to contain_nova_config('DEFAULT/scheduler_use_baremetal_filters').with_value(false) } it { is_expected.to contain_nova_config('DEFAULT/isolated_images').with_value('') } @@ -30,7 +30,9 @@ describe 'nova::scheduler::filter' do :isolated_hosts => ['192.168.1.2','192.168.1.3'], :scheduler_default_filters => ['RetryFilter','AvailabilityZoneFilter','RamFilter'], :scheduler_use_baremetal_filters => true, - :baremetal_scheduler_default_filters => ['ExactRamFilter','ExactDiskFilter','ExactCoreFilter'], } + :baremetal_scheduler_default_filters => ['ExactRamFilter','ExactDiskFilter','ExactCoreFilter'], + :scheduler_available_filters => ['nova_filter1','nova_filter2'] + } end it { is_expected.to contain_nova_config('DEFAULT/scheduler_max_attempts').with_value('4') } @@ -39,6 +41,7 @@ describe 'nova::scheduler::filter' do it { is_expected.to contain_nova_config('DEFAULT/scheduler_default_filters').with_value('RetryFilter,AvailabilityZoneFilter,RamFilter') } it { is_expected.to contain_nova_config('DEFAULT/scheduler_use_baremetal_filters').with_value(true) } it { is_expected.to contain_nova_config('DEFAULT/baremetal_scheduler_default_filters').with_value('ExactRamFilter,ExactDiskFilter,ExactCoreFilter') } + it { is_expected.to contain_nova_config('DEFAULT/scheduler_available_filters').with_value(['nova_filter1','nova_filter2']) } end context 'when overriding params with empty arrays' do diff --git a/spec/unit/provider/nova_config/ini_setting_spec.rb b/spec/unit/provider/nova_config/openstackconfig_spec.rb similarity index 96% rename from spec/unit/provider/nova_config/ini_setting_spec.rb rename to spec/unit/provider/nova_config/openstackconfig_spec.rb index 1f8f2b712..00bf3480d 100644 --- a/spec/unit/provider/nova_config/ini_setting_spec.rb +++ b/spec/unit/provider/nova_config/openstackconfig_spec.rb @@ -26,7 +26,7 @@ $LOAD_PATH.push( 'lib') ) require 'spec_helper' -provider_class = Puppet::Type.type(:nova_config).provider(:ini_setting) +provider_class = Puppet::Type.type(:nova_config).provider(:openstackconfig) describe provider_class do it 'should default to the default setting when no other one is specified' do diff --git a/spec/unit/type/nova_config_spec.rb b/spec/unit/type/nova_config_spec.rb index c9895b69d..f926ef373 100644 --- a/spec/unit/type/nova_config_spec.rb +++ b/spec/unit/type/nova_config_spec.rb @@ -29,12 +29,12 @@ describe 'Puppet::Type.type(:nova_config)' do it 'should accept a valid value' do @nova_config[:value] = 'bar' - expect(@nova_config[:value]).to eq('bar') + expect(@nova_config[:value]).to eq(['bar']) end it 'should not accept a value with whitespace' do @nova_config[:value] = 'b ar' - expect(@nova_config[:value]).to eq('b ar') + expect(@nova_config[:value]).to eq(['b ar']) end it 'should accept valid ensure values' do