From 7d220dd93468815f88c95c67b2d45d95152f8cae Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Mon, 22 Aug 2022 16:52:51 +0900 Subject: [PATCH] Create a separate class for [swift-constraints] options ... and improve support coverage of these options. Change-Id: I4f4f45a37cb2371451bca713d7df340de1b1448c --- manifests/constraints.pp | 121 ++++++++++++++++++ manifests/init.pp | 13 +- manifests/objectexpirer.pp | 19 ++- .../swift-constraints-818407c7fc2c1025.yaml | 15 +++ spec/classes/swift_constraints_spec.rb | 73 +++++++++++ spec/classes/swift_spec.rb | 2 - 6 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 manifests/constraints.pp create mode 100644 releasenotes/notes/swift-constraints-818407c7fc2c1025.yaml create mode 100644 spec/classes/swift_constraints_spec.rb diff --git a/manifests/constraints.pp b/manifests/constraints.pp new file mode 100644 index 00000000..64b266d7 --- /dev/null +++ b/manifests/constraints.pp @@ -0,0 +1,121 @@ +# +# Copyright (C) 2022 Red Hat +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# == Class: swift::constraints +# +# Configre the [swift-constraints] options +# +# == Parameters +# +# [*max_file_size*] +# (Optional) The largest "normal" object that can be saved in the cluster. +# Defaults to $::os_service_default +# +# [*max_meta_name_length*] +# (Optional) Max number of bytes in the utf8 encoding of the name portion of +# a metadata header. +# Defaults to $::os_service_default +# +# [*max_meta_value_length*] +# (Optional) Max number of bytes in the utf8 encoding of a metadata value. +# Defaults to $::os_service_default +# +# [*max_meta_count*] +# (Optional) Max number of metadata keys that can be store on a single +# account, container or object. +# Defaults to $::os_service_default +# +# [*max_meta_overall_size*] +# (Optional) The max number of bytes in the utf8 encoding of the metadata. +# Defaults to $::os_service_default +# +# [*max_header_size*] +# (Optional) Max HTTP header size for incoming requests for all swift +# services. +# Defaults to $::os_service_default +# +# [*extra_header_count*] +# (Optional) Allow additional headers in addition to max allowed metadata +# plus a default value of 36 for swift internally generated headers and +# regular http headers. +# Defaults to $::os_service_default +# +# [*max_object_name_length*] +# (Optional) Max number of bytes in the utf8 encoding of an object name. +# Defaults to $::os_service_default +# +# [*container_listing_limit*] +# (Optional) Default (and max) number of items returned for a container +# listing request. +# Defaults to $::os_service_default +# +# [*account_listing_limit*] +# (Optional) Default (and max) number of items returned for an account +# listing request. +# Defaults to $::os_service_default +# +# [*max_account_name_length*] +# (Optional) Max number of bytes in the utf8 encoding of an account name. +# Defaults to $::os_service_default +# +# [*max_container_name_length*] +# (Optional) Max number of bytes in the utf8 encoding of a container name. +# Defaults to $::os_service_default +# +# [*valid_api_versions*] +# (Optional) Allowed version strings for all REST API calls. +# Defaults to $::os_service_default +# +# [*auto_create_account_prefix*] +# (Optional) Prefix used for hiddne auto-created accounts. +# Defaults to $::os_service_default +# +class swift::constraints( + $max_file_size = $::os_service_default, + $max_meta_name_length = $::os_service_default, + $max_meta_value_length = $::os_service_default, + $max_meta_count = $::os_service_default, + $max_meta_overall_size = $::os_service_default, + $max_header_size = $::os_service_default, + $extra_header_count = $::os_service_default, + $max_object_name_length = $::os_service_default, + $container_listing_limit = $::os_service_default, + $account_listing_limit = $::os_service_default, + $max_account_name_length = $::os_service_default, + $max_container_name_length = $::os_service_default, + $valid_api_versions = $::os_service_default, + $auto_create_account_prefix = $::os_service_default, +) { + + include swift::deps + include swift::params + + swift_config { + 'swift-constraints/max_file_size': value => $max_file_size; + 'swift-constraints/max_meta_name_length': value => $max_meta_name_length; + 'swift-constraints/max_meta_value_length': value => $max_meta_value_length; + 'swift-constraints/max_meta_count': value => $max_meta_count; + 'swift-constraints/max_meta_overall_size': value => $max_meta_overall_size; + 'swift-constraints/max_header_size': value => pick($::swift::max_header_size, $max_header_size); + 'swift-constraints/extra_header_count': value => $extra_header_count; + 'swift-constraints/max_object_name_length': value => $max_object_name_length; + 'swift-constraints/container_listing_limit': value => $container_listing_limit; + 'swift-constraints/account_listing_limit': value => $account_listing_limit; + 'swift-constraints/max_account_name_length': value => $max_account_name_length; + 'swift-constraints/max_container_name_length': value => $max_container_name_length; + 'swift-constraints/valid_api_versions': value => join(any2array($valid_api_versions), ','); + 'swift-constraints/auto_create_account_prefix': value => $auto_create_account_prefix; + } +} diff --git a/manifests/init.pp b/manifests/init.pp index 20d817b1..9dc7dfd2 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -27,10 +27,12 @@ # (Optional) The ensure state for the swift package. # Defaults to present. # +# DEPRECATED PARAMETERS +# # [*max_header_size*] # (Optional) Max HTTP header size for incoming requests for all swift # services. -# Defaults to $::os_service_default +# Defaults to undef # # == Dependencies # @@ -48,7 +50,8 @@ class swift( $swift_hash_path_suffix = $::os_service_default, $swift_hash_path_prefix = $::os_service_default, $package_ensure = 'present', - $max_header_size = $::os_service_default, + # DEPRECATED PARAMETERS + $max_header_size = undef ) { include swift::deps @@ -68,6 +71,10 @@ class swift( swift_config { 'swift-hash/swift_hash_path_suffix': value => $swift_hash_path_suffix; 'swift-hash/swift_hash_path_prefix': value => $swift_hash_path_prefix; - 'swift-constraints/max_header_size': value => $max_header_size; + } + + if $max_header_size != undef { + warning('The swift::max_header_size parameter is deprecated. Use the swift::constraints class.') + include swift::constraints } } diff --git a/manifests/objectexpirer.pp b/manifests/objectexpirer.pp index 9e550360..e98c1895 100644 --- a/manifests/objectexpirer.pp +++ b/manifests/objectexpirer.pp @@ -17,10 +17,6 @@ # (optional) The list of elements of the object expirer pipeline. # Defaults to ['catch_errors', 'proxy-logging', 'cache', 'proxy-server'] # -# [*auto_create_account_prefix*] -# (optional) Prefix to use when automatically creating accounts. -# Defaults to $::os_service_default. -# # [*concurrency*] # (optional) Number of replication workers to spawn. # Defaults to $::os_service_default. @@ -105,12 +101,17 @@ # (optional) Log level # Defaults to 'LOG_LOCAL2'. # +# DEPRECATED PARAMETERS +# +# [*auto_create_account_prefix*] +# (optional) Prefix to use when automatically creating accounts. +# Defaults to undef +# class swift::objectexpirer( $manage_service = true, $enabled = true, $package_ensure = 'present', $pipeline = ['catch_errors', 'proxy-logging', 'cache', 'proxy-server'], - $auto_create_account_prefix = $::os_service_default, $concurrency = $::os_service_default, $expiring_objects_account_name = $::os_service_default, $interval = $::os_service_default, @@ -127,12 +128,18 @@ class swift::objectexpirer( $cache_tls_keyfile = undef, $log_level = 'INFO', $log_facility = 'LOG_LOCAL2', + # DEPRECATED PARAMETERS + $auto_create_account_prefix = undef, ) inherits swift::params { include swift::deps Swift_config<| |> ~> Service['swift-object-expirer'] Swift_object_expirer_config<||> ~> Service['swift-object-expirer'] + if $auto_create_account_prefix != undef { + warning('The auto_create_account_prefix parameter is deprecated. Use the swift::constraints class.') + } + # On Red Hat platforms, it may be defined already, # because it is part of openstack-swift-proxy if $::swift::params::object_expirer_package_name != $::swift::params::proxy_package_name { @@ -174,7 +181,7 @@ class swift::objectexpirer( swift_object_expirer_config { 'pipeline:main/pipeline': value => join($pipeline, ' '); - 'object-expirer/auto_create_account_prefix': value => $auto_create_account_prefix; + 'object-expirer/auto_create_account_prefix': value => pick($auto_create_account_prefix, $::os_service_default); 'object-expirer/concurrency': value => $concurrency; 'object-expirer/expiring_objects_account_name': value => $expiring_objects_account_name; 'object-expirer/interval': value => $interval; diff --git a/releasenotes/notes/swift-constraints-818407c7fc2c1025.yaml b/releasenotes/notes/swift-constraints-818407c7fc2c1025.yaml new file mode 100644 index 00000000..181fbe13 --- /dev/null +++ b/releasenotes/notes/swift-constraints-818407c7fc2c1025.yaml @@ -0,0 +1,15 @@ +--- +features: + - | + The new ``swift::constraints`` class, which manages the + ``[swift-constraints]`` options, has been added. + +deprecations: + - | + The ``swift::max_header_size`` parameter has been deprecated in favor of + the new ``swift::constraints`` class. + + - | + The ``swift::objectexpirer::auto_create_account_prefix`` parameter has been + deprecated. Use the ``swift::constraints::auto_create_account_prefix`` + parameter instead. diff --git a/spec/classes/swift_constraints_spec.rb b/spec/classes/swift_constraints_spec.rb new file mode 100644 index 00000000..cfef14e5 --- /dev/null +++ b/spec/classes/swift_constraints_spec.rb @@ -0,0 +1,73 @@ +require 'spec_helper' + +describe 'swift::constraints' do + shared_examples 'swift::constraints' do + context 'with defaults' do + it 'should configure swift.conf' do + is_expected.to contain_swift_config('swift-constraints/max_file_size').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_meta_name_length').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_meta_value_length').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_meta_count').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_meta_overall_size').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_header_size').with_value('') + is_expected.to contain_swift_config('swift-constraints/extra_header_count').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_object_name_length').with_value('') + is_expected.to contain_swift_config('swift-constraints/container_listing_limit').with_value('') + is_expected.to contain_swift_config('swift-constraints/account_listing_limit').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_account_name_length').with_value('') + is_expected.to contain_swift_config('swift-constraints/max_container_name_length').with_value('') + is_expected.to contain_swift_config('swift-constraints/valid_api_versions').with_value('') + is_expected.to contain_swift_config('swift-constraints/auto_create_account_prefix').with_value('') + end + end + + context 'with parameters' do + let :params do + { + :max_file_size => 5368709122, + :max_meta_name_length => 128, + :max_meta_value_length => 256, + :max_meta_count => 20, + :max_meta_overall_size => 4096, + :max_header_size => 8192, + :extra_header_count => 0, + :max_object_name_length => 1024, + :container_listing_limit => 10000, + :account_listing_limit => 10000, + :max_account_name_length => 256, + :max_container_name_length => 256, + :valid_api_versions => ['v1', 'v1.0'], + :auto_create_account_prefix => '.', + } + end + it 'should configure swift.conf' do + is_expected.to contain_swift_config('swift-constraints/max_file_size').with_value(5368709122) + is_expected.to contain_swift_config('swift-constraints/max_meta_name_length').with_value(128) + is_expected.to contain_swift_config('swift-constraints/max_meta_value_length').with_value(256) + is_expected.to contain_swift_config('swift-constraints/max_meta_count').with_value(20) + is_expected.to contain_swift_config('swift-constraints/max_meta_overall_size').with_value(4096) + is_expected.to contain_swift_config('swift-constraints/max_header_size').with_value(8192) + is_expected.to contain_swift_config('swift-constraints/extra_header_count').with_value(0) + is_expected.to contain_swift_config('swift-constraints/max_object_name_length').with_value(1024) + is_expected.to contain_swift_config('swift-constraints/container_listing_limit').with_value(10000) + is_expected.to contain_swift_config('swift-constraints/account_listing_limit').with_value(10000) + is_expected.to contain_swift_config('swift-constraints/max_account_name_length').with_value(256) + is_expected.to contain_swift_config('swift-constraints/max_container_name_length').with_value(256) + is_expected.to contain_swift_config('swift-constraints/valid_api_versions').with_value('v1,v1.0') + is_expected.to contain_swift_config('swift-constraints/auto_create_account_prefix').with_value('.') + end + end + end + + on_supported_os({ + :supported_os => OSDefaults.get_supported_os + }).each do |os,facts| + context "on #{os}" do + let (:facts) do + facts.merge(OSDefaults.get_facts()) + end + + it_configures 'swift::constraints' + end + end +end diff --git a/spec/classes/swift_spec.rb b/spec/classes/swift_spec.rb index db63bc6b..67abd623 100644 --- a/spec/classes/swift_spec.rb +++ b/spec/classes/swift_spec.rb @@ -24,8 +24,6 @@ describe 'swift' do 'swift-hash/swift_hash_path_suffix').with_value('string') is_expected.to contain_swift_config( 'swift-hash/swift_hash_path_prefix').with_value('') - is_expected.to contain_swift_config( - 'swift-constraints/max_header_size').with_value('') end it {