knife-server 1.1.0 → 1.2.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +1 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +3 -0
  5. data/.travis.yml +12 -8
  6. data/CHANGELOG.md +32 -1
  7. data/Gemfile +9 -4
  8. data/Guardfile +28 -0
  9. data/README.md +28 -5
  10. data/Rakefile +31 -10
  11. data/knife-server.gemspec +18 -8
  12. data/lib/chef/knife/bootstrap/_omnibus.sh +63 -10
  13. data/lib/chef/knife/bootstrap/chef10/rhel.erb +2 -0
  14. data/lib/chef/knife/bootstrap/chef11/omnibus.erb +4 -1
  15. data/lib/chef/knife/bootstrap/chef11/rhel.erb +2 -0
  16. data/lib/chef/knife/server_backup.rb +24 -10
  17. data/lib/chef/knife/server_bootstrap_base.rb +68 -23
  18. data/lib/chef/knife/server_bootstrap_ec2.rb +33 -20
  19. data/lib/chef/knife/server_bootstrap_linode.rb +20 -13
  20. data/lib/chef/knife/server_bootstrap_openstack.rb +128 -0
  21. data/lib/chef/knife/server_bootstrap_standalone.rb +28 -16
  22. data/lib/chef/knife/server_restore.rb +23 -9
  23. data/lib/knife-server.rb +1 -0
  24. data/lib/knife/server/credentials.rb +78 -42
  25. data/lib/knife/server/ec2_security_group.rb +24 -21
  26. data/lib/knife/server/ssh.rb +54 -18
  27. data/lib/knife/server/version.rb +2 -1
  28. data/spec/chef/knife/server_backup_spec.rb +58 -44
  29. data/spec/chef/knife/server_bootstrap_ec2_spec.rb +108 -80
  30. data/spec/chef/knife/server_bootstrap_linode_spec.rb +93 -64
  31. data/spec/chef/knife/server_bootstrap_openstack_spec.rb +305 -0
  32. data/spec/chef/knife/server_bootstrap_standalone_spec.rb +113 -76
  33. data/spec/chef/knife/server_restore_spec.rb +38 -37
  34. data/spec/knife/server/credientials_spec.rb +248 -51
  35. data/spec/knife/server/ec2_security_group_spec.rb +76 -68
  36. data/spec/knife/server/ssh_spec.rb +138 -22
  37. metadata +107 -31
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  #
2
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
4
  # Copyright:: Copyright (c) 2012 Fletcher Nichol
@@ -16,10 +17,10 @@
16
17
  # limitations under the License.
17
18
  #
18
19
 
19
- require 'chef/knife/server_bootstrap_ec2'
20
- require 'chef/knife/ssh'
21
- require 'fakefs/spec_helpers'
22
- require 'net/ssh'
20
+ require "chef/knife/server_bootstrap_ec2"
21
+ require "chef/knife/ssh"
22
+ require "fakefs/spec_helpers"
23
+ require "net/ssh"
23
24
  Chef::Knife::ServerBootstrapEc2.load_deps
24
25
 
25
26
  describe Chef::Knife::ServerBootstrapEc2 do
@@ -29,15 +30,15 @@ describe Chef::Knife::ServerBootstrapEc2 do
29
30
  Chef::Log.logger = Logger.new(StringIO.new)
30
31
  @knife = Chef::Knife::ServerBootstrapEc2.new
31
32
  @stdout = StringIO.new
32
- @knife.ui.stub!(:stdout).and_return(@stdout)
33
+ allow(@knife.ui).to receive(:stdout).and_return(@stdout)
33
34
  @stderr = StringIO.new
34
- @knife.ui.stub!(:stderr).and_return(@stderr)
35
+ allow(@knife.ui).to receive(:stderr).and_return(@stderr)
35
36
  @knife.config[:chef_node_name] = "yakky"
36
37
  @knife.config[:platform] = "omnibus"
37
38
  @knife.config[:ssh_user] = "root"
38
39
  end
39
40
 
40
- let(:connection) { mock(Fog::Compute::AWS) }
41
+ let(:connection) { double(Fog::Compute::AWS) }
41
42
 
42
43
  describe "#ec2_bootstrap" do
43
44
  before do
@@ -45,94 +46,100 @@ describe Chef::Knife::ServerBootstrapEc2 do
45
46
  @knife.config[:ssh_user] = "jdoe"
46
47
  @knife.config[:ssh_port] = "2222"
47
48
  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
48
- @knife.config[:security_groups] = %w{x y z}
49
- @knife.config[:tags] = %w{tag1=val1 tag2=val2}
49
+ @knife.config[:security_groups] = %w[x y z]
50
+ @knife.config[:tags] = %w[tag1=val1 tag2=val2]
50
51
  @knife.config[:distro] = "distro-praha"
51
52
  @knife.config[:ebs_size] = "42"
52
53
  @knife.config[:webui_password] = "daweb"
53
54
  @knife.config[:amqp_password] = "queueitup"
54
55
 
55
- ENV['_SPEC_WEBUI_PASSWORD'] = ENV['WEBUI_PASSWORD']
56
- ENV['_SPEC_AMQP_PASSWORD'] = ENV['AMQP_PASSWORD']
56
+ ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
57
+ ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
57
58
  end
58
59
 
59
60
  after do
60
- ENV['WEBUI_PASSWORD'] = ENV.delete('_SPEC_WEBUI_PASSWORD')
61
- ENV['AMQP_PASSWORD'] = ENV.delete('_SPEC_AMQP_PASSWORD')
61
+ ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
62
+ ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
62
63
  end
63
64
 
64
65
  let(:bootstrap) { @knife.ec2_bootstrap }
65
66
 
66
67
  it "returns an Ec2ServerCreate instance" do
67
- bootstrap.should be_a(Chef::Knife::Ec2ServerCreate)
68
+ expect(bootstrap).to be_a(Chef::Knife::Ec2ServerCreate)
68
69
  end
69
70
 
70
71
  it "configs the bootstrap's chef_node_name" do
71
- bootstrap.config[:chef_node_name].should eq("shave.yak")
72
+ expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
72
73
  end
73
74
 
74
75
  it "configs the bootstrap's ssh_user" do
75
- bootstrap.config[:ssh_user].should eq("jdoe")
76
+ expect(bootstrap.config[:ssh_user]).to eq("jdoe")
76
77
  end
77
78
 
78
79
  it "configs the bootstrap's ssh_port" do
79
- bootstrap.config[:ssh_port].should eq("2222")
80
+ expect(bootstrap.config[:ssh_port]).to eq("2222")
80
81
  end
81
82
 
82
83
  it "configs the bootstrap's identity_file" do
83
- bootstrap.config[:identity_file].should eq("~/.ssh/mykey_dsa")
84
+ expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
84
85
  end
85
86
 
86
87
  it "configs the bootstrap's security_groups" do
87
- bootstrap.config[:security_groups].should eq(["x", "y", "z"])
88
+ expect(bootstrap.config[:security_groups]).to eq(%w[x y z])
88
89
  end
89
90
 
90
91
  it "configs the bootstrap's ebs_size" do
91
- bootstrap.config[:ebs_size].should eq("42")
92
+ expect(bootstrap.config[:ebs_size]).to eq("42")
92
93
  end
93
94
 
94
95
  it "configs the bootstrap's tags" do
95
- bootstrap.config[:tags].should include("tag1=val1")
96
- bootstrap.config[:tags].should include("tag2=val2")
96
+ expect(bootstrap.config[:tags]).to include("tag1=val1")
97
+ expect(bootstrap.config[:tags]).to include("tag2=val2")
97
98
  end
98
99
 
99
100
  it "adds Role=chef_server to the bootstrap's tags" do
100
- bootstrap.config[:tags].should include("Role=chef_server")
101
+ expect(bootstrap.config[:tags]).to include("Role=chef_server")
101
102
  end
102
103
 
103
104
  it "configs the bootstrap's distro" do
104
- bootstrap.config[:distro].should eq("distro-praha")
105
+ expect(bootstrap.config[:distro]).to eq("distro-praha")
105
106
  end
106
107
 
107
108
  it "configs the bootstrap's distro to chef11/omnibus by default" do
108
109
  @knife.config.delete(:distro)
109
110
 
110
- bootstrap.config[:distro].should eq("chef11/omnibus")
111
+ expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
111
112
  end
112
113
 
113
114
  it "configs the bootstrap's distro value driven off platform value" do
114
115
  @knife.config.delete(:distro)
115
116
  @knife.config[:platform] = "freebsd"
116
117
 
117
- bootstrap.config[:distro].should eq("chef11/freebsd")
118
+ expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
118
119
  end
119
120
 
120
- it "configs the bootstrap's distro based on bootstrap_version and platform" do
121
+ it "configs the distro based on bootstrap_version and platform" do
121
122
  @knife.config.delete(:distro)
122
123
  @knife.config[:platform] = "freebsd"
123
124
  @knife.config[:bootstrap_version] = "10"
124
125
 
125
- bootstrap.config[:distro].should eq("chef10/freebsd")
126
+ expect(bootstrap.config[:distro]).to eq("chef10/freebsd")
126
127
  end
127
128
 
128
129
  it "configs the bootstrap's ENV with the webui password" do
129
130
  bootstrap
130
- ENV['WEBUI_PASSWORD'].should eq("daweb")
131
+
132
+ expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
131
133
  end
132
134
 
133
135
  it "configs the bootstrap's ENV with the amqp password" do
134
136
  bootstrap
135
- ENV['AMQP_PASSWORD'].should eq("queueitup")
137
+
138
+ expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
139
+ end
140
+
141
+ it "skips config values with nil defaults" do
142
+ expect(bootstrap.config[:bootstrap_version]).to be_nil
136
143
  end
137
144
  end
138
145
 
@@ -156,12 +163,12 @@ describe Chef::Knife::ServerBootstrapEc2 do
156
163
  end
157
164
 
158
165
  it "constructs a connection" do
159
- Fog::Compute.should_receive(:new).with({
160
- :provider => 'AWS',
161
- :aws_access_key_id => 'key',
162
- :aws_secret_access_key => 'secret',
163
- :region => 'hell-south-666'
164
- })
166
+ expect(Fog::Compute).to receive(:new).with(
167
+ :provider => "AWS",
168
+ :aws_access_key_id => "key",
169
+ :aws_secret_access_key => "secret",
170
+ :region => "hell-south-666"
171
+ )
165
172
 
166
173
  @knife.ec2_connection
167
174
  end
@@ -169,37 +176,41 @@ describe Chef::Knife::ServerBootstrapEc2 do
169
176
 
170
177
  describe "#server_dns_name" do
171
178
  before do
172
- @knife.config[:chef_node_name] = 'shavemy.yak'
173
- @knife.stub(:ec2_connection) { connection }
179
+ @knife.config[:chef_node_name] = "shavemy.yak"
180
+ allow(@knife).to receive(:ec2_connection) { connection }
174
181
  end
175
182
 
176
183
  context "when server is found" do
177
184
  before do
178
- connection.stub(:servers) { [server] }
185
+ expect(connection).to receive(:servers) { [server] }
179
186
  end
180
187
 
181
188
  let(:server) do
182
- stub(:dns_name => 'blahblah.aws.compute.com', :state => "running",
183
- :tags => {'Name' => 'shavemy.yak', 'Role' => 'chef_server'})
189
+ double(
190
+ :dns_name => "blahblah.aws.compute.com",
191
+ :state => "running",
192
+ :tags => { "Name" => "shavemy.yak", "Role" => "chef_server" }
193
+ )
184
194
  end
185
195
 
186
196
  it "returns the provisioned dns name" do
187
- @knife.server_dns_name.should eq('blahblah.aws.compute.com')
197
+ expect(@knife.server_dns_name).to eq("blahblah.aws.compute.com")
188
198
  end
189
199
 
190
200
  it "ignores terminated instances" do
191
- server.stub(:state) { "terminated" }
192
- @knife.server_dns_name.should be_nil
201
+ allow(server).to receive(:state) { "terminated" }
202
+
203
+ expect(@knife.server_dns_name).to be_nil
193
204
  end
194
205
  end
195
206
 
196
207
  context "when server is not found" do
197
208
  before do
198
- connection.stub(:servers) { [] }
209
+ allow(connection).to receive(:servers) { [] }
199
210
  end
200
211
 
201
212
  it "returns nil" do
202
- @knife.server_dns_name.should be_nil
213
+ expect(@knife.server_dns_name).to be_nil
203
214
  end
204
215
  end
205
216
  end
@@ -217,15 +228,15 @@ describe Chef::Knife::ServerBootstrapEc2 do
217
228
  @knife.config[:validation_key] = "/var/tmp/validation.pem"
218
229
  @knife.config[:ssh_port] = "2345"
219
230
  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
220
- @knife.stub(:ec2_connection) { connection }
221
- @knife.stub(:server_dns_name) { "grapes.wrath" }
222
- Chef::Knife::Ec2ServerCreate.stub(:new) { bootstrap }
223
- Knife::Server::Ec2SecurityGroup.stub(:new) { security_group }
224
- Knife::Server::SSH.stub(:new) { ssh }
225
- Knife::Server::Credentials.stub(:new) { credentials }
226
- security_group.stub(:configure_chef_server_group)
227
- credentials.stub(:install_validation_key)
228
- credentials.stub(:create_root_client)
231
+ allow(@knife).to receive(:ec2_connection) { connection }
232
+ allow(@knife).to receive(:server_dns_name) { "grapes.wrath" }
233
+ allow(Chef::Knife::Ec2ServerCreate).to receive(:new) { bootstrap }
234
+ allow(Knife::Server::Ec2SecurityGroup).to receive(:new) { security_group }
235
+ allow(Knife::Server::SSH).to receive(:new) { ssh }
236
+ allow(Knife::Server::Credentials).to receive(:new) { credentials }
237
+ allow(security_group).to receive(:configure_chef_server_group)
238
+ allow(credentials).to receive(:install_validation_key)
239
+ allow(credentials).to receive(:create_root_client)
229
240
  end
230
241
 
231
242
  after do
@@ -234,66 +245,83 @@ describe Chef::Knife::ServerBootstrapEc2 do
234
245
  end
235
246
  end
236
247
 
237
- let(:bootstrap) { stub(:run => true, :config => Hash.new) }
238
- let(:security_group) { stub }
239
- let(:ssh) { stub }
240
- let(:credentials) { stub.as_null_object }
248
+ let(:bootstrap) { double(:run => true, :config => Hash.new) }
249
+ let(:security_group) { double }
250
+ let(:ssh) { double }
251
+ let(:credentials) { double.as_null_object }
252
+
253
+ it "exits if Chef::Config[:node_name] is missing" do
254
+ Chef::Config[:node_name] = nil
255
+
256
+ expect { @knife.run }.to raise_error SystemExit
257
+ end
258
+
259
+ it "exits if Chef::Config[:client_key] is missing" do
260
+ Chef::Config[:client_key] = nil
261
+
262
+ expect { @knife.run }.to raise_error SystemExit
263
+ end
241
264
 
242
265
  it "exits if node_name option is missing" do
243
- def @knife.exit(code) ; end
266
+ def @knife.exit(_); end
244
267
  @knife.config.delete(:chef_node_name)
245
268
 
246
- @knife.should_receive(:exit)
269
+ expect(@knife).to receive(:exit)
247
270
  @knife.run
248
271
  end
249
272
 
250
273
  it "configures the ec2 security group" do
251
- Knife::Server::Ec2SecurityGroup.should_receive(:new).
274
+ expect(Knife::Server::Ec2SecurityGroup).to receive(:new).
252
275
  with(connection, @knife.ui)
253
- security_group.should_receive(:configure_chef_server_group).
254
- with('mygroup', :description => 'mygroup group')
276
+ expect(security_group).to receive(:configure_chef_server_group).
277
+ with("mygroup", :description => "mygroup group")
255
278
 
256
279
  @knife.run
257
280
  end
258
281
 
259
282
  it "bootstraps an ec2 server" do
260
- bootstrap.should_receive(:run)
283
+ expect(bootstrap).to receive(:run)
284
+
261
285
  @knife.run
262
286
  end
263
287
 
264
288
  it "installs a new validation.pem key from the chef 10 server" do
265
289
  @knife.config[:bootstrap_version] = "10"
266
- Knife::Server::SSH.should_receive(:new).with({
267
- :host => "grapes.wrath", :user => "root",
268
- :port => "2345", :keys => ["~/.ssh/mykey_dsa"]
269
- })
270
- Knife::Server::Credentials.should_receive(:new).
290
+ expect(Knife::Server::SSH).to receive(:new).with(
291
+ :host => "grapes.wrath",
292
+ :user => "root",
293
+ :port => "2345",
294
+ :keys => ["~/.ssh/mykey_dsa"]
295
+ )
296
+ expect(Knife::Server::Credentials).to receive(:new).
271
297
  with(ssh, "/etc/chef/validation.pem", {})
272
- credentials.should_receive(:install_validation_key)
298
+ expect(credentials).to receive(:install_validation_key)
273
299
 
274
300
  @knife.run
275
301
  end
276
302
 
277
303
  it "installs a new validation.pem key from the omnibus server" do
278
- Knife::Server::SSH.should_receive(:new).with({
279
- :host => "grapes.wrath", :user => "root",
280
- :port => "2345", :keys => ["~/.ssh/mykey_dsa"]
281
- })
282
- Knife::Server::Credentials.should_receive(:new).
283
- with(ssh, "/etc/chef/validation.pem", {:omnibus => true})
284
- credentials.should_receive(:install_validation_key)
304
+ expect(Knife::Server::SSH).to receive(:new).with(
305
+ :host => "grapes.wrath",
306
+ :user => "root",
307
+ :port => "2345",
308
+ :keys => ["~/.ssh/mykey_dsa"]
309
+ )
310
+ expect(Knife::Server::Credentials).to receive(:new).
311
+ with(ssh, "/etc/chef/validation.pem", :omnibus => true)
312
+ expect(credentials).to receive(:install_validation_key)
285
313
 
286
314
  @knife.run
287
315
  end
288
316
 
289
317
  it "create a root client key" do
290
- credentials.should_receive(:create_root_client)
318
+ expect(credentials).to receive(:create_root_client)
291
319
 
292
320
  @knife.run
293
321
  end
294
322
 
295
323
  it "installs a client key" do
296
- credentials.should_receive(:install_client_key).
324
+ expect(credentials).to receive(:install_client_key).
297
325
  with("smithers", "/var/tmp/myclientkey.pem")
298
326
 
299
327
  @knife.run
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  #
2
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
4
  # Copyright:: Copyright (c) 2013 Fletcher Nichol
@@ -16,10 +17,10 @@
16
17
  # limitations under the License.
17
18
  #
18
19
 
19
- require 'chef/knife/server_bootstrap_linode'
20
- require 'chef/knife/ssh'
21
- require 'fakefs/spec_helpers'
22
- require 'net/ssh'
20
+ require "chef/knife/server_bootstrap_linode"
21
+ require "chef/knife/ssh"
22
+ require "fakefs/spec_helpers"
23
+ require "net/ssh"
23
24
  Chef::Knife::ServerBootstrapLinode.load_deps
24
25
 
25
26
  describe Chef::Knife::ServerBootstrapLinode do
@@ -29,15 +30,15 @@ describe Chef::Knife::ServerBootstrapLinode do
29
30
  Chef::Log.logger = Logger.new(StringIO.new)
30
31
  @knife = Chef::Knife::ServerBootstrapLinode.new
31
32
  @stdout = StringIO.new
32
- @knife.ui.stub!(:stdout).and_return(@stdout)
33
+ allow(@knife.ui).to receive(:stdout).and_return(@stdout)
33
34
  @stderr = StringIO.new
34
- @knife.ui.stub!(:stderr).and_return(@stderr)
35
+ allow(@knife.ui).to receive(:stderr).and_return(@stderr)
35
36
  @knife.config[:chef_node_name] = "yakky"
36
37
  @knife.config[:platform] = "omnibus"
37
38
  @knife.config[:ssh_user] = "root"
38
39
  end
39
40
 
40
- let(:connection) { mock(Fog::Compute::AWS) }
41
+ let(:connection) { double(Fog::Compute::AWS) }
41
42
 
42
43
  describe "#linode_bootstrap" do
43
44
 
@@ -50,70 +51,76 @@ describe Chef::Knife::ServerBootstrapLinode do
50
51
  @knife.config[:webui_password] = "daweb"
51
52
  @knife.config[:amqp_password] = "queueitup"
52
53
 
53
- ENV['_SPEC_WEBUI_PASSWORD'] = ENV['WEBUI_PASSWORD']
54
- ENV['_SPEC_AMQP_PASSWORD'] = ENV['AMQP_PASSWORD']
54
+ ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
55
+ ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
55
56
  end
56
57
 
57
58
  after do
58
- ENV['WEBUI_PASSWORD'] = ENV.delete('_SPEC_WEBUI_PASSWORD')
59
- ENV['AMQP_PASSWORD'] = ENV.delete('_SPEC_AMQP_PASSWORD')
59
+ ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
60
+ ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
60
61
  end
61
62
 
62
63
  let(:bootstrap) { @knife.linode_bootstrap }
63
64
 
64
65
  it "returns a LinodeServerCreate instance" do
65
- bootstrap.should be_a(Chef::Knife::LinodeServerCreate)
66
+ expect(bootstrap).to be_a(Chef::Knife::LinodeServerCreate)
66
67
  end
67
68
 
68
69
  it "configs the bootstrap's chef_node_name" do
69
- bootstrap.config[:chef_node_name].should eq("shave.yak")
70
+ expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
70
71
  end
71
72
 
72
73
  it "configs the bootstrap's ssh_user" do
73
- bootstrap.config[:ssh_user].should eq("jdoe")
74
+ expect(bootstrap.config[:ssh_user]).to eq("jdoe")
74
75
  end
75
76
 
76
77
  it "configs the bootstrap's identity_file" do
77
- bootstrap.config[:identity_file].should eq("~/.ssh/mykey_dsa")
78
+ expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
78
79
  end
79
80
 
80
81
  it "configs the bootstrap's linode_api_key" do
81
- bootstrap.config[:linode_api_key].should eq("linode123")
82
+ expect(bootstrap.config[:linode_api_key]).to eq("linode123")
82
83
  end
83
84
 
84
85
  it "configs the bootstrap's distro" do
85
- bootstrap.config[:distro].should eq("distro-praha")
86
+ expect(bootstrap.config[:distro]).to eq("distro-praha")
86
87
  end
87
88
 
88
89
  it "configs the bootstrap's distro to chef11/omnibus by default" do
89
90
  @knife.config.delete(:distro)
90
91
 
91
- bootstrap.config[:distro].should eq("chef11/omnibus")
92
+ expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
92
93
  end
93
94
 
94
95
  it "configs the bootstrap's distro value driven off platform value" do
95
96
  @knife.config.delete(:distro)
96
97
  @knife.config[:platform] = "freebsd"
97
98
 
98
- bootstrap.config[:distro].should eq("chef11/freebsd")
99
+ expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
99
100
  end
100
101
 
101
- it "configs the bootstrap's distro based on bootstrap_version and platform" do
102
+ it "configs the distro based on bootstrap_version and platform" do
102
103
  @knife.config.delete(:distro)
103
104
  @knife.config[:platform] = "freebsd"
104
105
  @knife.config[:bootstrap_version] = "10"
105
106
 
106
- bootstrap.config[:distro].should eq("chef10/freebsd")
107
+ expect(bootstrap.config[:distro]).to eq("chef10/freebsd")
107
108
  end
108
109
 
109
110
  it "configs the bootstrap's ENV with the webui password" do
110
111
  bootstrap
111
- ENV['WEBUI_PASSWORD'].should eq("daweb")
112
+
113
+ expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
112
114
  end
113
115
 
114
116
  it "configs the bootstrap's ENV with the amqp password" do
115
117
  bootstrap
116
- ENV['AMQP_PASSWORD'].should eq("queueitup")
118
+
119
+ expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
120
+ end
121
+
122
+ it "skips config values with nil defaults" do
123
+ expect(bootstrap.config[:bootstrap_version]).to be_nil
117
124
  end
118
125
  end
119
126
 
@@ -134,10 +141,10 @@ describe Chef::Knife::ServerBootstrapLinode do
134
141
  end
135
142
 
136
143
  it "constructs a connection" do
137
- Fog::Compute.should_receive(:new).with({
138
- :provider => 'Linode',
139
- :linode_api_key => 'key'
140
- })
144
+ expect(Fog::Compute).to receive(:new).with(
145
+ :provider => "Linode",
146
+ :linode_api_key => "key"
147
+ )
141
148
 
142
149
  @knife.linode_connection
143
150
  end
@@ -146,38 +153,42 @@ describe Chef::Knife::ServerBootstrapLinode do
146
153
  describe "#server_ip_address" do
147
154
 
148
155
  before do
149
- @knife.config[:linode_node_name] = 'yak'
150
- @knife.stub(:linode_connection) { connection }
156
+ @knife.config[:linode_node_name] = "yak"
157
+ allow(@knife).to receive(:linode_connection) { connection }
151
158
  end
152
159
 
153
160
  context "when server is found" do
154
161
 
155
162
  before do
156
- connection.stub(:servers) { [server] }
163
+ allow(connection).to receive(:servers) { [server] }
157
164
  end
158
165
 
159
166
  let(:server) do
160
- stub(:name => 'yak', :status => 1, :public_ip_address => '10.11.12.13')
167
+ double(
168
+ :name => "yak",
169
+ :status => 1,
170
+ :public_ip_address => "10.11.12.13"
171
+ )
161
172
  end
162
173
 
163
174
  it "returns the provisioned ip address" do
164
- @knife.server_ip_address.should eq('10.11.12.13')
175
+ expect(@knife.server_ip_address).to eq("10.11.12.13")
165
176
  end
166
177
 
167
178
  it "ignores terminated instances" do
168
- server.stub(:status) { 0 }
179
+ allow(server).to receive(:status) { 0 }
169
180
 
170
- @knife.server_ip_address.should be_nil
181
+ expect(@knife.server_ip_address).to be_nil
171
182
  end
172
183
  end
173
184
 
174
185
  context "when server is not found" do
175
186
  before do
176
- connection.stub(:servers) { [] }
187
+ allow(connection).to receive(:servers) { [] }
177
188
  end
178
189
 
179
190
  it "returns nil" do
180
- @knife.server_ip_address.should be_nil
191
+ expect(@knife.server_ip_address).to be_nil
181
192
  end
182
193
  end
183
194
  end
@@ -195,13 +206,13 @@ describe Chef::Knife::ServerBootstrapLinode do
195
206
  @knife.config[:validation_key] = "/var/tmp/validation.pem"
196
207
  @knife.config[:identity_file] = "~/.ssh/mykey_dsa"
197
208
  @knife.config[:ssh_password] = "booboo"
198
- @knife.stub(:linode_connection) { connection }
199
- @knife.stub(:server_ip_address) { "11.11.11.13" }
200
- Chef::Knife::LinodeServerCreate.stub(:new) { bootstrap }
201
- Knife::Server::SSH.stub(:new) { ssh }
202
- Knife::Server::Credentials.stub(:new) { credentials }
203
- credentials.stub(:install_validation_key)
204
- credentials.stub(:create_root_client)
209
+ allow(@knife).to receive(:linode_connection) { connection }
210
+ allow(@knife).to receive(:server_ip_address) { "11.11.11.13" }
211
+ allow(Chef::Knife::LinodeServerCreate).to receive(:new) { bootstrap }
212
+ allow(Knife::Server::SSH).to receive(:new) { ssh }
213
+ allow(Knife::Server::Credentials).to receive(:new) { credentials }
214
+ allow(credentials).to receive(:install_validation_key)
215
+ allow(credentials).to receive(:create_root_client)
205
216
  end
206
217
 
207
218
  after do
@@ -210,61 +221,79 @@ describe Chef::Knife::ServerBootstrapLinode do
210
221
  end
211
222
  end
212
223
 
213
- let(:bootstrap) { stub(:run => true, :config => Hash.new) }
214
- let(:ssh) { stub }
215
- let(:credentials) { stub.as_null_object }
224
+ let(:bootstrap) { double(:run => true, :config => Hash.new) }
225
+ let(:ssh) { double }
226
+ let(:credentials) { double.as_null_object }
227
+
228
+ it "exits if Chef::Config[:node_name] is missing" do
229
+ Chef::Config[:node_name] = nil
230
+
231
+ expect { @knife.run }.to raise_error SystemExit
232
+ end
233
+
234
+ it "exits if Chef::Config[:client_key] is missing" do
235
+ Chef::Config[:client_key] = nil
236
+
237
+ expect { @knife.run }.to raise_error SystemExit
238
+ end
216
239
 
217
240
  it "exits if node_name option is missing" do
218
241
  @knife.config.delete(:chef_node_name)
219
242
 
220
- lambda { @knife.run }.should raise_error(SystemExit)
243
+ expect { @knife.run }.to raise_error(SystemExit)
221
244
  end
222
245
 
223
246
  it "exits if platform is set to auto" do
224
247
  @knife.config[:platform] = "auto"
225
248
 
226
- lambda { @knife.run }.should raise_error(SystemExit)
249
+ expect { @knife.run }.to raise_error(SystemExit)
227
250
  end
228
251
 
229
252
  it "bootstraps a linode server" do
230
- bootstrap.should_receive(:run)
253
+ expect(bootstrap).to receive(:run)
231
254
 
232
255
  @knife.run
233
256
  end
234
257
 
235
258
  it "installs a new validation.pem key from the chef 10 server" do
236
259
  @knife.config[:bootstrap_version] = "10"
237
- Knife::Server::SSH.should_receive(:new).with({
238
- :host => "11.11.11.13", :user => "root",
239
- :port => "22", :keys => ["~/.ssh/mykey_dsa"], :password => "booboo"
240
- })
241
- Knife::Server::Credentials.should_receive(:new).
260
+ expect(Knife::Server::SSH).to receive(:new).with(
261
+ :host => "11.11.11.13",
262
+ :user => "root",
263
+ :port => "22",
264
+ :keys => ["~/.ssh/mykey_dsa"],
265
+ :password => "booboo"
266
+ )
267
+ expect(Knife::Server::Credentials).to receive(:new).
242
268
  with(ssh, "/etc/chef/validation.pem", {})
243
- credentials.should_receive(:install_validation_key)
269
+ expect(credentials).to receive(:install_validation_key)
244
270
 
245
271
  @knife.run
246
272
  end
247
273
 
248
274
  it "installs a new validation.pem key from the omnibus server" do
249
- Knife::Server::SSH.should_receive(:new).with({
250
- :host => "11.11.11.13", :user => "root",
251
- :port => "22", :keys => ["~/.ssh/mykey_dsa"], :password => "booboo"
252
- })
253
- Knife::Server::Credentials.should_receive(:new).
254
- with(ssh, "/etc/chef/validation.pem", {:omnibus => true})
255
- credentials.should_receive(:install_validation_key)
275
+ expect(Knife::Server::SSH).to receive(:new).with(
276
+ :host => "11.11.11.13",
277
+ :user => "root",
278
+ :port => "22",
279
+ :keys => ["~/.ssh/mykey_dsa"],
280
+ :password => "booboo"
281
+ )
282
+ expect(Knife::Server::Credentials).to receive(:new).
283
+ with(ssh, "/etc/chef/validation.pem", :omnibus => true)
284
+ expect(credentials).to receive(:install_validation_key)
256
285
 
257
286
  @knife.run
258
287
  end
259
288
 
260
289
  it "create a root client key" do
261
- credentials.should_receive(:create_root_client)
290
+ expect(credentials).to receive(:create_root_client)
262
291
 
263
292
  @knife.run
264
293
  end
265
294
 
266
295
  it "installs a client key" do
267
- credentials.should_receive(:install_client_key).
296
+ expect(credentials).to receive(:install_client_key).
268
297
  with("smithers", "/var/tmp/myclientkey.pem")
269
298
 
270
299
  @knife.run