Use system scope credentials in providers

This change enforces usage of system scope credentials to manage share
types, following the new policy rules for SRBAC support in manila.

The logic to look up credential for the nova service user from
[keystone_authtoken] is left to keep backward compatibility but is
deprecated and will be removed.

Depends-on: https://review.opendev.org/806474
Depends-on: https://review.opendev.org/828025
Change-Id: Ifd8aa63c94e194083a2b81fa9ea2c14afad5d6ab
This commit is contained in:
Takashi Kajinami 2022-03-07 00:20:54 +09:00
parent 3b341a2bfd
commit 5ca6e6fc9c
4 changed files with 31 additions and 10 deletions

View File

@ -1,5 +1,3 @@
File.expand_path('../../../../openstacklib/lib', File.dirname(__FILE__)).tap { |dir| $LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir) }
require 'puppet/util/inifile' require 'puppet/util/inifile'
require 'puppet/provider/openstack' require 'puppet/provider/openstack'
require 'puppet/provider/openstack/auth' require 'puppet/provider/openstack/auth'
@ -20,7 +18,15 @@ class Puppet::Provider::Manila < Puppet::Provider::Openstack
@manila_conf @manila_conf
end end
def self.request(service, action, properties=nil) def self.project_request(service, action, properties=nil, options={})
self.request(service, action, properties, options, 'project')
end
def self.system_request(service, action, properties=nil, options={})
self.request(service, action, properties, options, 'system')
end
def self.request(service, action, properties=nil, options={}, scope='project')
begin begin
super super
rescue Puppet::Error::OpenstackAuthInputError, Puppet::Error::OpenstackUnauthorizedError => error rescue Puppet::Error::OpenstackAuthInputError, Puppet::Error::OpenstackUnauthorizedError => error
@ -28,7 +34,8 @@ class Puppet::Provider::Manila < Puppet::Provider::Openstack
end end
end end
def self.manila_request(service, action, error, properties=nil) def self.manila_request(service, action, error, properties=nil, options={})
warning('Usage of keystone_authtoken parameters is deprecated.')
properties ||= [] properties ||= []
@credentials.username = manila_credentials['username'] @credentials.username = manila_credentials['username']
@credentials.password = manila_credentials['password'] @credentials.password = manila_credentials['password']
@ -40,7 +47,7 @@ class Puppet::Provider::Manila < Puppet::Provider::Openstack
@credentials.region_name = manila_credentials['region_name'] @credentials.region_name = manila_credentials['region_name']
end end
raise error unless @credentials.set? raise error unless @credentials.set?
Puppet::Provider::Openstack.request(service, action, properties, @credentials) Puppet::Provider::Openstack.request(service, action, properties, @credentials, options)
end end
def self.manila_credentials def self.manila_credentials

View File

@ -36,7 +36,7 @@ Puppet::Type.type(:manila_type).provide(
opts << '--revert-to-snapshot-support' << @resource[:revert_to_snapshot_support].to_s.capitalize opts << '--revert-to-snapshot-support' << @resource[:revert_to_snapshot_support].to_s.capitalize
opts << '--mount-snapshot-support' << @resource[:mount_snapshot_support].to_s.capitalize opts << '--mount-snapshot-support' << @resource[:mount_snapshot_support].to_s.capitalize
self.class.request('share type', 'create', opts) self.class.system_request('share type', 'create', opts)
[ [
:name, :name,
@ -56,7 +56,7 @@ Puppet::Type.type(:manila_type).provide(
if self.class.do_not_manage if self.class.do_not_manage
fail("Not managing Manila_type[#{@resource[:name]}] due to earlier Manila API failures.") fail("Not managing Manila_type[#{@resource[:name]}] due to earlier Manila API failures.")
end end
self.class.request('share type', 'delete', name) self.class.system_request('share type', 'delete', name)
@property_hash.clear @property_hash.clear
@property_hash[:ensure] = :absent @property_hash[:ensure] = :absent
end end
@ -71,7 +71,7 @@ Puppet::Type.type(:manila_type).provide(
def self.instances def self.instances
self.do_not_manage = true self.do_not_manage = true
list = request('share type', 'list').collect do |type| list = system_request('share type', 'list').collect do |type|
required_extra_specs = self.parse_specs(type[:required_extra_specs]) required_extra_specs = self.parse_specs(type[:required_extra_specs])
optional_extra_specs = self.parse_specs(type[:optional_extra_specs]) optional_extra_specs = self.parse_specs(type[:optional_extra_specs])
@ -124,7 +124,7 @@ Puppet::Type.type(:manila_type).provide(
opts << '--mount-snapshot-support' << @property_flush[:mount_snapshot_support].to_s.capitalize opts << '--mount-snapshot-support' << @property_flush[:mount_snapshot_support].to_s.capitalize
end end
self.class.request('share type', 'set', opts) self.class.system_request('share type', 'set', opts)
@property_flush.clear @property_flush.clear
end end
end end

View File

@ -0,0 +1,14 @@
---
upgrade:
- |
Now the ``manila_type`` resource type uses system scope credential instead
of project scope credential when sending requests to Manila API.
deprecations:
- |
Currently the manila_type`` resource type uses the credential written in
the ``[keystone_authtoken]`` section of ``manila.conf``. However this
behavior has been deprecated and now the resource type first looks for
the yaml files in ``/etc/openstack/puppet``. Make sure one of
``clouds.yaml`` or ``admin-clouds.yaml`` (which is created by
puppet-keystone) is created in that directory.

View File

@ -8,7 +8,7 @@ describe provider_class do
let(:set_creds_env) do let(:set_creds_env) do
ENV['OS_USERNAME'] = 'test' ENV['OS_USERNAME'] = 'test'
ENV['OS_PASSWORD'] = 'abc123' ENV['OS_PASSWORD'] = 'abc123'
ENV['OS_PROJECT_NAME'] = 'test' ENV['OS_SYSTEM_SCOPE'] = 'all'
ENV['OS_AUTH_URL'] = 'http://127.0.0.1:5000' ENV['OS_AUTH_URL'] = 'http://127.0.0.1:5000'
end end