clc-promote 0.9.8 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 494d4bd4962be5a954cba47372bec17606c31fef
4
- data.tar.gz: 285a68574d0d47a08f4e1b36fb63fd96d8b1fd6d
3
+ metadata.gz: 375087f3ef3e0a22501b5fec3bb66fe4790269ea
4
+ data.tar.gz: 8df292375cfc83442f7b52c430a4e80c297fa8ef
5
5
  SHA512:
6
- metadata.gz: 71932622b907a51e3471bc8588a3460edcbf2ea326aabbda6c2fff9a2ba94f03bff1288ae4f480d87573164231890f0050368fc36ce9d6cac8bb33a646e30f8a
7
- data.tar.gz: 459d09edec7786f8d6f0c457407899f6ecbe4e9e61ad20383c7451ebb24a9755783c1623771fb912a436255a5485495b42de840e1f96506beb42cb60ff6b2a54
6
+ metadata.gz: a770c6d74a6a9b9df514990eb0b455182c6f9b32469ac947e2d207e78a7a8da93856b92dee3192bb1c0f888b7a88fd74cdb38016958b001d53f5b396c2075f90
7
+ data.tar.gz: 750dabb13120d715c5db7c12a8528e903097f3002987468d2f1daacfbc1d16e857b0379197d67041cb611e6528ea5f20109a1514e5931de63379107ed1adb5dd
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.add_runtime_dependency 'clc-git', '~> 1.2', '>= 1.2.8'
20
20
  s.add_runtime_dependency 'berkshelf', '~> 3.2', '>= 3.2.3'
21
21
  s.add_runtime_dependency 'highline', '~> 1.6', '>= 1.6.21'
22
+ s.add_runtime_dependency 'chef-vault'
22
23
 
23
24
  s.add_development_dependency 'rspec', '~> 3.0', '>= 3.0.0'
24
25
  s.add_development_dependency 'rake', '~> 10.3', '>= 10.3.2'
@@ -4,6 +4,8 @@ require 'promote/cookbook'
4
4
  require 'promote/environment_file'
5
5
  require 'promote/git_repo'
6
6
  require 'promote/node_finder'
7
+ require 'promote/node_shell'
8
+ require 'promote/password_vault'
7
9
  require 'promote/promoter'
8
10
  require 'promote/uploader'
9
11
  require 'promote/utils'
@@ -13,8 +13,12 @@ module Promote
13
13
  File.join(@config.environment_directory, "#{name}.json")
14
14
  end
15
15
 
16
+ def overrides
17
+ content['override_attributes'] || {}
18
+ end
19
+
16
20
  def cookbook_versions
17
- content.has_key?('cookbook_versions') ? content['cookbook_versions'] : {}
21
+ content['cookbook_versions'] || {}
18
22
  end
19
23
 
20
24
  def write_cookbook_versions(versions)
@@ -28,11 +32,7 @@ module Promote
28
32
  private
29
33
 
30
34
  def content
31
- @content ||= get_environment_content
32
- end
33
-
34
- def get_environment_content
35
- JSON.parse(File.read(file_path))
35
+ @content ||= JSON.parse(File.read(file_path))
36
36
  end
37
37
  end
38
38
  end
@@ -0,0 +1,17 @@
1
+ require 'promote/node_shell/base_shell'
2
+ require 'promote/node_shell/ssh_shell'
3
+ require 'promote/node_shell/winrm_shell'
4
+
5
+ module Promote
6
+ module NodeShell
7
+ def self.for_node(node, config)
8
+ vault = PasswordVault.new(node, config)
9
+ case node.platform_family
10
+ when 'windows'
11
+ WinrmShell.new(node, vault)
12
+ else
13
+ SshShell.new(node, vault)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ module Promote
2
+ module NodeShell
3
+ class BaseShell
4
+ def initialize(node, vault)
5
+ @node = node
6
+ @vault = vault
7
+ end
8
+
9
+ attr_accessor :vault
10
+ attr_accessor :node
11
+
12
+ def converge?(ui = nil)
13
+ execute('chef-client', ui) == 0
14
+ end
15
+
16
+ def execute(command, ui = nil)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,40 @@
1
+ module Promote
2
+ module NodeShell
3
+ class SshShell < BaseShell
4
+ def session
5
+ @session ||= Net::SSH.start(
6
+ node.ipaddress,
7
+ 'root',
8
+ password: vault.root_password
9
+ )
10
+ end
11
+
12
+ def execute(command, ui = nil)
13
+ exit_code = nil
14
+ out = []
15
+ session.open_channel do |channel|
16
+
17
+ channel.request_pty
18
+ channel.exec(command) do |_ch, _success|
19
+
20
+ channel.on_data do |_ch, data|
21
+ ui.info(data) if ui
22
+ out << data
23
+ end
24
+
25
+ channel.on_extended_data do |_ch, _type, data|
26
+ ui.info(data) if ui
27
+ out << data
28
+ end
29
+
30
+ channel.on_request("exit-status") do |_ch, data|
31
+ exit_code = data.read_long
32
+ end
33
+ end
34
+ end
35
+ session.loop
36
+ exit_code
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,27 @@
1
+ require 'winrm'
2
+
3
+ module Promote
4
+ module NodeShell
5
+ class WinrmShell < BaseShell
6
+ def session
7
+ @session ||= begin
8
+ ::WinRM::WinRMWebService.new(
9
+ "http://#{node.ipaddress}:5985/wsman",
10
+ :plaintext,
11
+ user: 'administrator',
12
+ pass: vault.admin_password,
13
+ basic_auth_only: true
14
+ )
15
+ end
16
+ end
17
+
18
+ def execute(command, ui = nil)
19
+ response = session.run_cmd(command) do |stdout, stderr|
20
+ ui.info(stdout) if stdout && ui
21
+ ui.error(stderr) if stderr && ui
22
+ end
23
+ response[:exitcode]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ require 'chef-vault'
2
+
3
+ module Promote
4
+ class PasswordVault
5
+
6
+ include ChefServer
7
+
8
+ def initialize(node, config)
9
+ @node = node
10
+ @config = config
11
+ end
12
+
13
+ attr_accessor :config
14
+ attr_accessor :node
15
+
16
+ def root_password
17
+ raw['local_root_password']
18
+ end
19
+
20
+ def admin_password
21
+ raw['local_admin_password']
22
+ end
23
+
24
+ def raw
25
+ @raw ||= load_secrets
26
+ end
27
+
28
+ private
29
+
30
+ def load_secrets
31
+ bag = node['provisioner']['vault_bag']
32
+ item = "#{node['clc_library']['win_fqdn']}_domain"
33
+ with_chef_server(config) do
34
+ return ChefVault::Item.load(bag, item)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -23,19 +23,30 @@ module Promote
23
23
  dest.write_cookbook_versions(source.cookbook_versions)
24
24
  end
25
25
 
26
- def monitor_promotion(source_environment, destination_environments, probe_interval, force = false, max_wait = 3600, ui = nil)
26
+ def monitor_promotion(source_environment, destination_environments, number_to_test, converge_interval, force = false, ui = nil)
27
27
  ui.info "Waiting for #{source_environment} to finish" if ui
28
- check_promotion(source_environment, probe_interval, max_wait, ui)
28
+ check_promotion(source_environment, converge_interval, ui)
29
29
 
30
- uploader = Uploader.new(config)
30
+ test_environments = destination_environments[0, number_to_test]
31
+ final_environments = []
32
+ if destination_environments.count > number_to_test
33
+ final_environments = destination_environments[number_to_test..-1]
34
+ end
31
35
 
32
- destination_environments.each do |env|
33
- ui.confirm "Promote #{source_environment} to #{env}" if ui && !force
34
- promote_to(source_environment, env, ui)
35
- uploader.upload_environment(env, ui)
36
+ test_environments.each do |env|
37
+ promote_and_upload(source_environment, env, force, ui)
38
+ check_promotion(env, converge_interval, ui)
39
+ end
36
40
 
37
- check_promotion(env, probe_interval, max_wait, ui)
41
+ final_environments.each do |env|
42
+ promote_and_upload(source_environment, env, force, ui)
38
43
  end
44
+ start = Time.now.to_i
45
+ final_environments.each do |env|
46
+ check_promotion(env, converge_interval, ui, start)
47
+ end
48
+
49
+ ui.info 'This promotion is complete' if ui
39
50
  end
40
51
 
41
52
  def stage_promotion(promote_environment, destination_config, ui)
@@ -86,6 +97,21 @@ module Promote
86
97
 
87
98
  private
88
99
 
100
+ def promote_and_upload(source, target, force, ui)
101
+ msg = "Promoting #{source} to #{target}..."
102
+ if ui
103
+ if force
104
+ ui.info msg
105
+ else
106
+ ui.confirm msg
107
+ end
108
+ end
109
+
110
+ uploader = Uploader.new(config)
111
+ promote_to(source, target, ui)
112
+ uploader.upload_environment(target, ui)
113
+ end
114
+
89
115
  def download_files(local_root, path, cookbook_version = nil)
90
116
  with_chef_server(config) do
91
117
  fs_config = Chef::ChefFS::Config.new(Chef::Config, cwd = Dir.pwd, {:cookbook_version => cookbook_version})
@@ -102,32 +128,28 @@ module Promote
102
128
  end
103
129
  end
104
130
 
105
- def check_promotion(environment_to_check, probe_interval, max_wait, ui)
106
- start = Time.now.to_i
107
- finder = NodeFinder.new("chef_environment:#{environment_to_check}", config)
108
- unconverged = nil
109
- converged = []
110
- until Time.now.to_i - start > max_wait
111
- result = finder.search
112
- unconverged = []
113
- result.each do |node|
131
+ def check_promotion(environment_to_check, converge_interval, ui, start = Time.now.to_i)
132
+ vault = PasswordVault.new(environment_to_check, config)
133
+ query = "chef_environment:#{environment_to_check}"
134
+
135
+ %w(windows ubuntu).each do |platform|
136
+ nodes = NodeFinder.new("#{query} AND platform:#{platform}", config).search
137
+
138
+ nodes.each do |node|
114
139
  next if node.name == config.node_name
115
- if node['ohai_time'].to_i < start
116
- unconverged << node
117
- elsif converged.grep(/#{node.name}/).empty?
118
- converged << node.name
119
- ui.info "#{node.name} has converged" if ui
140
+ next if node.name.include?('PROVISIONER')
141
+
142
+ fresh_node = NodeFinder.new("name:#{node.name}", config).search.first
143
+ if fresh_node['ohai_time'].to_i > start
144
+ ui.info "#{node.name} already converged" if ui
145
+ else
146
+ ui.info "converging #{node.name}" if ui
147
+ unless NodeShell.for_node(node, config).converge?(ui)
148
+ raise "Stopping promotion in #{environment_to_check}! Node (#{node.name}) failed to converge."
149
+ end
150
+ sleep converge_interval
120
151
  end
121
152
  end
122
- break if unconverged.count == 0
123
-
124
- ui.stdout.print "." if ui
125
-
126
- sleep probe_interval
127
- end
128
-
129
- if unconverged.count > 0
130
- raise "Stopping promotion! Nodes (#{unconverged}) are not converging in #{environment_to_check}"
131
153
  end
132
154
  end
133
155
  end
@@ -109,10 +109,17 @@ module Promote
109
109
  def define_promote_environments
110
110
  namespace "Promote" do
111
111
  desc "Promote a list of environments from another"
112
- task "promote_environments", :source_environment, :destination_environments, :force do |task, args|
112
+ task "promote_environments", :source_environment, :destination_environments, :number_to_test, :force do |task, args|
113
113
  puts "Promoting constraints in #{args.source_environment} to #{args.destination_environments}"
114
114
  ui = Chef::Knife::UI.new(STDOUT, STDERR, STDIN, {})
115
- @promoter.monitor_promotion(args.source_environment, args.destination_environments.split(' '), 5, args.force, 3600, ui)
115
+ @promoter.monitor_promotion(
116
+ args.source_environment,
117
+ args.destination_environments.split(' '),
118
+ args.number_to_test,
119
+ 5,
120
+ args.force,
121
+ ui
122
+ )
116
123
  end
117
124
  end
118
125
  end
@@ -1,3 +1,3 @@
1
1
  module Promote
2
- VERSION = '0.9.8'
2
+ VERSION = '0.10.0'
3
3
  end
@@ -1,30 +1,43 @@
1
1
  require 'promote'
2
2
 
3
- describe Promote::Cookbook do
4
- let(:cookbook_dir) {'/tmp/promote_test_cookbooks/stubs'}
5
- let(:config) { Promote::Config.new({
6
- :cookbook_directory => cookbook_dir})
7
- }
8
- let(:fake_berks) { double('berksfile', :list => nil, :install => nil, :update => nil) }
9
-
10
- before(:all) {
3
+ describe Promote::Cookbook do
4
+ let(:cookbook_dir) { '/tmp/promote_test_cookbooks/stubs' }
5
+ let(:config) { Promote::Config.new(cookbook_directory: cookbook_dir) }
6
+ let(:fake_berks) { double('berksfile', list: nil, install: nil, update: nil) }
7
+
8
+ before(:all) do
11
9
  cb_dir = '/tmp/promote_test_cookbooks'
12
10
  FileUtils.rm_rf(cb_dir) if Dir.exist?(cb_dir)
13
11
  Dir.mkdir(cb_dir)
14
- FileUtils.cp_r(File.join(File.dirname(File.dirname(__FILE__)), 'stubs'), cb_dir)
15
- }
12
+ FileUtils.cp_r(
13
+ File.join(File.dirname(File.dirname(__FILE__)), 'stubs'), cb_dir)
14
+ end
16
15
 
17
16
  subject { Promote::Cookbook.new('cookbook_1', config) }
18
17
 
19
18
  describe 'dependencies' do
20
- before {
19
+ before do
21
20
  allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
22
- allow(fake_berks).to receive(:list).and_return([
23
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
24
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
25
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
26
- ])
27
- }
21
+ allow(fake_berks).to receive(:list).and_return(
22
+ [
23
+ double(
24
+ 'Dependency',
25
+ name: 'cookbook_2',
26
+ locked_version: Semverse::Version.new('1.1.1')
27
+ ),
28
+ double(
29
+ 'Dependency',
30
+ name: 'cookbook_3',
31
+ locked_version: Semverse::Version.new('2.2.2')
32
+ ),
33
+ double(
34
+ 'Dependency',
35
+ name: 'cookbook_4',
36
+ locked_version: Semverse::Version.new('3.3.3')
37
+ )
38
+ ]
39
+ )
40
+ end
28
41
 
29
42
  it 'returns dependencies from lockfile' do
30
43
  expect(subject.dependencies.keys.count).to be 3
@@ -35,7 +48,6 @@ describe Promote::Cookbook do
35
48
  end
36
49
 
37
50
  describe 'metadata_dependencies' do
38
-
39
51
  it 'returns dependencies from metadata.rb' do
40
52
  expect(subject.metadata_dependencies.keys.count).to be 1
41
53
  expect(subject.metadata_dependencies['cookbook_2'].to_s).to eq '= 1.1.1'
@@ -43,21 +55,20 @@ describe Promote::Cookbook do
43
55
  end
44
56
 
45
57
  describe 'path' do
46
-
47
58
  it 'returns the correct path of the cookbook' do
48
59
  expect(subject.path).to eq(File.join(cookbook_dir, 'cookbook_1'))
49
60
  end
50
61
  end
51
62
 
52
63
  describe 'version' do
53
-
54
64
  it 'reads the current version' do
55
65
  expect(subject.version.to_s).to eq('1.0.0')
56
66
  end
57
67
 
58
68
  it 'writes changed version to metadata.rb' do
59
69
  subject.version = Semverse::Version.new('2.2.2')
60
- expect(Promote::Cookbook.new('cookbook_1', config).version.to_s).to eq '2.2.2'
70
+ expect(
71
+ Promote::Cookbook.new('cookbook_1', config).version.to_s).to eq '2.2.2'
61
72
  end
62
73
 
63
74
  it 'returns the new version after a version has changed' do
@@ -80,10 +91,10 @@ describe Promote::Cookbook do
80
91
  end
81
92
 
82
93
  describe 'sync_berksfile' do
83
- before {
94
+ before do
84
95
  allow(File).to receive(:exist?).with(/Berksfile$/).and_return(true)
85
96
  allow(File).to receive(:exist?).with(/Berksfile.lock/).and_return(true)
86
- }
97
+ end
87
98
 
88
99
  it 'Installs berks dependencies' do
89
100
  dummy = double('berksfile')
@@ -104,9 +115,9 @@ describe Promote::Cookbook do
104
115
  end
105
116
 
106
117
  context 'update berksfile with no lock file' do
107
- before {
118
+ before do
108
119
  allow(File).to receive(:exist?).with(/Berksfile.lock/).and_return(false)
109
- }
120
+ end
110
121
 
111
122
  it 'Installs berks dependencies instead of update' do
112
123
  dummy = double('berksfile')
@@ -120,15 +131,27 @@ describe Promote::Cookbook do
120
131
  end
121
132
 
122
133
  describe 'dependencies_changed_after_update?' do
123
- before {
134
+ before do
124
135
  allow(File).to receive(:exist?).and_return(true)
125
136
  allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
126
137
  allow(fake_berks).to receive(:list).and_return([
127
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
128
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
129
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
130
- ])
131
- }
138
+ double(
139
+ 'Dependency',
140
+ name: 'cookbook_2',
141
+ locked_version: Semverse::Version.new('1.1.1')
142
+ ),
143
+ double(
144
+ 'Dependency',
145
+ name: 'cookbook_3',
146
+ locked_version: Semverse::Version.new('2.2.2')
147
+ ),
148
+ double(
149
+ 'Dependency',
150
+ name: 'cookbook_4',
151
+ locked_version: Semverse::Version.new('3.3.3')
152
+ )
153
+ ])
154
+ end
132
155
 
133
156
  it 'performs a berks update' do
134
157
  expect(fake_berks).to receive(:update)
@@ -136,21 +159,44 @@ describe Promote::Cookbook do
136
159
  end
137
160
 
138
161
  context 'there is no change' do
139
-
140
- before {
162
+ before do
141
163
  allow(fake_berks).to receive(:list).and_return(
142
164
  [
143
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
144
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
145
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
165
+ double(
166
+ 'Dependency',
167
+ name: 'cookbook_2',
168
+ locked_version: Semverse::Version.new('1.1.1')
169
+ ),
170
+ double(
171
+ 'Dependency',
172
+ name: 'cookbook_3',
173
+ locked_version: Semverse::Version.new('2.2.2')
174
+ ),
175
+ double(
176
+ 'Dependency',
177
+ name: 'cookbook_4',
178
+ locked_version: Semverse::Version.new('3.3.3')
179
+ )
146
180
  ],
147
181
  [
148
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
149
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
150
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
182
+ double(
183
+ 'Dependency',
184
+ name: 'cookbook_2',
185
+ locked_version: Semverse::Version.new('1.1.1')
186
+ ),
187
+ double(
188
+ 'Dependency',
189
+ name: 'cookbook_3',
190
+ locked_version: Semverse::Version.new('2.2.2')
191
+ ),
192
+ double(
193
+ 'Dependency',
194
+ name: 'cookbook_4',
195
+ locked_version: Semverse::Version.new('3.3.3')
196
+ )
151
197
  ]
152
198
  )
153
- }
199
+ end
154
200
 
155
201
  it 'returns false' do
156
202
  expect(subject.dependencies_changed_after_update?).to be false
@@ -158,22 +204,44 @@ describe Promote::Cookbook do
158
204
  end
159
205
 
160
206
  context 'there is a version change' do
161
-
162
- before {
163
- allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
207
+ before do
164
208
  allow(fake_berks).to receive(:list).and_return(
165
209
  [
166
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
167
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
168
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
210
+ double(
211
+ 'Dependency',
212
+ name: 'cookbook_2',
213
+ locked_version: Semverse::Version.new('1.1.1')
214
+ ),
215
+ double(
216
+ 'Dependency',
217
+ name: 'cookbook_3',
218
+ locked_version: Semverse::Version.new('2.2.2')
219
+ ),
220
+ double(
221
+ 'Dependency',
222
+ name: 'cookbook_4',
223
+ locked_version: Semverse::Version.new('3.3.3')
224
+ )
169
225
  ],
170
226
  [
171
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
172
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.3')),
173
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
227
+ double(
228
+ 'Dependency',
229
+ name: 'cookbook_2',
230
+ locked_version: Semverse::Version.new('1.1.1')
231
+ ),
232
+ double(
233
+ 'Dependency',
234
+ name: 'cookbook_3',
235
+ locked_version: Semverse::Version.new('2.2.3')
236
+ ),
237
+ double(
238
+ 'Dependency',
239
+ name: 'cookbook_4',
240
+ locked_version: Semverse::Version.new('3.3.3')
241
+ )
174
242
  ]
175
243
  )
176
- }
244
+ end
177
245
 
178
246
  it 'returns true' do
179
247
  expect(subject.dependencies_changed_after_update?).to be true
@@ -181,21 +249,39 @@ describe Promote::Cookbook do
181
249
  end
182
250
 
183
251
  context 'a dependency is removed' do
184
-
185
- before {
186
- allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
252
+ before do
187
253
  allow(fake_berks).to receive(:list).and_return(
188
254
  [
189
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
190
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
191
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
255
+ double(
256
+ 'Dependency',
257
+ name: 'cookbook_2',
258
+ locked_version: Semverse::Version.new('1.1.1')
259
+ ),
260
+ double(
261
+ 'Dependency',
262
+ name: 'cookbook_3',
263
+ locked_version: Semverse::Version.new('2.2.2')
264
+ ),
265
+ double(
266
+ 'Dependency',
267
+ name: 'cookbook_4',
268
+ locked_version: Semverse::Version.new('3.3.3')
269
+ )
192
270
  ],
193
271
  [
194
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
195
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
272
+ double(
273
+ 'Dependency',
274
+ name: 'cookbook_2',
275
+ locked_version: Semverse::Version.new('1.1.1')
276
+ ),
277
+ double(
278
+ 'Dependency',
279
+ name: 'cookbook_4',
280
+ locked_version: Semverse::Version.new('3.3.3')
281
+ )
196
282
  ]
197
283
  )
198
- }
284
+ end
199
285
 
200
286
  it 'returns true' do
201
287
  expect(subject.dependencies_changed_after_update?).to be true
@@ -203,23 +289,49 @@ describe Promote::Cookbook do
203
289
  end
204
290
 
205
291
  context 'a dependency is added' do
206
-
207
- before {
208
- allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
292
+ before do
209
293
  allow(fake_berks).to receive(:list).and_return(
210
294
  [
211
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
212
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
213
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3'))
295
+ double(
296
+ 'Dependency',
297
+ name: 'cookbook_2',
298
+ locked_version: Semverse::Version.new('1.1.1')
299
+ ),
300
+ double(
301
+ 'Dependency',
302
+ name: 'cookbook_3',
303
+ locked_version: Semverse::Version.new('2.2.2')
304
+ ),
305
+ double(
306
+ 'Dependency',
307
+ name: 'cookbook_4',
308
+ locked_version: Semverse::Version.new('3.3.3')
309
+ )
214
310
  ],
215
311
  [
216
- double('Dependency', :name => 'cookbook_2', :locked_version => Semverse::Version.new('1.1.1')),
217
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
218
- double('Dependency', :name => 'cookbook_4', :locked_version => Semverse::Version.new('3.3.3')),
219
- double('Dependency', :name => 'cookbook_5', :locked_version => Semverse::Version.new('3.3.3'))
312
+ double(
313
+ 'Dependency',
314
+ name: 'cookbook_2',
315
+ locked_version: Semverse::Version.new('1.1.1')
316
+ ),
317
+ double(
318
+ 'Dependency',
319
+ name: 'cookbook_3',
320
+ locked_version: Semverse::Version.new('2.2.2')
321
+ ),
322
+ double(
323
+ 'Dependency',
324
+ name: 'cookbook_4',
325
+ locked_version: Semverse::Version.new('3.3.3')
326
+ ),
327
+ double(
328
+ 'Dependency',
329
+ name: 'cookbook_5',
330
+ locked_version: Semverse::Version.new('3.3.3')
331
+ )
220
332
  ]
221
333
  )
222
- }
334
+ end
223
335
 
224
336
  it 'returns true' do
225
337
  expect(subject.dependencies_changed_after_update?).to be true
@@ -227,24 +339,38 @@ describe Promote::Cookbook do
227
339
  end
228
340
 
229
341
  context 'the cookbook under test has changed' do
230
-
231
- before {
232
- allow(Berkshelf::Berksfile).to receive(:from_file).and_return(fake_berks)
342
+ before do
233
343
  allow(fake_berks).to receive(:list).and_return(
234
344
  [
235
- double('Dependency', :name => 'cookbook_1', :locked_version => Semverse::Version.new('1.1.1')),
236
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
345
+ double(
346
+ 'Dependency',
347
+ name: 'cookbook_1',
348
+ locked_version: Semverse::Version.new('1.1.1')
349
+ ),
350
+ double(
351
+ 'Dependency',
352
+ name: 'cookbook_3',
353
+ locked_version: Semverse::Version.new('2.2.2')
354
+ )
237
355
  ],
238
356
  [
239
- double('Dependency', :name => 'cookbook_1', :locked_version => Semverse::Version.new('1.1.2')),
240
- double('Dependency', :name => 'cookbook_3', :locked_version => Semverse::Version.new('2.2.2')),
357
+ double(
358
+ 'Dependency',
359
+ name: 'cookbook_1',
360
+ locked_version: Semverse::Version.new('1.1.2')
361
+ ),
362
+ double(
363
+ 'Dependency',
364
+ name: 'cookbook_3',
365
+ locked_version: Semverse::Version.new('2.2.2')
366
+ )
241
367
  ]
242
368
  )
243
- }
369
+ end
244
370
 
245
371
  it 'returns false' do
246
372
  expect(subject.dependencies_changed_after_update?).to be false
247
373
  end
248
374
  end
249
375
  end
250
- end
376
+ end