Skip to content

Commit 42a393e

Browse files
committed
(maint) make environment lookup more robust
By removing the `@environment` cache and calling `Puppet.lookup` every time `current_environment` is requested, this change makes it obvious that we never use an out of date cached value.
1 parent 7180586 commit 42a393e

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

lib/puppet/resource_api/transport.rb

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,20 @@ def register(schema)
1010
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)
1111

1212
init_transports
13-
unless @transports[@environment][schema[:name]].nil?
13+
unless @transports[current_environment][schema[:name]].nil?
1414
raise Puppet::DevError, 'Transport `%{name}` is already registered for `%{environment}`' % {
1515
name: schema[:name],
16-
environment: @environment,
16+
environment: current_environment,
1717
}
1818
end
19-
@transports[@environment][schema[:name]] = Puppet::ResourceApi::TransportSchemaDef.new(schema)
19+
@transports[current_environment][schema[:name]] = Puppet::ResourceApi::TransportSchemaDef.new(schema)
2020
end
2121
module_function :register # rubocop:disable Style/AccessModifierDeclarations
2222

2323
# retrieve a Hash of transport schemas, keyed by their name.
2424
def list
2525
init_transports
26-
Marshal.load(Marshal.dump(@transports[@environment]))
26+
Marshal.load(Marshal.dump(@transports[current_environment]))
2727
end
2828
module_function :list # rubocop:disable Style/AccessModifierDeclarations
2929

@@ -48,12 +48,12 @@ def inject_device(name, transport)
4848

4949
def self.validate(name, connection_info)
5050
init_transports
51-
require "puppet/transport/schema/#{name}" unless @transports[@environment].key? name
52-
transport_schema = @transports[@environment][name]
51+
require "puppet/transport/schema/#{name}" unless @transports[current_environment].key? name
52+
transport_schema = @transports[current_environment][name]
5353
if transport_schema.nil?
5454
raise Puppet::DevError, 'Transport for `%{target}` not registered with `%{environment}`' % {
5555
target: name,
56-
environment: @environment,
56+
environment: current_environment,
5757
}
5858
end
5959
message_prefix = 'The connection info provided does not match the Transport Schema'
@@ -64,24 +64,18 @@ def self.validate(name, connection_info)
6464

6565
def self.get_context(name)
6666
require 'puppet/resource_api/puppet_context'
67-
Puppet::ResourceApi::PuppetContext.new(@transports[@environment][name])
67+
Puppet::ResourceApi::PuppetContext.new(@transports[current_environment][name])
6868
end
6969
private_class_method :get_context
7070

7171
def self.init_transports
72-
lookup = Puppet.lookup(:current_environment) if Puppet.respond_to? :lookup
73-
@environment = if lookup.nil?
74-
:transports_default
75-
else
76-
lookup.name
77-
end
7872
@transports ||= {}
79-
@transports[@environment] ||= {}
73+
@transports[current_environment] ||= {}
8074
end
8175
private_class_method :init_transports
8276

8377
def self.wrap_sensitive(name, connection_info)
84-
transport_schema = @transports[@environment][name]
78+
transport_schema = @transports[current_environment][name]
8579
if transport_schema
8680
transport_schema.definition[:connection_info].each do |attr_name, options|
8781
if options.key?(:sensitive) && (options[:sensitive] == true) && connection_info.key?(attr_name)
@@ -92,4 +86,14 @@ def self.wrap_sensitive(name, connection_info)
9286
connection_info
9387
end
9488
private_class_method :wrap_sensitive
89+
90+
def self.current_environment
91+
if Puppet.respond_to? :lookup
92+
env = Puppet.lookup(:current_environment)
93+
env.nil? ? :transports_default : env.name
94+
else
95+
:transports_default
96+
end
97+
end
98+
private_class_method :current_environment
9599
end

spec/puppet/resource_api/transport_spec.rb

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,29 @@ def change_environment(name = nil)
113113
end
114114

115115
context 'when a transports are added to multiple environments' do
116+
let(:transports) { described_class.instance_variable_get(:@transports) }
117+
116118
it 'will record the schemas in the correct structure' do
117-
change_environment(:wibble)
119+
change_environment(nil)
118120
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)
121+
expect(transports).to have_key(:transports_default)
122+
expect(transports[:transports_default][schema[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
123+
expect(transports[:transports_default][schema[:name]].definition).to eq(schema)
122124

123-
change_environment(:foo)
125+
change_environment('foo')
124126
described_class.register(schema)
125127
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)
128+
expect(transports).to have_key('foo')
129+
expect(transports['foo'][schema[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
130+
expect(transports['foo'][schema[:name]].definition).to eq(schema)
131+
expect(transports['foo'][schema2[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
132+
expect(transports['foo'][schema2[:name]].definition).to eq(schema2)
131133

132134
change_environment(:bar)
133135
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)
136+
expect(transports).to have_key(:bar)
137+
expect(transports[:bar][schema3[:name]]).to be_a_kind_of(Puppet::ResourceApi::TransportSchemaDef)
138+
expect(transports[:bar][schema3[:name]].definition).to eq(schema3)
137139
end
138140
end
139141
end

0 commit comments

Comments
 (0)