clc-promote 0.9.8 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/clc-promote.gemspec +1 -0
- data/lib/promote.rb +2 -0
- data/lib/promote/environment_file.rb +6 -6
- data/lib/promote/node_shell.rb +17 -0
- data/lib/promote/node_shell/base_shell.rb +20 -0
- data/lib/promote/node_shell/ssh_shell.rb +40 -0
- data/lib/promote/node_shell/winrm_shell.rb +27 -0
- data/lib/promote/password_vault.rb +38 -0
- data/lib/promote/promoter.rb +53 -31
- data/lib/promote/rake_tasks.rb +9 -2
- data/lib/promote/version.rb +1 -1
- data/spec/unit/promote/cookbook_spec.rb +205 -79
- data/spec/unit/promote/environment_file_spec.rb +28 -0
- data/spec/unit/promote/node_shell/ssh_shell_spec.rb +39 -0
- data/spec/unit/promote/node_shell/winrm_shell_spec.rb +30 -0
- data/spec/unit/promote/node_shell_spec.rb +40 -0
- data/spec/unit/promote/password_vault_spec.rb +39 -0
- data/spec/unit/promote/promoter_spec.rb +152 -45
- data/spec/unit/promote/uploader_spec.rb +49 -33
- data/spec/unit/stubs/environments/env1.json +29 -0
- data/spec/unit/stubs/environments/env2.json +16 -0
- metadata +35 -2
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'promote'
|
2
|
+
|
3
|
+
describe Promote::EnvironmentFile do
|
4
|
+
let(:here) { File.expand_path('../../', __FILE__) }
|
5
|
+
let(:env_dir) { File.join(here, 'stubs', 'environments') }
|
6
|
+
let(:config) { Promote::Config.new(environment_directory: env_dir) }
|
7
|
+
|
8
|
+
subject { Promote::EnvironmentFile.new(environment, config) }
|
9
|
+
|
10
|
+
describe 'overrides' do
|
11
|
+
context 'there are overrides' do
|
12
|
+
let(:environment) { 'env1' }
|
13
|
+
|
14
|
+
it 'should return the override value' do
|
15
|
+
expect(subject.overrides['provisioner']['vault_bag']).to eq 'secrets_qa'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'there are no overrides' do
|
20
|
+
let(:environment) { 'env2' }
|
21
|
+
|
22
|
+
it 'should return an empty hash' do
|
23
|
+
expect(subject.overrides).to be_a(Hash)
|
24
|
+
expect(subject.overrides.keys.count).to be 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'promote'
|
2
|
+
|
3
|
+
describe Promote::NodeShell::SshShell do
|
4
|
+
let(:ip) { '1.1.1.1' }
|
5
|
+
let(:node) { double('node', ipaddress: ip) }
|
6
|
+
let(:connection) { double('connection', open_channel: nil, loop: nil) }
|
7
|
+
let(:password) { 'pass' }
|
8
|
+
let(:vault) { double('vault', root_password: password) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
allow(Promote::PasswordVault).to receive(:root_password)
|
12
|
+
.and_return(password)
|
13
|
+
end
|
14
|
+
|
15
|
+
subject { Promote::NodeShell::SshShell.new(node, vault) }
|
16
|
+
|
17
|
+
describe 'converge?' do
|
18
|
+
it 'converges the correct endpoint' do
|
19
|
+
expect(Net::SSH).to receive(:start).with(ip, anything, anything)
|
20
|
+
.and_return(connection)
|
21
|
+
subject.converge?
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'converges as root' do
|
25
|
+
expect(Net::SSH).to receive(:start).with(anything, 'root', anything)
|
26
|
+
.and_return(connection)
|
27
|
+
subject.converge?
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'converges with the correct password' do
|
31
|
+
expect(Net::SSH).to receive(:start).with(
|
32
|
+
anything,
|
33
|
+
anything,
|
34
|
+
password: password
|
35
|
+
).and_return(connection)
|
36
|
+
subject.converge?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'promote'
|
2
|
+
|
3
|
+
describe Promote::NodeShell::WinrmShell do
|
4
|
+
let(:ip) { '1.1.1.1' }
|
5
|
+
let(:endpoint) { "http://#{ip}:5985/wsman" }
|
6
|
+
let(:node) { double('node', ipaddress: ip) }
|
7
|
+
let(:connection) { double('connection', run_cmd: { exitcode: 0 }, loop: nil) }
|
8
|
+
let(:password) { 'pass' }
|
9
|
+
let(:vault) { double('vault', admin_password: password) }
|
10
|
+
|
11
|
+
before do
|
12
|
+
allow(Promote::PasswordVault).to receive(:root_password)
|
13
|
+
.and_return(password)
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { Promote::NodeShell::WinrmShell.new(node, vault) }
|
17
|
+
|
18
|
+
describe 'converge?' do
|
19
|
+
it 'converges with the correct authentication properties' do
|
20
|
+
expect(WinRM::WinRMWebService).to receive(:new).with(
|
21
|
+
endpoint,
|
22
|
+
:plaintext,
|
23
|
+
user: 'administrator',
|
24
|
+
pass: password,
|
25
|
+
basic_auth_only: true
|
26
|
+
).and_return(connection)
|
27
|
+
subject.converge?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'promote'
|
2
|
+
|
3
|
+
describe Promote::NodeShell do
|
4
|
+
let(:config) do
|
5
|
+
Promote::Config.new(
|
6
|
+
node_name: 'user',
|
7
|
+
cookbook_directory: '/cookbooks',
|
8
|
+
client_key: 'key',
|
9
|
+
chef_server_url: 'https://some.chef.server'
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { Promote::NodeShell }
|
14
|
+
|
15
|
+
describe 'for_node' do
|
16
|
+
let(:node) { double('node', platform_family: 'family') }
|
17
|
+
|
18
|
+
it 'adds the correct vault to the shell' do
|
19
|
+
expect(subject.for_node(node, config).vault.node).to be node
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'linux node' do
|
23
|
+
let(:node) { double('node', platform_family: 'ubuntu') }
|
24
|
+
|
25
|
+
it 'returns a SshShell' do
|
26
|
+
expect(subject.for_node(node, config)).to(
|
27
|
+
be_instance_of Promote::NodeShell::SshShell)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'windows node' do
|
32
|
+
let(:node) { double('node', platform_family: 'windows') }
|
33
|
+
|
34
|
+
it 'returns a SshShell' do
|
35
|
+
expect(subject.for_node(node, config)).to(
|
36
|
+
be_instance_of Promote::NodeShell::WinrmShell)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'promote'
|
2
|
+
|
3
|
+
describe Promote::PasswordVault do
|
4
|
+
let(:node) do
|
5
|
+
node = Chef::Node.new
|
6
|
+
node.name 'node'
|
7
|
+
node.override['provisioner']['vault_bag'] = bag
|
8
|
+
node.override['clc_library']['win_fqdn'] = domain_item
|
9
|
+
node
|
10
|
+
end
|
11
|
+
let(:bag) { 'secrets_qa' }
|
12
|
+
let(:domain_item) { 't3n' }
|
13
|
+
let(:config) { Promote::Config.new }
|
14
|
+
let(:vault) do
|
15
|
+
{
|
16
|
+
'local_admin_password' => 'Pass@word1',
|
17
|
+
'local_root_password' => 'Password1'
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
before do
|
22
|
+
allow(ChefVault::Item).to receive(:load)
|
23
|
+
.with(bag, "#{domain_item}_domain").and_return(vault)
|
24
|
+
end
|
25
|
+
|
26
|
+
subject { Promote::PasswordVault.new(node, config) }
|
27
|
+
|
28
|
+
describe 'root_password' do
|
29
|
+
it 'should return the correct password' do
|
30
|
+
expect(subject.root_password).to eq 'Password1'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'admin_password' do
|
35
|
+
it 'should return the correct password' do
|
36
|
+
expect(subject.admin_password).to eq 'Pass@word1'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -72,21 +72,27 @@ describe Promote::Promoter do
|
|
72
72
|
let(:good_node) do
|
73
73
|
node = Chef::Node.new
|
74
74
|
node.name 'good_node'
|
75
|
-
node.default['ohai_time'] = Time.now.to_i
|
75
|
+
node.default['ohai_time'] = Time.now.to_i - 1
|
76
76
|
node
|
77
77
|
end
|
78
78
|
let(:bad_node) do
|
79
79
|
node = Chef::Node.new
|
80
80
|
node.name 'bad_node'
|
81
|
-
node.default['ohai_time'] = Time.now.to_i -
|
81
|
+
node.default['ohai_time'] = Time.now.to_i - 1
|
82
82
|
node
|
83
83
|
end
|
84
|
+
let(:good_shell) { double('shell', converge?: true) }
|
85
|
+
let(:bad_shell) { double('shell', converge?: false) }
|
84
86
|
let(:uploader) { double('uploader') }
|
85
87
|
let(:ui) { nil }
|
86
88
|
|
87
89
|
before do
|
88
90
|
allow(Promote::NodeFinder).to receive(:new).and_return(finder_good)
|
89
91
|
allow(Promote::Uploader).to receive(:new).and_return(uploader)
|
92
|
+
allow(Promote::NodeShell).to receive(:for_node).with(good_node, config)
|
93
|
+
.and_return(good_shell)
|
94
|
+
allow(Promote::NodeShell).to receive(:for_node).with(bad_node, config)
|
95
|
+
.and_return(bad_shell)
|
90
96
|
end
|
91
97
|
|
92
98
|
context 'all environments succeed' do
|
@@ -98,9 +104,68 @@ describe Promote::Promoter do
|
|
98
104
|
subject.monitor_promotion(
|
99
105
|
'env1',
|
100
106
|
%w(env2 env3 env4),
|
107
|
+
3,
|
108
|
+
0.25,
|
109
|
+
false,
|
110
|
+
ui
|
111
|
+
)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'converge windows first' do
|
116
|
+
let(:finder_ubu) { double('ubu_finder', search: [bad_node]) }
|
117
|
+
let(:finder_win) { double('win_finder', search: [good_node]) }
|
118
|
+
|
119
|
+
before do
|
120
|
+
allow(Promote::NodeFinder).to(
|
121
|
+
receive(:new).with(
|
122
|
+
'chef_environment:env1 AND platform:ubuntu',
|
123
|
+
config
|
124
|
+
).and_return(finder_ubu)
|
125
|
+
)
|
126
|
+
allow(Promote::NodeFinder).to(
|
127
|
+
receive(:new).with(
|
128
|
+
'chef_environment:env1 AND platform:windows',
|
129
|
+
config
|
130
|
+
).and_return(finder_win)
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'promotes windows before ubuntu fails' do
|
135
|
+
expect(good_shell).to receive(:converge?)
|
136
|
+
expect do
|
137
|
+
subject.monitor_promotion(
|
138
|
+
'env1',
|
139
|
+
%w(env2 env3 env4),
|
140
|
+
0.25,
|
141
|
+
3,
|
142
|
+
false,
|
143
|
+
ui
|
144
|
+
)
|
145
|
+
end.to raise_error(/env1/)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'dont converge if already converged' do
|
150
|
+
let(:good_node) do
|
151
|
+
node = Chef::Node.new
|
152
|
+
node.name 'converged'
|
153
|
+
node.default['ohai_time'] = Time.now.to_i + 3600
|
154
|
+
node
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'does not converge' do
|
158
|
+
%w(env2 env3 env4).each do |env|
|
159
|
+
expect(subject).to receive(:promote_to).with('env1', env, ui)
|
160
|
+
expect(uploader).to receive(:upload_environment).with(env, ui)
|
161
|
+
end
|
162
|
+
expect(good_shell).not_to receive(:converge?)
|
163
|
+
subject.monitor_promotion(
|
164
|
+
'env1',
|
165
|
+
%w(env2 env3 env4),
|
166
|
+
3,
|
101
167
|
0.25,
|
102
168
|
false,
|
103
|
-
1,
|
104
169
|
ui
|
105
170
|
)
|
106
171
|
end
|
@@ -110,77 +175,119 @@ describe Promote::Promoter do
|
|
110
175
|
let(:self_node) do
|
111
176
|
node = Chef::Node.new
|
112
177
|
node.name config.node_name
|
113
|
-
node.default['ohai_time'] = Time.now.to_i -
|
178
|
+
node.default['ohai_time'] = Time.now.to_i - 1
|
114
179
|
node
|
115
180
|
end
|
116
|
-
let(:finder_good) { double('
|
117
|
-
|
181
|
+
let(:finder_good) { double('finder', search: [self_node, good_node]) }
|
182
|
+
let(:self_shell) { double('shell') }
|
183
|
+
|
184
|
+
before do
|
185
|
+
allow(Promote::NodeShell).to receive(:for_node).with(self_node, config)
|
186
|
+
.and_return(self_shell)
|
187
|
+
end
|
188
|
+
|
118
189
|
it 'promotes all nodes' do
|
119
190
|
%w(env2 env3 env4).each do |env|
|
120
191
|
expect(subject).to receive(:promote_to).with('env1', env, ui)
|
121
192
|
expect(uploader).to receive(:upload_environment).with(env, ui)
|
122
193
|
end
|
194
|
+
expect(self_shell).not_to receive(:converge?)
|
195
|
+
expect(good_shell).to receive(:converge?)
|
123
196
|
subject.monitor_promotion(
|
124
197
|
'env1',
|
125
198
|
%w(env2 env3 env4),
|
199
|
+
3,
|
126
200
|
0.25,
|
127
201
|
false,
|
128
|
-
1,
|
129
202
|
ui
|
130
203
|
)
|
131
204
|
end
|
132
205
|
end
|
133
206
|
|
134
|
-
context '
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
207
|
+
context 'ignore provisioner' do
|
208
|
+
let(:prov) do
|
209
|
+
node = Chef::Node.new
|
210
|
+
node.name 'BA1PROVISIONER01'
|
211
|
+
node.default['ohai_time'] = Time.now.to_i - 1
|
212
|
+
node
|
140
213
|
end
|
214
|
+
let(:finder_good) { double('finder', search: [prov, good_node]) }
|
215
|
+
let(:prov_shell) { double('shell') }
|
141
216
|
|
142
|
-
|
143
|
-
|
144
|
-
|
217
|
+
before do
|
218
|
+
allow(Promote::NodeShell).to receive(:for_node).with(prov, config)
|
219
|
+
.and_return(prov_shell)
|
220
|
+
end
|
145
221
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
222
|
+
it 'promotes all nodes' do
|
223
|
+
%w(env2 env3 env4).each do |env|
|
224
|
+
expect(subject).to receive(:promote_to).with('env1', env, ui)
|
225
|
+
expect(uploader).to receive(:upload_environment).with(env, ui)
|
226
|
+
end
|
227
|
+
expect(prov_shell).not_to receive(:converge?)
|
228
|
+
expect(good_shell).to receive(:converge?)
|
229
|
+
subject.monitor_promotion(
|
230
|
+
'env1',
|
231
|
+
%w(env2 env3 env4),
|
232
|
+
3,
|
233
|
+
0.25,
|
234
|
+
false,
|
235
|
+
ui
|
236
|
+
)
|
156
237
|
end
|
157
238
|
end
|
158
239
|
|
159
|
-
context '
|
240
|
+
context 'converge fails' do
|
160
241
|
before do
|
161
242
|
allow(Promote::NodeFinder).to(
|
162
|
-
receive(:new).with(
|
163
|
-
|
243
|
+
receive(:new).with(
|
244
|
+
"chef_environment:#{env} AND platform:ubuntu",
|
245
|
+
config
|
246
|
+
).and_return(finder_bad)
|
164
247
|
)
|
165
248
|
end
|
166
249
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
250
|
+
context 'source environment does not fully converge' do
|
251
|
+
let(:env) { 'env1' }
|
252
|
+
|
253
|
+
it 'promotes no nodes' do
|
254
|
+
expect(subject).not_to receive(:promote_to)
|
255
|
+
expect(uploader).not_to receive(:upload_environment)
|
256
|
+
|
257
|
+
expect do
|
258
|
+
subject.monitor_promotion(
|
259
|
+
'env1',
|
260
|
+
%w(env2 env3 env4),
|
261
|
+
3,
|
262
|
+
0.25,
|
263
|
+
false,
|
264
|
+
ui
|
265
|
+
)
|
266
|
+
end.to raise_error(/env1/)
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
context 'stops promotion when promotion fails' do
|
271
|
+
let(:env) { 'env3' }
|
272
|
+
|
273
|
+
it 'stops on failure' do
|
274
|
+
%w(env2 env3).each do |env|
|
275
|
+
expect(subject).to receive(:promote_to).with('env1', env, ui)
|
276
|
+
expect(uploader).to receive(:upload_environment).with(env, ui)
|
277
|
+
end
|
278
|
+
expect(subject).not_to receive(:promote_to).with('env1', 'env4', ui)
|
279
|
+
expect(uploader).not_to receive(:upload_environment).with('env4')
|
280
|
+
expect do
|
281
|
+
subject.monitor_promotion(
|
282
|
+
'env1',
|
283
|
+
%w(env2 env3 env4),
|
284
|
+
3,
|
285
|
+
0.25,
|
286
|
+
false,
|
287
|
+
ui
|
288
|
+
)
|
289
|
+
end.to raise_error(/env3/)
|
171
290
|
end
|
172
|
-
expect(subject).not_to receive(:promote_to).with('env1', 'env4', ui)
|
173
|
-
expect(uploader).not_to receive(:upload_environment).with('env4')
|
174
|
-
expect do
|
175
|
-
subject.monitor_promotion(
|
176
|
-
'env1',
|
177
|
-
%w(env2 env3 env4),
|
178
|
-
0.25,
|
179
|
-
false,
|
180
|
-
1,
|
181
|
-
ui
|
182
|
-
)
|
183
|
-
end.to raise_error(/env3$/)
|
184
291
|
end
|
185
292
|
end
|
186
293
|
end
|
@@ -187,8 +187,18 @@ describe Promote::Uploader do
|
|
187
187
|
let(:env_name) { 'my_test' }
|
188
188
|
|
189
189
|
it 'uploads the environment' do
|
190
|
-
expect(Chef::ChefFS::FileSystem).to receive(:copy_to).with(
|
191
|
-
|
190
|
+
expect(Chef::ChefFS::FileSystem).to receive(:copy_to).with(
|
191
|
+
an_instance_of(Chef::ChefFS::FilePattern),
|
192
|
+
anything,
|
193
|
+
anything,
|
194
|
+
anything,
|
195
|
+
anything,
|
196
|
+
anything,
|
197
|
+
anything
|
198
|
+
) do |arg|
|
199
|
+
expect(arg.pattern).to eq(
|
200
|
+
File.join('/environments', "#{env_name}.json")
|
201
|
+
)
|
192
202
|
end
|
193
203
|
subject.upload_environment(env_name)
|
194
204
|
end
|
@@ -196,19 +206,20 @@ describe Promote::Uploader do
|
|
196
206
|
|
197
207
|
context 'upload all environments' do
|
198
208
|
it 'uploads the environment' do
|
199
|
-
|
209
|
+
local = Chef::ChefFS::Config.new.local_fs.child_paths['environments']
|
200
210
|
|
201
211
|
expect(Chef::ChefFS::FileSystem).to receive(:copy_to).with(
|
202
212
|
an_instance_of(Chef::ChefFS::FilePattern),
|
203
|
-
an_instance_of(
|
204
|
-
|
205
|
-
anything
|
206
|
-
anything
|
207
|
-
anything
|
208
|
-
anything
|
213
|
+
an_instance_of(
|
214
|
+
Chef::ChefFS::FileSystem::ChefRepositoryFileSystemRootDir),
|
215
|
+
anything,
|
216
|
+
anything,
|
217
|
+
anything,
|
218
|
+
anything,
|
219
|
+
anything
|
209
220
|
) do |file_pattern, source|
|
210
221
|
expect(file_pattern.pattern).to eq(File.join('/environments/*.json'))
|
211
|
-
expect(source.child_paths['environments']).to eq(
|
222
|
+
expect(source.child_paths['environments']).to eq(local)
|
212
223
|
end
|
213
224
|
subject.upload_environments
|
214
225
|
end
|
@@ -219,13 +230,14 @@ describe Promote::Uploader do
|
|
219
230
|
local_roles = Chef::ChefFS::Config.new.local_fs.child_paths['roles']
|
220
231
|
|
221
232
|
expect(Chef::ChefFS::FileSystem).to receive(:copy_to).with(
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
233
|
+
an_instance_of(Chef::ChefFS::FilePattern),
|
234
|
+
an_instance_of(
|
235
|
+
Chef::ChefFS::FileSystem::ChefRepositoryFileSystemRootDir),
|
236
|
+
anything,
|
237
|
+
anything,
|
238
|
+
anything,
|
239
|
+
anything,
|
240
|
+
anything
|
229
241
|
) do |file_pattern, source|
|
230
242
|
expect(file_pattern.pattern).to eq(File.join('/roles/*.json'))
|
231
243
|
expect(source.child_paths['roles']).to eq(local_roles)
|
@@ -238,24 +250,27 @@ describe Promote::Uploader do
|
|
238
250
|
let(:temp_data_bags) { File.join(config.temp_directory, 'data_bags') }
|
239
251
|
let(:fake_bag_file) { File.join('bags', 'bag.json') }
|
240
252
|
let(:secret_key_file) { File.join('bags', 'bag_secrets_keys.json') }
|
241
|
-
let(:config)
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
253
|
+
let(:config) do
|
254
|
+
Promote::Config.new(
|
255
|
+
temp_directory: '/tmp/promote_tests',
|
256
|
+
repo_root: '/tmp/promote_repo',
|
257
|
+
node_name: 'user',
|
258
|
+
client_key: 'key',
|
259
|
+
chef_server_url: 'https://some.chef.server'
|
260
|
+
)
|
261
|
+
end
|
247
262
|
|
248
|
-
before
|
263
|
+
before do
|
249
264
|
fake_bag_path = File.join(config.data_bag_directory, fake_bag_file)
|
250
265
|
FileUtils.mkdir_p(File.dirname(fake_bag_path))
|
251
266
|
FileUtils.touch(fake_bag_path)
|
252
267
|
FileUtils.touch(File.join(config.data_bag_directory, secret_key_file))
|
253
|
-
|
268
|
+
end
|
254
269
|
|
255
|
-
after
|
270
|
+
after do
|
256
271
|
FileUtils.rm_rf(config.temp_directory)
|
257
272
|
FileUtils.rm_rf(config.repo_root)
|
258
|
-
|
273
|
+
end
|
259
274
|
|
260
275
|
it 'copies the data_bags to a temp folder' do
|
261
276
|
subject.upload_data_bags
|
@@ -272,12 +287,13 @@ describe Promote::Uploader do
|
|
272
287
|
it 'uploads the data_bags to chef' do
|
273
288
|
expect(Chef::ChefFS::FileSystem).to receive(:copy_to).with(
|
274
289
|
an_instance_of(Chef::ChefFS::FilePattern),
|
275
|
-
an_instance_of(
|
276
|
-
|
277
|
-
anything
|
278
|
-
anything
|
279
|
-
anything
|
280
|
-
anything
|
290
|
+
an_instance_of(
|
291
|
+
Chef::ChefFS::FileSystem::ChefRepositoryFileSystemRootDir),
|
292
|
+
anything,
|
293
|
+
anything,
|
294
|
+
anything,
|
295
|
+
anything,
|
296
|
+
anything
|
281
297
|
) do |file_pattern, source|
|
282
298
|
expect(file_pattern.pattern).to eq('/data_bags/**/*.json')
|
283
299
|
expect(source.child_paths['data_bags']).to eq([temp_data_bags])
|