Skip to content

Commit 68b38be

Browse files
committed
(SERVER-2470) Draft implementation for list_all_transports
To test out, run `rake spec_prep` and use the following setup in pry: ``` require 'puppet' require 'puppet/resource_api/transport' require 'puppet/settings' Puppet.initialize_settings Puppet[:modulepath] = 'spec/fixtures/modules' # env = Puppet.lookup(:environments).get!('production') # files = Puppet::Util::Autoload.files_to_load('puppet/transport/schema', env) Puppet::ResourceApi::Transport.list_all_transports('production') ```
1 parent e99ce3f commit 68b38be

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
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: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe 'Resource API Transport integration tests:' do
4+
after(:each) do
5+
# reset registered transports between tests to reduce cross-test poisoning
6+
Puppet::ResourceApi::Transport.instance_variable_set(:@transports, nil)
7+
end
8+
9+
describe '#list_all_transports' do
10+
subject(:transports) { Puppet::ResourceApi::Transport.list_all_transports('production') }
11+
12+
it 'loads all transports' do
13+
expect(transports).to have_key 'test_device'
14+
expect(transports).to have_key 'test_device_sensitive'
15+
expect(transports['test_device']).to be_a Puppet::ResourceApi::TransportSchemaDef
16+
expect(transports['test_device'].definition).to include(name: 'test_device')
17+
end
18+
19+
it 'can be called twice' do
20+
expect {
21+
Puppet::ResourceApi::Transport.list_all_transports('production')
22+
Puppet::ResourceApi::Transport.list_all_transports('production')
23+
}.not_to raise_error
24+
end
25+
end
26+
end

spec/spec_helper.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@
4646
# override legacy default from puppetlabs_spec_helper
4747
config.mock_with :rspec
4848

49+
config.before(:suite) do
50+
# set a modulepath to the fixtures directory
51+
Puppet[:modulepath] = File.join(Dir.pwd, 'spec', 'fixtures', 'modules')
52+
end
53+
4954
# reset the warning suppression count
5055
config.before(:each) do
5156
Puppet::ResourceApi.warning_count = 0

0 commit comments

Comments
 (0)