Skip to content

Commit 8e64a3d

Browse files
authored
Merge pull request #151 from da-ar/env_up
(FM-7690) Update transports cache to be grouped by environment
2 parents 4211c46 + 09fc856 commit 8e64a3d

File tree

2 files changed

+138
-18
lines changed

2 files changed

+138
-18
lines changed
Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
# rubocop:disable Style/Documentation
2-
module Puppet; end
3-
module Puppet::ResourceApi; end
4-
# rubocop:enable Style/Documentation
1+
module Puppet::ResourceApi; end # rubocop:disable Style/Documentation
52

63
# Remote target transport API
74
module Puppet::ResourceApi::Transport
@@ -12,19 +9,21 @@ def register(schema)
129
raise Puppet::DevError, 'requires `:connection_info`' unless schema.key? :connection_info
1310
raise Puppet::DevError, '`:connection_info` must be a hash, not `%{other_type}`' % { other_type: schema[:connection_info].class } unless schema[:connection_info].is_a?(Hash)
1411

15-
@transports ||= {}
16-
raise Puppet::DevError, 'Transport `%{name}` is already registered.' % { name: schema[:name] } unless @transports[schema[:name]].nil?
17-
@transports[schema[:name]] = Puppet::ResourceApi::TransportSchemaDef.new(schema)
12+
init_transports
13+
unless @transports[@environment][schema[:name]].nil?
14+
raise Puppet::DevError, 'Transport `%{name}` is already registered for `%{environment}`' % {
15+
name: schema[:name],
16+
environment: @environment,
17+
}
18+
end
19+
@transports[@environment][schema[:name]] = Puppet::ResourceApi::TransportSchemaDef.new(schema)
1820
end
1921
module_function :register # rubocop:disable Style/AccessModifierDeclarations
2022

2123
# retrieve a Hash of transport schemas, keyed by their name.
2224
def list
23-
if @transports
24-
Marshal.load(Marshal.dump(@transports))
25-
else
26-
{}
27-
end
25+
init_transports
26+
Marshal.load(Marshal.dump(@transports[@environment]))
2827
end
2928
module_function :list # rubocop:disable Style/AccessModifierDeclarations
3029

@@ -37,17 +36,36 @@ def connect(name, connection_info)
3736
module_function :connect # rubocop:disable Style/AccessModifierDeclarations
3837

3938
def self.validate(name, connection_info)
40-
@transports ||= {}
39+
init_transports
4140
require "puppet/transport/schema/#{name}" unless @transports.key? name
42-
transport_schema = @transports[name]
43-
raise Puppet::DevError, 'Transport for `%{target}` not registered' % { target: name } if transport_schema.nil?
41+
transport_schema = @transports[@environment][name]
42+
if transport_schema.nil?
43+
raise Puppet::DevError, 'Transport for `%{target}` not registered with `%{environment}`' % {
44+
target: name,
45+
environment: @environment,
46+
}
47+
end
4448

4549
transport_schema.check_schema(connection_info)
4650
transport_schema.validate(connection_info)
4751
end
52+
private_class_method :validate
4853

4954
def self.get_context(name)
5055
require 'puppet/resource_api/puppet_context'
51-
Puppet::ResourceApi::PuppetContext.new(@transports[name])
56+
Puppet::ResourceApi::PuppetContext.new(@transports[@environment][name])
57+
end
58+
private_class_method :get_context
59+
60+
def self.init_transports
61+
lookup = Puppet.lookup(:current_environment) if Puppet.respond_to? :lookup
62+
@environment = if lookup.nil?
63+
:transports_default
64+
else
65+
lookup.name
66+
end
67+
@transports ||= {}
68+
@transports[@environment] ||= {}
5269
end
70+
private_class_method :init_transports
5371
end

spec/puppet/resource_api/transport_spec.rb

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
require 'spec_helper'
22

33
RSpec.describe Puppet::ResourceApi::Transport do
4+
def change_environment(name = nil)
5+
environment = class_double(Puppet::Node::Environment)
6+
7+
if name.nil?
8+
allow(Puppet).to receive(:respond_to?).and_return(false)
9+
else
10+
allow(Puppet).to receive(:respond_to?).and_return(true)
11+
end
12+
13+
allow(Puppet).to receive(:lookup).with(:current_environment).and_return(environment)
14+
15+
# allow clean up scripts to run unhindered
16+
allow(Puppet).to receive(:lookup).with(:root_environment).and_call_original
17+
allow(Puppet).to receive(:lookup).with(:environments).and_call_original
18+
19+
allow(environment).to receive(:name).and_return(name)
20+
end
21+
422
let(:strict_level) { :error }
523

624
before(:each) do
@@ -60,10 +78,64 @@
6078
},
6179
}
6280
end
81+
let(:schema2) do
82+
{
83+
name: 'schema2',
84+
desc: 'basic transport',
85+
connection_info: {
86+
host: {
87+
type: 'String',
88+
desc: 'the host ip address or hostname',
89+
},
90+
},
91+
}
92+
end
93+
let(:schema3) do
94+
{
95+
name: 'schema3',
96+
desc: 'basic transport',
97+
connection_info: {
98+
user: {
99+
type: 'String',
100+
desc: 'the user to connect as',
101+
},
102+
password: {
103+
type: 'String',
104+
sensitive: true,
105+
desc: 'the password to make the connection',
106+
},
107+
},
108+
}
109+
end
63110

64111
it 'adds to the transports register' do
65112
expect { described_class.register(schema) }.not_to raise_error
66113
end
114+
115+
context 'when a transports are added to multiple environments' do
116+
it 'will record the schemas in the correct structure' do
117+
change_environment(:wibble)
118+
described_class.register(schema)
119+
expect(described_class.instance_variable_get(:@transports)).to be_key(:wibble)
120+
expect(described_class.instance_variable_get(:@transports)[:wibble][schema[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
121+
expect(described_class.instance_variable_get(:@transports)[:wibble][schema[:name]].definition).to eq(schema)
122+
123+
change_environment(:foo)
124+
described_class.register(schema)
125+
described_class.register(schema2)
126+
expect(described_class.instance_variable_get(:@transports)).to be_key(:foo)
127+
expect(described_class.instance_variable_get(:@transports)[:foo][schema[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
128+
expect(described_class.instance_variable_get(:@transports)[:foo][schema[:name]].definition).to eq(schema)
129+
expect(described_class.instance_variable_get(:@transports)[:foo][schema2[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
130+
expect(described_class.instance_variable_get(:@transports)[:foo][schema2[:name]].definition).to eq(schema2)
131+
132+
change_environment(:bar)
133+
described_class.register(schema3)
134+
expect(described_class.instance_variable_get(:@transports)).to be_key(:bar)
135+
expect(described_class.instance_variable_get(:@transports)[:bar][schema3[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
136+
expect(described_class.instance_variable_get(:@transports)[:bar][schema3[:name]].definition).to eq(schema3)
137+
end
138+
end
67139
end
68140

69141
context 'when registering a transport with a bad type' do
@@ -176,8 +248,15 @@
176248
end
177249

178250
describe '#validate(name, connection_info)', agent_test: true do
251+
context 'when the transport does not exist' do
252+
it { expect { described_class.send(:validate, 'wibble', {}) }.to raise_error LoadError, %r{(no such file to load|cannot load such file) -- puppet/transport/schema/wibble} }
253+
end
254+
179255
context 'when the transport being validated has not be registered' do
180-
it { expect { described_class.validate('wibble', {}) }.to raise_error LoadError, %r{(no such file to load|cannot load such file) -- puppet/transport/schema/wibble} }
256+
it 'will throw an unregistered error message' do
257+
expect(described_class).to receive(:require).with('puppet/transport/schema/wibble')
258+
expect { described_class.send(:validate, 'wibble', {}) }.to raise_error Puppet::DevError, %r{ not registered with }
259+
end
181260
end
182261

183262
context 'when the transport being validated has been registered' do
@@ -189,10 +268,33 @@
189268

190269
described_class.register(schema)
191270

271+
expect(described_class).to receive(:require).with('puppet/transport/schema/validate')
192272
expect(schema_def).to receive(:check_schema).with('connection_info').and_return(nil)
193273
expect(schema_def).to receive(:validate).with('connection_info').and_return(nil)
194274

195-
described_class.validate('validate', 'connection_info')
275+
described_class.send :validate, 'validate', 'connection_info'
276+
end
277+
end
278+
end
279+
280+
describe '#init_transports' do
281+
context 'when there is not a current_environment' do
282+
it 'will return the default transport environment name' do
283+
change_environment
284+
285+
described_class.send :init_transports
286+
287+
expect(described_class.instance_variable_get(:@environment)).to eq(:transports_default)
288+
end
289+
end
290+
291+
context 'when there is a current_environment' do
292+
it 'will return the set environment name' do
293+
change_environment(:something)
294+
295+
described_class.send :init_transports
296+
297+
expect(described_class.instance_variable_get(:@environment)).to eq(:something)
196298
end
197299
end
198300
end

0 commit comments

Comments
 (0)