From 850e460f6287d8eb654eb3fe9adc399fab562462 Mon Sep 17 00:00:00 2001 From: Brent Eagles Date: Mon, 28 Feb 2022 15:50:55 -0330 Subject: [PATCH] Redis required for designate central service Designate central uses redis to improve task coordination under load. Conflicts: manifests/profile/base/designate/producer.pp spec/classes/tripleo_profile_base_designate_producer_spec.rb Note: to properly configure coordination parameters, this requires an additional non-trivial backport to puppet-designate to set designate_config. Depends-On: https://review.opendev.org/c/openstack/puppet-designate/+/848300 Change-Id: Icc23208945304913cdaeede703c486064646379a (cherry picked from commit 948540288cd3fc5c62bab0d6bffb5ac58078c4f2) --- manifests/profile/base/designate/central.pp | 3 + .../profile/base/designate/coordination.pp | 57 +++++++++++++ manifests/profile/base/designate/producer.pp | 32 +------ ...leo_profile_base_designate_central_spec.rb | 11 ++- ...rofile_base_designate_coordination_spec.rb | 83 +++++++++++++++++++ ...eo_profile_base_designate_producer_spec.rb | 14 ++-- 6 files changed, 161 insertions(+), 39 deletions(-) create mode 100644 manifests/profile/base/designate/coordination.pp create mode 100644 spec/classes/tripleo_profile_base_designate_coordination_spec.rb diff --git a/manifests/profile/base/designate/central.pp b/manifests/profile/base/designate/central.pp index ee8396136..e5b7353cc 100644 --- a/manifests/profile/base/designate/central.pp +++ b/manifests/profile/base/designate/central.pp @@ -48,7 +48,10 @@ class tripleo::profile::base::designate::central ( if $pools_file_content { warning('pool file content is no longer manually configurable') } + include tripleo::profile::base::designate + include tripleo::profile::base::designate::coordination + if ($step >= 4 or ($step >= 3 and $sync_db)) { class { 'designate::db': sync_db => $sync_db, diff --git a/manifests/profile/base/designate/coordination.pp b/manifests/profile/base/designate/coordination.pp new file mode 100644 index 000000000..9a0efcf21 --- /dev/null +++ b/manifests/profile/base/designate/coordination.pp @@ -0,0 +1,57 @@ +# Copyright 2022 Red Hat, Inc. +# +# 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: tripleo::profile::base::designate::coordination +# +# Designate Coordination profile for tripleo for setting coordination/redis +# related configuration. +# +# === Parameters +# +# [*step*] +# (Optional) The current step in deployment. See tripleo-heat-templates +# for more details. +# Defaults to hiera('step') +# +# [*designate_redis_password*] +# (Optional) Password for the neutron redis user for the coordination url +# Defaults to hiera('designate_redis_password', undef), +# +# [*redis_vip*] +# (Optional) Redis ip address for the coordination url +# Defaults to hiera('redis_vip', undef), +# +# [*enable_internal_tls*] +# (Optional) Whether TLS in the internal network is enabled or not. +# Defaults to hiera('enable_internal_tls', false) +# +class tripleo::profile::base::designate::coordination ( + $step = Integer(hiera('step')), + $designate_redis_password = hiera('designate_redis_password', undef), + $redis_vip = hiera('redis_vip', undef), + $enable_internal_tls = hiera('enable_internal_tls', false), +) { + if $step >= 4 { + if $redis_vip { + if $enable_internal_tls { + $tls_query_param = '?ssl=true' + } else { + $tls_query_param = '' + } + class { 'designate::coordination': + backend_url => join(['redis://:', $designate_redis_password, '@', normalize_ip_for_uri($redis_vip), ':6379/', $tls_query_param]) + } + } + } +} diff --git a/manifests/profile/base/designate/producer.pp b/manifests/profile/base/designate/producer.pp index 6e2080d25..46259b2bf 100644 --- a/manifests/profile/base/designate/producer.pp +++ b/manifests/profile/base/designate/producer.pp @@ -18,44 +18,18 @@ # # === Parameters # -# [*designate_redis_password*] -# (Required) Password for the neutron redis user for the coordination url -# Defaults to hiera('designate_redis_password', false), -# -# [*redis_vip*] -# (Required) Redis ip address for the coordination url -# Defaults to hiera('redis_vip', false), -# -# [*enable_internal_tls*] -# (Optional) Whether TLS in the internal network is enabled or not. -# Defaults to hiera('enable_internal_tls', false) -# # [*step*] # (Optional) The current step in deployment. See tripleo-heat-templates # for more details. # Defaults to hiera('step') # class tripleo::profile::base::designate::producer ( - $designate_redis_password = hiera('designate_redis_password', false), - $redis_vip = hiera('redis_vip', false), - $enable_internal_tls = hiera('enable_internal_tls', false), - $step = Integer(hiera('step')), + $step = Integer(hiera('step')), ) { include tripleo::profile::base::designate - - if $enable_internal_tls { - $tls_query_param = '?ssl=true' - } else { - $tls_query_param = '' - } + include tripleo::profile::base::designate::coordination if $step >= 4 { - if $redis_vip { - class { 'designate::producer': - backend_url => join(['redis://:', $designate_redis_password, '@', normalize_ip_for_uri($redis_vip), ':6379/', $tls_query_param]) - } - } else { - include designate::producer - } + include designate::producer } } diff --git a/spec/classes/tripleo_profile_base_designate_central_spec.rb b/spec/classes/tripleo_profile_base_designate_central_spec.rb index a4ffba448..0439c9c46 100644 --- a/spec/classes/tripleo_profile_base_designate_central_spec.rb +++ b/spec/classes/tripleo_profile_base_designate_central_spec.rb @@ -26,7 +26,7 @@ describe 'tripleo::profile::base::designate::central' do oslomsg_rpc_username => 'designate', oslomsg_rpc_password => 'foo' } - class { 'tripleo::profile::base::designate::authtoken': + class { 'tripleo::profile::base::designate::coordination': step => #{params[:step]}, } eos @@ -40,6 +40,7 @@ eos it { is_expected.to contain_class('tripleo::profile::base::designate::central') is_expected.to contain_class('tripleo::profile::base::designate') + is_expected.to contain_class('tripleo::profile::base::designate::coordination') is_expected.to_not contain_class('designate::db') is_expected.to_not contain_class('designate::central') is_expected.to_not contain_class('designate::quota') @@ -55,7 +56,10 @@ eos it { is_expected.to contain_class('tripleo::profile::base::designate::central') is_expected.to contain_class('tripleo::profile::base::designate') - is_expected.to contain_class('designate::db').with(:sync_db => true) + is_expected.to contain_class('tripleo::profile::base::designate::coordination') + is_expected.to contain_class('designate::db').with( + :sync_db => true + ) is_expected.to contain_class('designate::central') is_expected.to contain_class('designate::quota') } @@ -70,6 +74,7 @@ eos it { is_expected.to contain_class('tripleo::profile::base::designate::central') is_expected.to contain_class('tripleo::profile::base::designate') + is_expected.to contain_class('tripleo::profile::base::designate::coordination') is_expected.to_not contain_class('designate::db') is_expected.to_not contain_class('designate::central') is_expected.to_not contain_class('designate::quota') @@ -85,6 +90,7 @@ eos it { is_expected.to contain_class('tripleo::profile::base::designate::central') is_expected.to contain_class('tripleo::profile::base::designate') + is_expected.to contain_class('tripleo::profile::base::designate::coordination') is_expected.to contain_class('designate::db').with( :sync_db => false ) @@ -95,7 +101,6 @@ eos end - on_supported_os.each do |os, facts| context "on #{os}" do let(:facts) do diff --git a/spec/classes/tripleo_profile_base_designate_coordination_spec.rb b/spec/classes/tripleo_profile_base_designate_coordination_spec.rb new file mode 100644 index 000000000..486413a26 --- /dev/null +++ b/spec/classes/tripleo_profile_base_designate_coordination_spec.rb @@ -0,0 +1,83 @@ +# +# Copyright (C) 2022 Red Hat, Inc. +# +# 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. +# + +require 'spec_helper' + +describe 'tripleo::profile::base::designate::coordination' do + shared_examples_for 'tripleo::profile::base::designate::coordination' do + context 'with step less than 4' do + let(:params) { { + :step => 3, + :designate_redis_password => 'a_redis_password', + :redis_vip => '192.0.2.1', + } } + it { + is_expected.to_not contain_class('designate::coordination') + } + end + + context 'with step 4 and without a redis vip' do + let(:params) { { + :step => 4, + :designate_redis_password => 'a_redis_password', + # NOTE(tkajinam): Currently redis_vip is defined in test hieradata. + # Here we override the parameter to test the logic used + # when redis_vip is not set. + :redis_vip => false, + } } + it { + is_expected.to_not contain_class('designate::coordination') + } + end + + context 'with step 4 and a typical configuration no tls' do + let(:params) { { + :step => 4, + :designate_redis_password => 'a_redis_password', + :redis_vip => '192.0.2.1', + } } + it { + is_expected.to contain_class('designate::coordination').with( + :backend_url => 'redis://:a_redis_password@192.0.2.1:6379/' + ) + } + end + + context 'with 4 and a typical configuration tls enabled' do + let(:params) { { + :step => 4, + :designate_redis_password => 'a_redis_password', + :redis_vip => '192.0.2.1', + :enable_internal_tls => true + } } + it { + is_expected.to contain_class('designate::coordination').with( + :backend_url => 'redis://:a_redis_password@192.0.2.1:6379/?ssl=true' + ) + } + end + end + + on_supported_os.each do |os, facts| + context "on #{os}" do + let(:facts) do + facts.merge({ :hostname => 'node.example.com' }) + end + + it_behaves_like 'tripleo::profile::base::designate::coordination' + end + end +end diff --git a/spec/classes/tripleo_profile_base_designate_producer_spec.rb b/spec/classes/tripleo_profile_base_designate_producer_spec.rb index 65be7ba71..0017544d3 100644 --- a/spec/classes/tripleo_profile_base_designate_producer_spec.rb +++ b/spec/classes/tripleo_profile_base_designate_producer_spec.rb @@ -26,39 +26,39 @@ describe 'tripleo::profile::base::designate::producer' do oslomsg_rpc_username => 'designate', oslomsg_rpc_password => 'foo' } + class { 'tripleo::profile::base::designate::coordination': + step => #{params[:step]}, + } eos end context 'with step less than 4' do let(:params) { { - :designate_redis_password => 'password', - :redis_vip => '127.0.0.1', - :step => 1, + :step => 1, } } it { is_expected.to contain_class('tripleo::profile::base::designate::producer') is_expected.to contain_class('tripleo::profile::base::designate') + is_expected.to contain_class('tripleo::profile::base::designate::coordination') is_expected.to_not contain_class('designate::producer') } end context 'with step 4' do let(:params) { { - :designate_redis_password => 'password', - :redis_vip => '127.0.0.1', - :step => 4, + :step => 4, } } it { is_expected.to contain_class('tripleo::profile::base::designate::producer') is_expected.to contain_class('tripleo::profile::base::designate') + is_expected.to contain_class('tripleo::profile::base::designate::coordination') is_expected.to contain_class('designate::producer') } end end - on_supported_os.each do |os, facts| context "on #{os}" do let(:facts) do