Skip to content

Commit 8c3d83f

Browse files
authored
Merge pull request #187 from DavidS/SERVER-2470-list_all_transports
(SERVER-2470) list_all_transports implementation for puppetserver
2 parents 1392ffb + ad55367 commit 8c3d83f

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

lib/puppet/resource_api/transport.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,35 @@ def register(schema)
2020
module_function :register # rubocop:disable Style/AccessModifierDeclarations
2121

2222
# retrieve a Hash of transport schemas, keyed by their name.
23+
# Only already loaded transports are returned.
2324
def list
2425
Marshal.load(Marshal.dump(transports))
2526
end
2627
module_function :list # rubocop:disable Style/AccessModifierDeclarations
2728

29+
# retrieve a Hash of transport schemas, keyed by their name.
30+
# This uses the Puppet autoloader, provide a environment name as `force_environment`
31+
# to choose where to load from.
32+
# @api private
33+
def list_all_transports(force_environment)
34+
env = Puppet.lookup(:environments).get!(force_environment)
35+
Puppet.override({ current_environment: env }, 'current env for list_all_transports') do
36+
load_all_schemas
37+
Marshal.load(Marshal.dump(transports))
38+
end
39+
end
40+
module_function :list_all_transports # rubocop:disable Style/AccessModifierDeclarations
41+
42+
# Loads all schemas using the Puppet Autoloader.
43+
def self.load_all_schemas
44+
require 'puppet'
45+
require 'puppet/settings'
46+
require 'puppet/util/autoload'
47+
@autoloader ||= Puppet::Util::Autoload.new(self, 'puppet/transport/schema')
48+
@autoloader.loadall(Puppet.lookup(:current_environment))
49+
end
50+
private_class_method :load_all_schemas
51+
2852
def connect(name, connection_info)
2953
validate(name, connection_info)
3054
require "puppet/transport/#{name}"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe 'Resource API Transport integration tests:' do
4+
describe '#list_all_transports' do
5+
subject(:transports) { Puppet::ResourceApi::Transport.list_all_transports('rp_env') }
6+
7+
it 'can be called twice' do
8+
expect {
9+
Puppet::ResourceApi::Transport.list_all_transports('rp_env')
10+
Puppet::ResourceApi::Transport.list_all_transports('rp_env')
11+
}.not_to raise_error
12+
end
13+
14+
it 'loads all transports' do
15+
expect(transports).to have_key 'test_device'
16+
expect(transports).to have_key 'test_device_sensitive'
17+
expect(transports['test_device']).to be_a Puppet::ResourceApi::TransportSchemaDef
18+
expect(transports['test_device'].definition).to include(name: 'test_device')
19+
end
20+
end
21+
end

spec/puppet/resource_api/transport_spec.rb

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,6 @@ def change_environment(name = nil)
2929
Puppet.debug = true
3030
end
3131

32-
after(:each) do
33-
# reset registered transports between tests to reduce cross-test poisoning
34-
described_class.instance_variable_set(:@transports, nil)
35-
end
36-
3732
describe '#register(schema)' do
3833
context 'when registering a schema with missing keys' do
3934
it { expect { described_class.register([]) }.to raise_error(Puppet::DevError, %r{requires a hash as schema}) }

spec/puppet/resource_api_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1847,7 +1847,7 @@ def set(_context, changes) end
18471847
context 'when loading a type with unknown features' do
18481848
let(:definition) do
18491849
{
1850-
name: 'test_noop_support',
1850+
name: 'test_noop_support_2',
18511851
desc: 'a test resource',
18521852
features: ['no such feature'],
18531853
attributes: {},

spec/spec_helper.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'bundler/setup'
2+
require 'rspec-puppet'
23

34
RSpec.configure do |config|
45
# Enable flags like --only-failures and --next-failure
@@ -14,6 +15,9 @@
1415
# override legacy default from puppetlabs_spec_helper
1516
config.mock_with :rspec
1617

18+
# enable rspec-puppet support everywhere
19+
config.include RSpec::Puppet::Support
20+
1721
# reset the warning suppression count
1822
config.before(:each) do
1923
Puppet::ResourceApi.warning_count = 0
@@ -26,3 +30,14 @@
2630

2731
# exclude the `version.rb` which already gets loaded by bundler via the gemspec, and doesn't need coverage testing anyways.
2832
SimpleCov.add_filter 'lib/puppet/resource_api/version.rb' if ENV['SIMPLECOV'] == 'yes'
33+
34+
# configure this hook after Resource API is loaded to get access to Puppet::ResourceApi::Transport
35+
RSpec.configure do |config|
36+
config.after(:each) do
37+
# reset registered transports between tests to reduce cross-test poisoning
38+
Puppet::ResourceApi::Transport.instance_variable_set(:@transports, nil)
39+
if (autoloader = Puppet::ResourceApi::Transport.instance_variable_get(:@autoloader))
40+
autoloader.class.loaded.clear
41+
end
42+
end
43+
end

0 commit comments

Comments
 (0)