integ/config/puppet-modules/openstack/puppet-keystone-17.4.0/debian/patches/0001-Adapt-first-set-of-legacy-patches.patch
Dan Voiculeasa 8a88130973 Add debian package for puppet-module-keystone-17.4.0
Aligned with Debian Bullseye version puppet-module-keystone-17.4.0-2.

Did build puppet-keystone-17.4.0 + starlingx patches (adapted from
CentOS7). Adapted all patches.
Did build an iso.

Big logic changes in upstream version, here are 3 examples:
bc1ff1d7cb"
58dfc07b3a"
329ab549a2"
Adapt patch 1. Keep patch 5.
Drop patches 2, 3, 4, 7 as they are not not needed.
Adpat patch 6, but integration work is needed to generate hieradata
for keystone::bootstrap::dc_admin_user_id instead of
keystone::dc_admin_user_id
and keystone::bootstrap::dc_admin_project_id instead of
keystone::dc_admin_project_id.
Integration work is needed anyway to adapt existing components to use
this version of puppet-module-keystone.

Story: 2009101
Task: 43370
Signed-off-by: Dan Voiculeasa <dan.voiculeasa@windriver.com>
Change-Id: I4ccaf74e774f353ba36cc7412fceb82adf650bb5
2021-09-23 17:59:43 +03:00

334 lines
14 KiB
Diff

From ff270d806958405b35170dbb6b57da6a13ed14ed Mon Sep 17 00:00:00 2001
From: Dan Voiculeasa <dan.voiculeasa@windriver.com>
Date: Mon, 20 Sep 2021 16:17:56 +0300
Subject: [PATCH 1/3] Adapt first set of legacy patches
Adapt 0001-pike-rebase-squash-titanium-patches.patch from CentOS.
Big logic changes in upstream version, here are 3 examples:
many divergences:
https://github.com/openstack/puppet-keystone/commit/bc1ff1d7cb01ac02790c3302a3da6e994598d9f6"
admin_endpoint->public_endpoint:
https://github.com/openstack/puppet-keystone/commit/58dfc07b3a90a8b05aeb0cbeae17c1b7cfc35594"
url->endpoint:
https://github.com/openstack/puppet-keystone/commit/329ab549a2a127ae41dda5e2c2a906313e5ff911"
Signed-off-by: Dan Voiculeasa <dan.voiculeasa@windriver.com>
---
lib/puppet/provider/keystone.rb | 77 ++++++++++++++++++-
manifests/db/sync.pp | 3 +
manifests/init.pp | 45 +++++++++--
manifests/ldap.pp | 7 ++
manifests/logging.pp | 2 +-
manifests/resource/service_identity.pp | 7 ++
.../keystone_security_compliance_spec.rb | 12 +--
7 files changed, 140 insertions(+), 13 deletions(-)
diff --git a/lib/puppet/provider/keystone.rb b/lib/puppet/provider/keystone.rb
index 9911b6e..b0756fd 100644
--- a/lib/puppet/provider/keystone.rb
+++ b/lib/puppet/provider/keystone.rb
@@ -3,6 +3,7 @@ require 'puppet/provider/openstack'
require 'puppet/provider/openstack/auth'
require 'puppet/provider/openstack/credentials'
require File.join(File.dirname(__FILE__), '..','..', 'puppet/provider/keystone/util')
+require 'hiera_puppet'
class Puppet::Provider::Keystone < Puppet::Provider::Openstack
@@ -224,12 +225,86 @@ class Puppet::Provider::Keystone < Puppet::Provider::Openstack
end
end
+ ### STX Modifications (Start) ###
+
+ def self.hiera_lookup(key)
+ HieraPuppet.lookup(key, :undef, self, nil, :priority)
+ end
+
+ def self.initial_config_primary?
+ return true if ENV['INITIAL_CONFIG_PRIMARY'] == "true"
+ end
+
+ def self.upgrading?
+ return true if hiera_lookup('platform::params::controller_upgrade') == true
+ end
+
def self.request(service, action, properties=nil, options={})
super
rescue Puppet::Error::OpenstackAuthInputError, Puppet::Error::OpenstackUnauthorizedError => error
- keystone_request(service, action, error, properties)
+ if initial_config_primary?
+ # admin user account might not have been created
+ keystone_request(service, action, error, properties)
+ else
+ if upgrading?
+ # when running the Keystone manifest during an upgrade
+ # (on controller-1), we need to use an AUTH token and
+ # a bypass URL since using the default AUTL URL will
+ # send the Request to the service catalog URL (internalURL),
+ # running on the non-upgraded controller-0 which cannot
+ # service this request
+ request_by_upgrading_token(service, action, error, properties)
+ else
+ request_by_admin_credential(service, action, error, properties)
+ end
+ end
end
+ def self.request_by_admin_credential(service, action, error, properties=nil)
+ properties ||= []
+ @credentials.username = hiera_lookup('platform::client::params::admin_username')
+ @credentials.password = hiera_lookup('keystone::admin_password')
+ @credentials.project_name = 'admin'
+ @credentials.auth_url = get_auth_url
+ @credentials.identity_api_version = @credentials.version
+ if @credentials.version == '3'
+ @credentials.user_domain_name = hiera_lookup('platform::client::params::admin_user_domain')
+ @credentials.project_domain_name = hiera_lookup('platform::client::params::admin_project_domain')
+ end
+ raise error unless @credentials.set?
+ Puppet::Provider::Openstack.request(service, action, properties, @credentials)
+ end
+
+ def self.get_upgrade_token
+ upgrade_token_file = hiera_lookup('openstack::keystone::upgrade::upgrade_token_file')
+ # the upgrade token file may get refreshed by the same Puppet event
+ # that triggered this call, and therefore may not be available
+ # immediately. Try for timeout before quitting with error
+ timeout = 10 # 10 seconds
+ 1.upto(timeout) do |iter|
+ if File.exists?(upgrade_token_file)
+ upgrade_token = File.read(upgrade_token_file).strip
+ notice("Found #{upgrade_token_file} token file and upgrade token #{upgrade_token}.")
+ return upgrade_token
+ else
+ Puppet.debug("#{upgrade_token_file} not found. Retrying for #{iter} more seconds.")
+ sleep(1)
+ end
+ end
+ raise(Puppet::ExecutionFailure, "Can't retrieve #{upgrade_token_file} in #{timeout}s retry attempts.")
+ end
+
+ def self.request_by_upgrading_token(service, action, error, properties=nil, options={})
+ properties ||= []
+ @credentials.token = get_upgrade_token
+ @credentials.endpoint = hiera_lookup('openstack::keystone::upgrade::url')
+ raise error unless @credentials.service_token_set?
+ Puppet::Provider::Openstack.request(service, action, properties, @credentials, options)
+ end
+
+ ### STX Additions (End) ###
+
+
def self.keystone_request(service, action, error, properties=nil)
properties ||= []
@credentials.username = keystone_puppet_credentials['username']
diff --git a/manifests/db/sync.pp b/manifests/db/sync.pp
index f1bb758..6dbc202 100644
--- a/manifests/db/sync.pp
+++ b/manifests/db/sync.pp
@@ -36,5 +36,8 @@ class keystone::db::sync(
],
notify => Anchor['keystone::dbsync::end'],
tag => ['keystone-exec', 'openstack-db']
+ # Only do the db sync if both controllers are running the same software
+ # version. Avoids impacting mate controller during an upgrade.
+ onlyif => "test $::controller_sw_versions_match = true",
}
}
diff --git a/manifests/init.pp b/manifests/init.pp
index 35860f2..ee07bd3 100644
--- a/manifests/init.pp
+++ b/manifests/init.pp
@@ -55,6 +55,15 @@
# other than KVS, which stores events in memory.
# Defaults to true.
#
+# [*upgrade_token_cmd*]
+# (Optional) STX - if we are in an upgrade scenario, an upgrade token
+# will be required to bypass authentication.
+# Defaults to undef
+#
+# [*upgrade_token_file*]
+# (Optional) STX - the file where the upgrade token will be stowed
+# Defaults to undef
+#
# [*manage_service*]
# (Optional) If Puppet should manage service startup / shutdown.
# Defaults to true.
@@ -480,6 +489,8 @@ class keystone(
$max_request_body_size = $::os_service_default,
$purge_config = false,
$amqp_durable_queues = $::os_service_default,
+ $upgrade_token_cmd = undef,
+ $upgrade_token_file = undef,
) inherits keystone::params {
include keystone::deps
@@ -553,18 +564,21 @@ class keystone(
# ssl config
if ($enable_ssl) {
keystone_config {
- 'ssl/enable': value => true;
+ # STX ssl/enable is deprecated for removal
+ #'ssl/enable': value => true;
'ssl/certfile': value => $ssl_certfile;
'ssl/keyfile': value => $ssl_keyfile;
'ssl/ca_certs': value => $ssl_ca_certs;
'ssl/ca_key': value => $ssl_ca_key;
'ssl/cert_subject': value => $ssl_cert_subject;
}
- } else {
- keystone_config {
- 'ssl/enable': value => false;
- }
}
+ # STX ssl/enable is deprecated for removal
+ #else {
+ # keystone_config {
+ # 'ssl/enable': value => false;
+ # }
+ #}
oslo::middleware { 'keystone_config':
enable_proxy_headers_parsing => $enable_proxy_headers_parsing,
@@ -788,6 +802,27 @@ running as a standalone service, or httpd for being run by a httpd server")
fail('You must activate domain configuration using "using_domain_config" parameter to keystone class.')
}
+ # STX: Now that the keystone service has started,
+ # check if we are in an Upgrade scenario, and generate
+ # an upgrade token which will be used to bypass Keystone
+ # authentication (specifically the service catalog) for
+ # all operations during upgrades.
+ # This operation is similar to the keystone bootstrap
+ # operation (above) which would generate an admin
+ # token, and therefore also requires the database to
+ # be up and running and configured and is only run once,
+ # so we don't need to notify the service
+ if $upgrade_token_cmd and $upgrade_token_file {
+ exec { 'upgrade token issue':
+ command => "${upgrade_token_cmd} > ${upgrade_token_file}",
+ path => '/usr/bin',
+ creates => $upgrade_token_file,
+ subscribe => Service[$service_name],
+ notify => Anchor['keystone::service::end'],
+ tag => 'keystone-exec',
+ }
+ }
+
if $using_domain_config {
validate_legacy(Stdlib::Absolutepath, 'validate_absolute_path', $domain_config_directory)
diff --git a/manifests/ldap.pp b/manifests/ldap.pp
index 79c49e7..e87181f 100644
--- a/manifests/ldap.pp
+++ b/manifests/ldap.pp
@@ -4,6 +4,11 @@
#
# === Parameters:
#
+# [*debug_level*]
+# LDAP debugging level for LDAP calls; a value of zero("0") disables
+# debugging. (integer value)
+# Defaults to 'undef'
+#
# [*url*]
# URL for connecting to the LDAP server. (string value)
# Defaults to 'undef'
@@ -364,6 +369,7 @@
# Copyright 2012 Puppetlabs Inc, unless otherwise noted.
#
class keystone::ldap(
+ $debug_level = undef,
$url = undef,
$user = undef,
$password = undef,
@@ -462,6 +468,7 @@ class keystone::ldap(
}
keystone_config {
+ 'ldap/debug_level': value => $debug_level;
'ldap/url': value => $url;
'ldap/user': value => $user;
'ldap/password': value => $password, secret => true;
diff --git a/manifests/logging.pp b/manifests/logging.pp
index 0396cd9..cffaf00 100644
--- a/manifests/logging.pp
+++ b/manifests/logging.pp
@@ -120,7 +120,7 @@ class keystone::logging(
$log_file = $::os_service_default,
$debug = $::os_service_default,
$logging_context_format_string = $::os_service_default,
- $logging_default_format_string = $::os_service_default,
+ $logging_default_format_string = 'keystone:log %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s',
$logging_debug_format_suffix = $::os_service_default,
$logging_exception_prefix = $::os_service_default,
$logging_user_identity_format = $::os_service_default,
diff --git a/manifests/resource/service_identity.pp b/manifests/resource/service_identity.pp
index ef09dab..0caf3bb 100644
--- a/manifests/resource/service_identity.pp
+++ b/manifests/resource/service_identity.pp
@@ -195,6 +195,8 @@ define keystone::resource::service_identity(
if $service_type {
ensure_resource('keystone_service', "${service_name_real}::${service_type}", {
'ensure' => $ensure,
+ 'name' => $service_name_real,
+ 'type' => $service_type,
'description' => $service_description,
})
} else {
@@ -207,6 +209,9 @@ define keystone::resource::service_identity(
if $public_url and $admin_url and $internal_url {
ensure_resource('keystone_endpoint', "${region}/${service_name_real}::${service_type}", {
'ensure' => $ensure,
+ 'name' => $service_name_real,
+ 'type' => $service_type,
+ 'region' => $region,
'public_url' => $public_url,
'admin_url' => $admin_url,
'internal_url' => $internal_url,
@@ -218,6 +223,8 @@ define keystone::resource::service_identity(
if $public_url and $admin_url and $internal_url {
ensure_resource('keystone_endpoint', "${region}/${service_name_real}", {
'ensure' => $ensure,
+ 'name' => $service_name_real,
+ 'region' => $region,
'public_url' => $public_url,
'admin_url' => $admin_url,
'internal_url' => $internal_url,
diff --git a/spec/classes/keystone_security_compliance_spec.rb b/spec/classes/keystone_security_compliance_spec.rb
index 4856f3f..4287476 100644
--- a/spec/classes/keystone_security_compliance_spec.rb
+++ b/spec/classes/keystone_security_compliance_spec.rb
@@ -23,9 +23,9 @@ describe 'keystone::security_compliance' do
:lockout_failure_attempts => 3,
:minimum_password_age => 4,
:password_expires_days => 5,
- :password_regex => 'SomeRegex',
- :password_regex_description => 'this is some regex',
- :unique_last_password_count => 6,
+ :password_regex => '^(?=.*\d)(?=.*[a-zA-Z]).{7,}$',
+ :password_regex_description => 'password must be at least 7 characters long and contain 1 digit',
+ :unique_last_password_count => 2,
}
end
it 'should have configure security compliance with params' do
@@ -35,9 +35,9 @@ describe 'keystone::security_compliance' do
is_expected.to contain_keystone_config('security_compliance/lockout_failure_attempts').with_value(3)
is_expected.to contain_keystone_config('security_compliance/minimum_password_age').with_value(4)
is_expected.to contain_keystone_config('security_compliance/password_expires_days').with_value(5)
- is_expected.to contain_keystone_config('security_compliance/password_regex').with_value('SomeRegex')
- is_expected.to contain_keystone_config('security_compliance/password_regex_description').with_value('this is some regex')
- is_expected.to contain_keystone_config('security_compliance/unique_last_password_count').with_value(6)
+ is_expected.to contain_keystone_config('security_compliance/password_regex').with_value('^(?=.*\d)(?=.*[a-zA-Z]).{7,}$')
+ is_expected.to contain_keystone_config('security_compliance/password_regex_description').with_value('password must be at least 7 characters long and contain 1 digit')
+ is_expected.to contain_keystone_config('security_compliance/unique_last_password_count').with_value(2)
end
end
end
--
2.30.0