Skip to content
Snippets Groups Projects
Commit 56602b16 authored by Alexander Olofsson's avatar Alexander Olofsson
Browse files

Merge branch 'rbac' into 'devel'

Rbac

See merge request pm-liuit/liu_pulpcore!112
parents f853ef54 2375f246
Branches
No related tags found
No related merge requests found
Pipeline #163088 passed
Showing
with 200 additions and 21 deletions
...@@ -19,12 +19,19 @@ class Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup < Puppet::ResourceApi ...@@ -19,12 +19,19 @@ class Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup < Puppet::ResourceApi
result[:pulp_href] = group['pulp_href'] result[:pulp_href] = group['pulp_href']
result[:raw_members] = paginated { request("#{group['pulp_href']}/users/") }['results'] result[:raw_members] = paginated { request("#{group['pulp_href']}/users/") }['results']
result[:members] = result[:raw_members].map { |member| member['username'] } result[:members] = result[:raw_members].map { |member| member['username'] }.sort
result result
end end
end end
def canonicalize(_context, resources)
resources.each do |group|
group[:members].sort!
end
resources
end
def create(_context, name, should) def create(_context, name, should)
data = execute('create', name, should) data = execute('create', name, should)
cache << data.transform_keys(&:to_sym).slice(:pulp_href, *attribute_keys).merge(name: name) cache << data.transform_keys(&:to_sym).slice(:pulp_href, *attribute_keys).merge(name: name)
......
...@@ -30,6 +30,9 @@ class Puppet::Provider::LiuPulpcoreGroupRole::LiuPulpcoreGroupRole < Puppet::Res ...@@ -30,6 +30,9 @@ class Puppet::Provider::LiuPulpcoreGroupRole::LiuPulpcoreGroupRole < Puppet::Res
result[:base_href] = group['pulp_href'] result[:base_href] = group['pulp_href']
result[:raw_roles] = paginated(per_page: 1000) { request("#{group['pulp_href']}/roles/", query: { exclude_fields: 'permissions,description', role: namevar[:role] }) }['results'] result[:raw_roles] = paginated(per_page: 1000) { request("#{group['pulp_href']}/roles/", query: { exclude_fields: 'permissions,description', role: namevar[:role] }) }['results']
result.merge! parse_roles(result[:raw_roles], workaround: true).transform_keys(&:to_sym) result.merge! parse_roles(result[:raw_roles], workaround: true).transform_keys(&:to_sym)
result[:object].sort_by!(&:to_s)
result[:domain].sort_by!(&:to_s)
end end
result result
...@@ -37,6 +40,14 @@ class Puppet::Provider::LiuPulpcoreGroupRole::LiuPulpcoreGroupRole < Puppet::Res ...@@ -37,6 +40,14 @@ class Puppet::Provider::LiuPulpcoreGroupRole::LiuPulpcoreGroupRole < Puppet::Res
end end
end end
def canonicalize(_context, resources)
resources.each do |group_role|
group_role[:object].sort_by!(&:to_s)
group_role[:domain].sort_by!(&:to_s)
end
resources
end
def create(_context, name, should) def create(_context, name, should)
execute('create', name, should) execute('create', name, should)
end end
......
...@@ -18,10 +18,18 @@ class Puppet::Provider::LiuPulpcoreRole::LiuPulpcoreRole < Puppet::ResourceApi:: ...@@ -18,10 +18,18 @@ class Puppet::Provider::LiuPulpcoreRole::LiuPulpcoreRole < Puppet::ResourceApi::
result[:name] = role['name'] result[:name] = role['name']
result[:pulp_href] = role['pulp_href'] result[:pulp_href] = role['pulp_href']
result[:locked] = role['locked'] result[:locked] = role['locked']
result[:permissions].sort!
result result
end end
end end
def canonicalize(_context, resources)
resources.each do |role|
role[:permissions].sort_by!(&:to_s)
end
resources
end
def create(_context, name, should) def create(_context, name, should)
data = execute('create', name, should) data = execute('create', name, should)
cache << data.transform_keys(&:to_sym).slice(:pulp_href, *attribute_keys).merge(name: name) cache << data.transform_keys(&:to_sym).slice(:pulp_href, *attribute_keys).merge(name: name)
......
...@@ -30,6 +30,9 @@ class Puppet::Provider::LiuPulpcoreUserRole::LiuPulpcoreUserRole < Puppet::Resou ...@@ -30,6 +30,9 @@ class Puppet::Provider::LiuPulpcoreUserRole::LiuPulpcoreUserRole < Puppet::Resou
result[:base_href] = user['pulp_href'] result[:base_href] = user['pulp_href']
result[:raw_roles] = paginated(per_page: 1000) { request("#{user['pulp_href']}/roles/", query: { exclude_fields: 'permissions,description', role: namevar[:role] }) }['results'] result[:raw_roles] = paginated(per_page: 1000) { request("#{user['pulp_href']}/roles/", query: { exclude_fields: 'permissions,description', role: namevar[:role] }) }['results']
result.merge! parse_roles(result[:raw_roles], workaround: true).transform_keys(&:to_sym) result.merge! parse_roles(result[:raw_roles], workaround: true).transform_keys(&:to_sym)
result[:object].sort_by!(&:to_s)
result[:domain].sort_by!(&:to_s)
end end
result result
...@@ -37,6 +40,14 @@ class Puppet::Provider::LiuPulpcoreUserRole::LiuPulpcoreUserRole < Puppet::Resou ...@@ -37,6 +40,14 @@ class Puppet::Provider::LiuPulpcoreUserRole::LiuPulpcoreUserRole < Puppet::Resou
end end
end end
def canonicalize(_context, resources)
resources.each do |user_role|
user_role[:object].sort_by!(&:to_s)
user_role[:domain].sort_by!(&:to_s)
end
resources
end
def create(_context, name, should) def create(_context, name, should)
execute('create', name, should) execute('create', name, should)
end end
......
...@@ -12,7 +12,7 @@ Puppet::ResourceApi.register_type( ...@@ -12,7 +12,7 @@ Puppet::ResourceApi.register_type(
members => [ 'dev-user' ], members => [ 'dev-user' ],
} }
EOS EOS
features: [], features: ['canonicalize'],
attributes: { attributes: {
ensure: { ensure: {
type: 'Enum[present, absent]', type: 'Enum[present, absent]',
......
...@@ -22,7 +22,7 @@ Puppet::ResourceApi.register_type( ...@@ -22,7 +22,7 @@ Puppet::ResourceApi.register_type(
object => [Liu_pulpcore_rpm_repository['testing']], object => [Liu_pulpcore_rpm_repository['testing']],
} }
EOS EOS
features: ['simple_get_filter'], features: ['simple_get_filter', 'canonicalize'],
title_patterns: [ title_patterns: [
{ {
pattern: %r{\A(?<group>[^/]+)/(?<role>.+)\Z}, pattern: %r{\A(?<group>[^/]+)/(?<role>.+)\Z},
......
...@@ -7,7 +7,7 @@ Puppet::ResourceApi.register_type( ...@@ -7,7 +7,7 @@ Puppet::ResourceApi.register_type(
docs: <<-EOS, docs: <<-EOS,
@summary Pulp RBAC role @summary Pulp RBAC role
EOS EOS
features: [], features: ['canonicalize'],
attributes: { attributes: {
ensure: { ensure: {
type: 'Enum[present, absent]', type: 'Enum[present, absent]',
......
...@@ -22,7 +22,7 @@ Puppet::ResourceApi.register_type( ...@@ -22,7 +22,7 @@ Puppet::ResourceApi.register_type(
object => [Liu_pulpcore_rpm_repository['testing']], object => [Liu_pulpcore_rpm_repository['testing']],
} }
EOS EOS
features: ['simple_get_filter'], features: ['simple_get_filter', 'canonicalize'],
title_patterns: [ title_patterns: [
{ {
pattern: %r{\A(?<user>[^/]+)/(?<role>.+)\Z}, pattern: %r{\A(?<user>[^/]+)/(?<role>.+)\Z},
......
...@@ -4,7 +4,11 @@ ...@@ -4,7 +4,11 @@
"previous": null, "previous": null,
"results": [ "results": [
{ {
"username": "example-user", "username": "example-user2",
"pulp_href": "/pulp/api/v3/users/6/"
},
{
"username": "example-user1",
"pulp_href": "/pulp/api/v3/users/5/" "pulp_href": "/pulp/api/v3/users/5/"
} }
] ]
......
...@@ -335,7 +335,9 @@ RSpec.describe 'LiU_pulpcore integration test' do ...@@ -335,7 +335,9 @@ RSpec.describe 'LiU_pulpcore integration test' do
body: '{}', body: '{}',
) )
catalog.apply report = catalog.apply.report
report.finalize_report
expect(report.status).to eq('changed')
# Ensure all resources have been created # Ensure all resources have been created
assert_requested rpm_remote assert_requested rpm_remote
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'LiU_pulpcore member ordering integration test' do
let(:group_members) { ['example-user1', 'example-user2'] }
let(:group) { Puppet::Type.type(:liu_pulpcore_group).new(name: 'example-group', members: group_members) }
let(:catalog) do
Puppet::Resource::Catalog.new.tap do |cat|
cat.add_resource(group)
end
end
before(:each) do
allow(Puppet::Util::Storage).to receive(:store)
# Allows retrieving groups
stub_request(:get, 'http://pulpcore-api/pulp/api/v3/groups/?limit=100&offset=0')
.to_return(
status: 200,
body: File.read('spec/fixtures/pulp_data/get_groups.json'),
)
# Allow retrieving members assigned to the groups
stub_request(:get, 'http://pulpcore-api/pulp/api/v3/groups/1/users/?limit=100&offset=0')
.to_return(
status: 200,
body: File.read('spec/fixtures/pulp_data/get_group_users.json'),
)
end
describe 'with no differences' do
it 'does nothing' do
report = catalog.apply.report
report.finalize_report
expect(report.logs).to be_empty
expect(report.status).to eq('unchanged')
end
end
describe 'with ordering difference' do
let(:group_members) { ['example-user2', 'example-user1'] }
it 'performs no changes' do
report = catalog.apply.report
report.finalize_report
expect(report.logs).to be_empty
expect(report.status).to eq('unchanged')
end
end
describe 'with content difference' do
let(:group_members) { ['example-user'] }
it 'performs changes' do
del_req1 = stub_request(:delete, 'http://pulpcore-api/pulp/api/v3/groups/1/users/5/')
.to_return(
status: 200,
)
del_req2 = stub_request(:delete, 'http://pulpcore-api/pulp/api/v3/groups/1/users/6/')
.to_return(
status: 200,
)
add_req = stub_request(:post, 'http://pulpcore-api/pulp/api/v3/groups/1/users/')
.with(
body: {
username: 'example-user',
},
)
.to_return(
status: 200,
)
report = catalog.apply.report
report.finalize_report
expect(report.status).to eq('changed')
assert_requested del_req1
assert_requested del_req2
assert_requested add_req
end
end
end
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
require 'webmock/rspec' require 'webmock/rspec'
require_relative '../lib/puppet_x/liu_pulpcore/connection' require_relative '../lib/puppet_x/liu_pulpcore/connection'
require_relative '../lib/puppet_x/liu_pulpcore/resource_cache'
def enable_pulp3_testing def enable_pulp3_testing
PuppetX::LiuPulpcore::Connection.class_eval do PuppetX::LiuPulpcore::Connection.class_eval do
...@@ -9,6 +10,23 @@ def enable_pulp3_testing ...@@ -9,6 +10,23 @@ def enable_pulp3_testing
end end
end end
def drop_pulp3_caches
pulpcore_types = [:user, :group, :role]
[:deb, :rpm, :python].each do |plugin|
[:distribution, :publication, :remote, :repository].each do |type|
pulpcore_types << :"#{plugin}_#{type}"
end
end
pulpcore_types.map! { |type| :"liu_pulpcore_#{type}" }
pulpcore_types.each do |type|
provider = Puppet::Type.type(type).my_provider
provider.instance_variable_set :@cached_get, nil if provider.instance_variable_defined? :@cached_get
provider.instance_variable_set :@cache, nil if provider.instance_variable_defined? :@cache
end
end
def enable_pulp3_integration def enable_pulp3_integration
PuppetX::LiuPulpcore::Connection.class_eval do PuppetX::LiuPulpcore::Connection.class_eval do
@config = nil @config = nil
...@@ -124,3 +142,9 @@ def allow_searching_full_cache ...@@ -124,3 +142,9 @@ def allow_searching_full_cache
end end
enable_pulp3_testing enable_pulp3_testing
RSpec.configure do |config|
config.before(:each) do
drop_pulp3_caches
end
end
...@@ -15,12 +15,17 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do ...@@ -15,12 +15,17 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do
ensure: 'present', ensure: 'present',
name: 'example-group', name: 'example-group',
members: [ members: [
'example-user', 'example-user1',
'example-user2',
], ],
pulp_href: '/pulp/api/v3/groups/1/', pulp_href: '/pulp/api/v3/groups/1/',
raw_members: [ raw_members: [
{ {
'username' => 'example-user', 'username' => 'example-user2',
'pulp_href' => '/pulp/api/v3/users/6/',
},
{
'username' => 'example-user1',
'pulp_href' => '/pulp/api/v3/users/5/', 'pulp_href' => '/pulp/api/v3/users/5/',
}, },
], ],
...@@ -66,21 +71,32 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do ...@@ -66,21 +71,32 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do
pulp_href: '/pulp/api/v3/groups/1/' pulp_href: '/pulp/api/v3/groups/1/'
}.to_json, }.to_json,
) )
req_member = stub_request(:post, 'http://pulpcore-api/pulp/api/v3/groups/1/users/') req_member1 = stub_request(:post, 'http://pulpcore-api/pulp/api/v3/groups/1/users/')
.with( .with(
body: { body: {
username: 'example-user', username: 'example-user1',
}, },
) )
.to_return( .to_return(
status: 200, status: 200,
body: '{}', body: '{}',
) )
req_member2 = stub_request(:post, 'http://pulpcore-api/pulp/api/v3/groups/1/users/')
.with(
body: {
username: 'example-user2',
},
)
.to_return(
status: 200,
body: '{}',
)
provider.create(context, test_data[:name], test_data) provider.create(context, test_data[:name], test_data)
assert_requested req assert_requested req
assert_requested req_member assert_requested req_member1
assert_requested req_member2
end end
end end
...@@ -102,13 +118,25 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do ...@@ -102,13 +118,25 @@ RSpec.describe Puppet::Provider::LiuPulpcoreGroup::LiuPulpcoreGroup do
body: '{}', body: '{}',
) )
test_data[:members] = ['another-user'] test_data[:members] = ['another-user', 'example-user2']
provider.update(context, test_data[:name], test_data) provider.update(context, test_data[:name], test_data)
assert_requested user_add_req assert_requested user_add_req
assert_requested user_del_req assert_requested user_del_req
end end
it 'ignores user ordering' do
user_add_req = stub_request(:post, 'http://pulpcore-api/pulp/api/v3/groups/1/users/')
user_del_req = stub_request(:delete, %r{http://pulpcore-api/pulp/api/v3/groups/1/users/\d+/})
test_data[:members] = ['example-user2', 'example-user1']
provider.update(context, test_data[:name], test_data)
refute_requested user_add_req
refute_requested user_del_req
end
end end
describe 'delete(context, name)' do describe 'delete(context, name)' do
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment