knife-server 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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