Skip to content

Commit 930bad6

Browse files
committed
(BOLT-994) Task helper for remote resources
1 parent 8c6f045 commit 930bad6

File tree

9 files changed

+158
-75
lines changed

9 files changed

+158
-75
lines changed

lib/puppet/util/task_helper.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
require 'puppet'
2+
require 'json'
3+
4+
# Sets up the transport for a remote task
5+
class Puppet::Util::TaskHelper
6+
def initialize(transport_name)
7+
@transport_name = transport_name
8+
9+
return unless params.key? '_installdir'
10+
add_plugin_paths(params['_installdir'])
11+
end
12+
13+
def transport
14+
require 'puppet/resource_api/transport'
15+
16+
Puppet::ResourceApi::Transport.connect(@transport_name, credentials)
17+
end
18+
19+
def params
20+
@params ||= JSON.parse(ENV['PARAMS'] || STDIN.read)
21+
end
22+
23+
def target
24+
@target ||= params['_target']
25+
end
26+
27+
def credentials
28+
@credentials ||= target.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
29+
end
30+
31+
private
32+
33+
# Syncs across anything from the module lib
34+
def add_plugin_paths(install_dir)
35+
Dir.glob(File.join([install_dir, '*'])).each do |mod|
36+
$LOAD_PATH << File.join([mod, 'lib'])
37+
end
38+
end
39+
end
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
require 'json'
2+
require 'puppet/util/task_helper'
3+
require 'puppet/resource_api/transport'
4+
5+
RSpec.describe Puppet::Util::TaskHelper do
6+
7+
let(:helper) { described_class.new('panos') }
8+
let(:params) { {} }
9+
10+
before(:each) do
11+
allow(STDIN).to receive(:read).and_return(JSON.generate(params))
12+
end
13+
14+
it 'does not throw' do
15+
expect{helper}.not_to raise_error
16+
end
17+
18+
context 'when `_installdir` is present' do
19+
let(:params) do
20+
{
21+
'_installdir': '.'
22+
}
23+
end
24+
it 'does not throw' do
25+
expect{helper}.not_to raise_error
26+
end
27+
end
28+
29+
describe '#transport' do
30+
let(:creds) do
31+
{
32+
host: '1.2.3.4',
33+
user: 'admin',
34+
password: 'admin'
35+
}
36+
end
37+
let(:params) do
38+
{
39+
'_target': creds
40+
}
41+
end
42+
43+
it 'returns a transport object' do
44+
expect(Puppet::ResourceApi::Transport).to receive(:connect).with('panos', creds)
45+
helper.transport
46+
end
47+
end
48+
49+
describe '#params' do
50+
context 'when params are provided through STDIN' do
51+
let(:params) do
52+
{
53+
'foo': 'wibble'
54+
}
55+
end
56+
it { expect(helper.params).to eq({"foo"=>"wibble"}) }
57+
end
58+
context 'when params are provided through ENV' do
59+
let(:env) { '{"wibble": "foo"}' }
60+
61+
it {
62+
allow(ENV).to receive(:[]).with('PARAMS').and_return(env)
63+
expect(helper.params).to eq({"wibble"=>"foo"})
64+
}
65+
end
66+
end
67+
68+
describe '#target' do
69+
let(:creds) do
70+
{
71+
host: '1.2.3.4',
72+
user: 'admin',
73+
password: 'admin'
74+
}
75+
end
76+
let(:params) do
77+
{
78+
'_target': creds
79+
}
80+
end
81+
it 'returns the creds with string keys' do
82+
expect(helper.target).to eq({
83+
"host"=>"1.2.3.4",
84+
"password"=>"admin",
85+
"user"=>"admin"})
86+
end
87+
end
88+
89+
describe '#credentials' do
90+
let(:creds) do
91+
{
92+
host: '1.2.3.4',
93+
user: 'admin',
94+
password: 'admin'
95+
}
96+
end
97+
let(:params) do
98+
{
99+
'_target': creds
100+
}
101+
end
102+
it 'returns the creds with symbolised keys' do
103+
expect(helper.credentials).to eq({
104+
:host=>"1.2.3.4",
105+
:password=>"admin",
106+
:user=>"admin"})
107+
end
108+
end
109+
110+
end

tasks/apikey.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"parameters": {
77
},
88
"files": [
9-
"panos/tasks/panos_task.rb",
9+
"panos/lib/puppet/util/task_helper.rb",
1010
"panos/lib/puppet/transport/panos.rb",
1111
"panos/lib/puppet/transport/schema/panos.rb"
1212
]

tasks/apikey.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/opt/puppetlabs/puppet/bin/ruby
22

3-
require_relative 'panos_task'
4-
task = PanosTask.new
3+
require_relative '../lib/puppet/util/task_helper'
4+
task = Puppet::Util::TaskHelper.new('panos')
55

66
puts JSON.generate(apikey: task.transport.apikey)

tasks/commit.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"parameters": {
77
},
88
"files": [
9-
"panos/tasks/panos_task.rb",
9+
"panos/lib/puppet/util/task_helper.rb",
1010
"panos/lib/puppet/transport/panos.rb",
1111
"panos/lib/puppet/transport/schema/panos.rb"
1212
]

tasks/commit.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/opt/puppetlabs/puppet/bin/ruby
22

3-
require_relative 'panos_task'
4-
task = PanosTask.new
3+
require_relative '../lib/puppet/util/task_helper'
4+
task = Puppet::Util::TaskHelper.new('panos')
55

66
if task.transport.outstanding_changes?
77
task.transport.commit

tasks/panos_task.rb

Lines changed: 0 additions & 66 deletions
This file was deleted.

tasks/set_config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
}
1515
},
1616
"files": [
17-
"panos/tasks/panos_task.rb",
17+
"panos/lib/puppet/util/task_helper.rb",
1818
"panos/lib/puppet/transport/panos.rb",
1919
"panos/lib/puppet/transport/schema/panos.rb"
2020
]

tasks/set_config.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/opt/puppetlabs/puppet/bin/ruby
22

3-
require_relative 'panos_task'
4-
task = PanosTask.new
3+
require_relative '../lib/puppet/util/task_helper'
4+
task = Puppet::Util::TaskHelper.new('panos')
55

66
file = task.params['config_file']
77
transport.import(file, 'configuration')

0 commit comments

Comments
 (0)