diff --git a/lib/puppet/provider/keystone.rb b/lib/puppet/provider/keystone.rb index 1da697d7d..c6120c4c7 100644 --- a/lib/puppet/provider/keystone.rb +++ b/lib/puppet/provider/keystone.rb @@ -139,16 +139,20 @@ class Puppet::Provider::Keystone < Puppet::Provider::Openstack def self.fetch_user(name, domain) domain ||= default_domain - user = system_request('user', 'show', - [name, '--domain', domain], - {:no_retry_exception_msgs => /No user with a name or ID/}) + user = system_request( + 'user', 'show', + [name, '--domain', domain], + { + # TODO(tkajinam): Remove the first item after 2024.2 release. + :no_retry_exception_msgs => [/No user with a name or ID/, /No user found for/] + }) # The description key is only set if it exists if user and user.key?(:id) and !user.key?(:description) user[:description] = '' end user rescue Puppet::ExecutionFailure => e - raise e unless e.message =~ /No user with a name or ID/ + raise e unless (e.message =~ /No user with a name or ID/ or e.message =~ /No user found for/) end def self.get_auth_url diff --git a/spec/unit/provider/keystone_spec.rb b/spec/unit/provider/keystone_spec.rb index ac26d3e24..d4c7100a1 100644 --- a/spec/unit/provider/keystone_spec.rb +++ b/spec/unit/provider/keystone_spec.rb @@ -74,7 +74,7 @@ id="newid" set_env end - it 'should be false if the user does not exist' do + it 'should be false if the user does not exist (osc<7)' do expect(klass).to receive(:request_timeout).and_return(0) expect(klass).to receive(:openstack) .with('user', 'show', '--format', 'shell', ['no_user', '--domain', 'Default']) @@ -83,6 +83,15 @@ id="newid" expect(klass.fetch_user('no_user', 'Default')).to be_falsey end + it 'should be false if the user does not exist (osc>=7)' do + expect(klass).to receive(:request_timeout).and_return(0) + expect(klass).to receive(:openstack) + .with('user', 'show', '--format', 'shell', ['no_user', '--domain', 'Default']) + .exactly(1).times + .and_raise(Puppet::ExecutionFailure, "Execution of '/usr/bin/openstack user show --format shell no_user' returned 1: No user found for no_user") + expect(klass.fetch_user('no_user', 'Default')).to be_falsey + end + it 'should return the user' do expect(klass).to receive(:openstack) .with('user', 'show', '--format', 'shell', ['The User', '--domain', 'Default'])