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.
- checksums.yaml +4 -4
- data/.cane +1 -0
- data/.rspec +1 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +12 -8
- data/CHANGELOG.md +32 -1
- data/Gemfile +9 -4
- data/Guardfile +28 -0
- data/README.md +28 -5
- data/Rakefile +31 -10
- data/knife-server.gemspec +18 -8
- data/lib/chef/knife/bootstrap/_omnibus.sh +63 -10
- data/lib/chef/knife/bootstrap/chef10/rhel.erb +2 -0
- data/lib/chef/knife/bootstrap/chef11/omnibus.erb +4 -1
- data/lib/chef/knife/bootstrap/chef11/rhel.erb +2 -0
- data/lib/chef/knife/server_backup.rb +24 -10
- data/lib/chef/knife/server_bootstrap_base.rb +68 -23
- data/lib/chef/knife/server_bootstrap_ec2.rb +33 -20
- data/lib/chef/knife/server_bootstrap_linode.rb +20 -13
- data/lib/chef/knife/server_bootstrap_openstack.rb +128 -0
- data/lib/chef/knife/server_bootstrap_standalone.rb +28 -16
- data/lib/chef/knife/server_restore.rb +23 -9
- data/lib/knife-server.rb +1 -0
- data/lib/knife/server/credentials.rb +78 -42
- data/lib/knife/server/ec2_security_group.rb +24 -21
- data/lib/knife/server/ssh.rb +54 -18
- data/lib/knife/server/version.rb +2 -1
- data/spec/chef/knife/server_backup_spec.rb +58 -44
- data/spec/chef/knife/server_bootstrap_ec2_spec.rb +108 -80
- data/spec/chef/knife/server_bootstrap_linode_spec.rb +93 -64
- data/spec/chef/knife/server_bootstrap_openstack_spec.rb +305 -0
- data/spec/chef/knife/server_bootstrap_standalone_spec.rb +113 -76
- data/spec/chef/knife/server_restore_spec.rb +38 -37
- data/spec/knife/server/credientials_spec.rb +248 -51
- data/spec/knife/server/ec2_security_group_spec.rb +76 -68
- data/spec/knife/server/ssh_spec.rb +138 -22
- metadata +107 -31
@@ -0,0 +1,305 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Author:: John Bellone (<jbellone@bloomberg.net>)
|
4
|
+
# Copyright:: Copyright (c) 2014 Bloomberg Finance L.P.
|
5
|
+
# License:: Apache License, Version 2.0
|
6
|
+
#
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
# See the License for the specific language governing permissions and
|
17
|
+
# limitations under the License.
|
18
|
+
#
|
19
|
+
|
20
|
+
require "chef/knife/server_bootstrap_openstack"
|
21
|
+
require "chef/knife/ssh"
|
22
|
+
require "fakefs/spec_helpers"
|
23
|
+
require "net/ssh"
|
24
|
+
Chef::Knife::ServerBootstrapOpenstack.load_deps
|
25
|
+
|
26
|
+
describe Chef::Knife::ServerBootstrapOpenstack do
|
27
|
+
include FakeFS::SpecHelpers
|
28
|
+
|
29
|
+
before do
|
30
|
+
Chef::Log.logger = Logger.new(StringIO.new)
|
31
|
+
@knife = Chef::Knife::ServerBootstrapOpenstack.new
|
32
|
+
@stdout = StringIO.new
|
33
|
+
allow(@knife.ui).to receive(:stdout).and_return(@stdout)
|
34
|
+
@stderr = StringIO.new
|
35
|
+
allow(@knife.ui).to receive(:stderr).and_return(@stderr)
|
36
|
+
@knife.config[:chef_node_name] = "yakky"
|
37
|
+
@knife.config[:platform] = "omnibus"
|
38
|
+
@knife.config[:ssh_user] = "root"
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:connection) { double(Fog::Compute::AWS) }
|
42
|
+
|
43
|
+
describe "#openstack_bootstrap" do
|
44
|
+
|
45
|
+
before do
|
46
|
+
@knife.config[:chef_node_name] = "shave.yak"
|
47
|
+
@knife.config[:ssh_user] = "jdoe"
|
48
|
+
@knife.config[:identity_file] = "~/.ssh/mykey_dsa"
|
49
|
+
@knife.config[:openstack_password] = "openstack123"
|
50
|
+
@knife.config[:distro] = "distro-praha"
|
51
|
+
@knife.config[:webui_password] = "daweb"
|
52
|
+
@knife.config[:amqp_password] = "queueitup"
|
53
|
+
|
54
|
+
ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
|
55
|
+
ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
|
60
|
+
ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
|
61
|
+
end
|
62
|
+
|
63
|
+
let(:bootstrap) { @knife.openstack_bootstrap }
|
64
|
+
|
65
|
+
it "returns a OpenstackServerCreate instance" do
|
66
|
+
expect(bootstrap).to be_a(Chef::Knife::OpenstackServerCreate)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "configs the bootstrap's chef_node_name" do
|
70
|
+
expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
|
71
|
+
end
|
72
|
+
|
73
|
+
it "configs the bootstrap's ssh_user" do
|
74
|
+
expect(bootstrap.config[:ssh_user]).to eq("jdoe")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "configs the bootstrap's identity_file" do
|
78
|
+
expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
|
79
|
+
end
|
80
|
+
|
81
|
+
it "configs the bootstrap's openstack_password" do
|
82
|
+
expect(bootstrap.config[:openstack_password]).to eq("openstack123")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "configs the bootstrap's distro" do
|
86
|
+
expect(bootstrap.config[:distro]).to eq("distro-praha")
|
87
|
+
end
|
88
|
+
|
89
|
+
it "configs the bootstrap's distro to chef11/omnibus by default" do
|
90
|
+
@knife.config.delete(:distro)
|
91
|
+
|
92
|
+
expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
|
93
|
+
end
|
94
|
+
|
95
|
+
it "configs the bootstrap's distro value driven off platform value" do
|
96
|
+
@knife.config.delete(:distro)
|
97
|
+
@knife.config[:platform] = "freebsd"
|
98
|
+
|
99
|
+
expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
|
100
|
+
end
|
101
|
+
|
102
|
+
it "configs bootstrap's distro based on bootstrap_version and platform" do
|
103
|
+
@knife.config.delete(:distro)
|
104
|
+
@knife.config[:platform] = "freebsd"
|
105
|
+
@knife.config[:bootstrap_version] = "10"
|
106
|
+
|
107
|
+
expect(bootstrap.config[:distro]).to eq("chef10/freebsd")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "configs the bootstrap's ENV with the webui password" do
|
111
|
+
bootstrap
|
112
|
+
|
113
|
+
expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "configs the bootstrap's ENV with the amqp password" do
|
117
|
+
bootstrap
|
118
|
+
|
119
|
+
expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "#openstack_connection" do
|
124
|
+
|
125
|
+
before do
|
126
|
+
@before_config = Hash.new
|
127
|
+
@before_config[:knife] = Chef::Config[:knife]
|
128
|
+
|
129
|
+
Chef::Config[:knife] = {
|
130
|
+
:openstack_username => "jbellone",
|
131
|
+
:openstack_password => "key",
|
132
|
+
:openstack_auth_url => "http://0.0.0.0",
|
133
|
+
:openstack_tenant => "slumlord",
|
134
|
+
:openstack_region => "newyork"
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
after do
|
139
|
+
Chef::Config[:knife] = @before_config[:knife]
|
140
|
+
end
|
141
|
+
|
142
|
+
it "constructs a connection" do
|
143
|
+
expect(Fog::Compute).to receive(:new).with(
|
144
|
+
:provider => :openstack,
|
145
|
+
:openstack_username => "jbellone",
|
146
|
+
:openstack_password => "key",
|
147
|
+
:openstack_auth_url => "http://0.0.0.0",
|
148
|
+
:openstack_tenant => "slumlord",
|
149
|
+
:openstack_region => "newyork"
|
150
|
+
)
|
151
|
+
|
152
|
+
@knife.openstack_connection
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#server_ip_address" do
|
157
|
+
|
158
|
+
before do
|
159
|
+
@knife.config[:openstack_node_name] = "yak"
|
160
|
+
allow(@knife).to receive(:openstack_connection) { connection }
|
161
|
+
end
|
162
|
+
|
163
|
+
context "when server is found" do
|
164
|
+
|
165
|
+
before do
|
166
|
+
allow(connection).to receive(:servers) { [server] }
|
167
|
+
end
|
168
|
+
|
169
|
+
let(:server) do
|
170
|
+
double(
|
171
|
+
:name => "yak",
|
172
|
+
:status => 1,
|
173
|
+
:public_ip_address => "10.11.12.13"
|
174
|
+
)
|
175
|
+
end
|
176
|
+
|
177
|
+
it "returns the provisioned ip address" do
|
178
|
+
expect(@knife.server_ip_address).to eq("10.11.12.13")
|
179
|
+
end
|
180
|
+
|
181
|
+
it "ignores terminated instances" do
|
182
|
+
allow(server).to receive(:status) { 0 }
|
183
|
+
|
184
|
+
expect(@knife.server_ip_address).to be_nil
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "when server is not found" do
|
189
|
+
before do
|
190
|
+
allow(connection).to receive(:servers) { [] }
|
191
|
+
end
|
192
|
+
|
193
|
+
it "returns nil" do
|
194
|
+
expect(@knife.server_ip_address).to be_nil
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
describe "#run" do
|
200
|
+
|
201
|
+
before do
|
202
|
+
@before_config = Hash.new
|
203
|
+
[:node_name, :client_key].each do |attr|
|
204
|
+
@before_config[attr] = Chef::Config[attr]
|
205
|
+
end
|
206
|
+
Chef::Config[:node_name] = "smithers"
|
207
|
+
Chef::Config[:client_key] = "/var/tmp/myclientkey.pem"
|
208
|
+
|
209
|
+
@knife.config[:validation_key] = "/var/tmp/validation.pem"
|
210
|
+
@knife.config[:identity_file] = "~/.ssh/mykey_dsa"
|
211
|
+
@knife.config[:ssh_password] = "booboo"
|
212
|
+
allow(@knife).to receive(:openstack_connection) { connection }
|
213
|
+
allow(@knife).to receive(:server_ip_address) { "11.11.11.13" }
|
214
|
+
allow(Chef::Knife::OpenstackServerCreate).to receive(:new) { bootstrap }
|
215
|
+
allow(Knife::Server::SSH).to receive(:new) { ssh }
|
216
|
+
allow(Knife::Server::Credentials).to receive(:new) { credentials }
|
217
|
+
allow(credentials).to receive(:install_validation_key)
|
218
|
+
allow(credentials).to receive(:create_root_client)
|
219
|
+
end
|
220
|
+
|
221
|
+
after do
|
222
|
+
[:node_name, :client_key].each do |attr|
|
223
|
+
Chef::Config[attr] = @before_config[attr]
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
let(:bootstrap) { double(:run => true, :config => Hash.new) }
|
228
|
+
let(:ssh) { double }
|
229
|
+
let(:credentials) { double.as_null_object }
|
230
|
+
|
231
|
+
it "exits if Chef::Config[:node_name] is missing" do
|
232
|
+
Chef::Config[:node_name] = nil
|
233
|
+
|
234
|
+
expect { @knife.run }.to raise_error SystemExit
|
235
|
+
end
|
236
|
+
|
237
|
+
it "exits if Chef::Config[:client_key] is missing" do
|
238
|
+
Chef::Config[:client_key] = nil
|
239
|
+
|
240
|
+
expect { @knife.run }.to raise_error SystemExit
|
241
|
+
end
|
242
|
+
|
243
|
+
it "exits if node_name option is missing" do
|
244
|
+
@knife.config.delete(:chef_node_name)
|
245
|
+
|
246
|
+
expect { @knife.run }.to raise_error(SystemExit)
|
247
|
+
end
|
248
|
+
|
249
|
+
it "exits if platform is set to auto" do
|
250
|
+
@knife.config[:platform] = "auto"
|
251
|
+
|
252
|
+
expect { @knife.run }.to raise_error(SystemExit)
|
253
|
+
end
|
254
|
+
|
255
|
+
it "bootstraps a openstack server" do
|
256
|
+
expect(bootstrap).to receive(:run)
|
257
|
+
|
258
|
+
@knife.run
|
259
|
+
end
|
260
|
+
|
261
|
+
it "installs a new validation.pem key from the chef 10 server" do
|
262
|
+
@knife.config[:bootstrap_version] = "10"
|
263
|
+
expect(Knife::Server::SSH).to receive(:new).with(
|
264
|
+
:host => "11.11.11.13",
|
265
|
+
:user => "root",
|
266
|
+
:port => "22",
|
267
|
+
:keys => ["~/.ssh/mykey_dsa"],
|
268
|
+
:password => "booboo"
|
269
|
+
)
|
270
|
+
expect(Knife::Server::Credentials).to receive(:new).
|
271
|
+
with(ssh, "/etc/chef/validation.pem", {})
|
272
|
+
expect(credentials).to receive(:install_validation_key)
|
273
|
+
|
274
|
+
@knife.run
|
275
|
+
end
|
276
|
+
|
277
|
+
it "installs a new validation.pem key from the omnibus server" do
|
278
|
+
expect(Knife::Server::SSH).to receive(:new).with(
|
279
|
+
:host => "11.11.11.13",
|
280
|
+
:user => "root",
|
281
|
+
:port => "22",
|
282
|
+
:keys => ["~/.ssh/mykey_dsa"],
|
283
|
+
:password => "booboo"
|
284
|
+
)
|
285
|
+
expect(Knife::Server::Credentials).to receive(:new).
|
286
|
+
with(ssh, "/etc/chef/validation.pem", :omnibus => true)
|
287
|
+
expect(credentials).to receive(:install_validation_key)
|
288
|
+
|
289
|
+
@knife.run
|
290
|
+
end
|
291
|
+
|
292
|
+
it "create a root client key" do
|
293
|
+
expect(credentials).to receive(:create_root_client)
|
294
|
+
|
295
|
+
@knife.run
|
296
|
+
end
|
297
|
+
|
298
|
+
it "installs a client key" do
|
299
|
+
expect(credentials).to receive(:install_client_key).
|
300
|
+
with("smithers", "/var/tmp/myclientkey.pem")
|
301
|
+
|
302
|
+
@knife.run
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
@@ -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
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
20
|
+
require "chef/knife/server_bootstrap_standalone"
|
21
|
+
require "chef/knife/ssh"
|
22
|
+
require "fakefs/spec_helpers"
|
23
|
+
require "net/ssh"
|
23
24
|
Chef::Knife::ServerBootstrapStandalone.load_deps
|
24
25
|
|
25
26
|
describe Chef::Knife::ServerBootstrapStandalone do
|
@@ -29,9 +30,9 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
29
30
|
Chef::Log.logger = Logger.new(StringIO.new)
|
30
31
|
@knife = Chef::Knife::ServerBootstrapStandalone.new
|
31
32
|
@stdout = StringIO.new
|
32
|
-
@knife.ui.
|
33
|
+
allow(@knife.ui).to receive(:stdout).and_return(@stdout)
|
33
34
|
@stderr = StringIO.new
|
34
|
-
@knife.ui.
|
35
|
+
allow(@knife.ui).to receive(:stderr).and_return(@stderr)
|
35
36
|
@knife.config[:chef_node_name] = "yakky"
|
36
37
|
@knife.config[:ssh_user] = "root"
|
37
38
|
end
|
@@ -40,24 +41,26 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
40
41
|
|
41
42
|
before do
|
42
43
|
@knife.config[:bootstrap_version] = "10"
|
43
|
-
@knife.
|
44
|
+
allow(@knife).to receive(:determine_platform) do
|
45
|
+
@knife.send(:distro_auto_map, "debian", "6")
|
46
|
+
end
|
44
47
|
@knife.config[:platform] = "auto"
|
45
48
|
end
|
46
49
|
|
47
50
|
it "should auto-select from determine_platform by default" do
|
48
51
|
@knife.config.delete(:distro)
|
49
|
-
@knife.send(:bootstrap_distro).
|
50
|
-
@knife.
|
51
|
-
@knife.send(:bootstrap_distro).
|
52
|
+
expect(@knife.send(:bootstrap_distro)).to eq("chef10/debian")
|
53
|
+
allow(@knife).to receive(:determine_platform) { "chef10/rhel" }
|
54
|
+
expect(@knife.send(:bootstrap_distro)).to eq("chef10/rhel")
|
52
55
|
end
|
53
56
|
|
54
|
-
it "
|
55
|
-
@knife.send(:construct_distro, "rhel").
|
57
|
+
it "constructs the distro path based on chef server version and platform" do
|
58
|
+
expect(@knife.send(:construct_distro, "rhel")).to eq("chef10/rhel")
|
56
59
|
@knife.config[:bootstrap_version] = "11"
|
57
|
-
@knife.send(:construct_distro, "rhel").
|
60
|
+
expect(@knife.send(:construct_distro, "rhel")).to eq("chef11/rhel")
|
58
61
|
end
|
59
62
|
|
60
|
-
it "
|
63
|
+
it "maps the distro template based on a platform/platform_version tuple" do
|
61
64
|
{
|
62
65
|
"el" => "rhel",
|
63
66
|
"redhat" => "rhel",
|
@@ -69,9 +72,9 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
69
72
|
"suse" => "suse"
|
70
73
|
}.each do |key, value|
|
71
74
|
@knife.config[:bootstrap_version] = "10"
|
72
|
-
@knife.send(:distro_auto_map, key, 0).
|
75
|
+
expect(@knife.send(:distro_auto_map, key, 0)).to eq("chef10/#{value}")
|
73
76
|
@knife.config[:bootstrap_version] = "11"
|
74
|
-
@knife.send(:distro_auto_map, key, 0).
|
77
|
+
expect(@knife.send(:distro_auto_map, key, 0)).to eq("chef11/#{value}")
|
75
78
|
end
|
76
79
|
end
|
77
80
|
end
|
@@ -85,114 +88,121 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
85
88
|
@knife.config[:ssh_password] = "nevereverguess"
|
86
89
|
@knife.config[:ssh_port] = "2222"
|
87
90
|
@knife.config[:identity_file] = "~/.ssh/mykey_dsa"
|
88
|
-
@knife.config[:security_groups] = %w
|
89
|
-
@knife.config[:tags] = %w
|
91
|
+
@knife.config[:security_groups] = %w[x y z]
|
92
|
+
@knife.config[:tags] = %w[tag1=val1 tag2=val2]
|
90
93
|
@knife.config[:distro] = "distro-praha"
|
91
94
|
@knife.config[:ebs_size] = "42"
|
92
95
|
@knife.config[:webui_password] = "daweb"
|
93
96
|
@knife.config[:amqp_password] = "queueitup"
|
94
97
|
|
95
|
-
ENV[
|
96
|
-
ENV[
|
98
|
+
ENV["_SPEC_WEBUI_PASSWORD"] = ENV["WEBUI_PASSWORD"]
|
99
|
+
ENV["_SPEC_AMQP_PASSWORD"] = ENV["AMQP_PASSWORD"]
|
97
100
|
end
|
98
101
|
|
99
102
|
after do
|
100
|
-
ENV[
|
101
|
-
ENV[
|
103
|
+
ENV["WEBUI_PASSWORD"] = ENV.delete("_SPEC_WEBUI_PASSWORD")
|
104
|
+
ENV["AMQP_PASSWORD"] = ENV.delete("_SPEC_AMQP_PASSWORD")
|
102
105
|
end
|
103
106
|
|
104
107
|
let(:bootstrap) { @knife.standalone_bootstrap }
|
105
108
|
|
106
109
|
it "returns a Bootstrap instance" do
|
107
|
-
bootstrap.
|
110
|
+
expect(bootstrap).to be_a(Chef::Knife::Bootstrap)
|
108
111
|
end
|
109
112
|
|
110
113
|
it "copies our UI object to the bootstrap object" do
|
111
|
-
bootstrap.ui.object_id.
|
114
|
+
expect(bootstrap.ui.object_id).to eq(@knife.ui.object_id)
|
112
115
|
end
|
113
116
|
|
114
117
|
it "sets NO_TEST in the environment when the option is provided" do
|
115
118
|
@knife.config[:no_test] = true
|
116
|
-
|
117
|
-
|
119
|
+
|
120
|
+
expect(bootstrap).to_not be_nil
|
121
|
+
expect(ENV["NO_TEST"]).to eq("1")
|
122
|
+
|
118
123
|
ENV.delete("NO_TEST")
|
119
124
|
end
|
120
125
|
|
121
126
|
it "configs the bootstrap's chef_node_name" do
|
122
|
-
bootstrap.config[:chef_node_name].
|
127
|
+
expect(bootstrap.config[:chef_node_name]).to eq("shave.yak")
|
123
128
|
end
|
124
129
|
|
125
130
|
it "configs the bootstrap's ssh_user" do
|
126
|
-
bootstrap.config[:ssh_user].
|
131
|
+
expect(bootstrap.config[:ssh_user]).to eq("jdoe")
|
127
132
|
end
|
128
133
|
|
129
134
|
it "configs the bootstrap's ssh_password" do
|
130
|
-
bootstrap.config[:ssh_password].
|
135
|
+
expect(bootstrap.config[:ssh_password]).to eq("nevereverguess")
|
131
136
|
end
|
132
137
|
|
133
138
|
it "does not config the bootstrap's ssh_password if not given" do
|
134
139
|
@knife.config.delete(:ssh_password)
|
135
140
|
|
136
|
-
bootstrap.config[:ssh_password].
|
141
|
+
expect(bootstrap.config[:ssh_password]).to be_nil
|
137
142
|
end
|
138
143
|
|
139
144
|
it "configs the bootstrap's ssh_port" do
|
140
|
-
bootstrap.config[:ssh_port].
|
145
|
+
expect(bootstrap.config[:ssh_port]).to eq("2222")
|
141
146
|
end
|
142
147
|
|
143
148
|
it "configs the bootstrap's identity_file" do
|
144
|
-
bootstrap.config[:identity_file].
|
149
|
+
expect(bootstrap.config[:identity_file]).to eq("~/.ssh/mykey_dsa")
|
145
150
|
end
|
146
151
|
|
147
152
|
it "configs the bootstrap's distro" do
|
148
|
-
bootstrap.config[:distro].
|
153
|
+
expect(bootstrap.config[:distro]).to eq("distro-praha")
|
149
154
|
end
|
150
155
|
|
151
156
|
it "configs the bootstrap's distro to chef11/omnibus by default" do
|
152
157
|
@knife.config.delete(:distro)
|
153
158
|
|
154
|
-
bootstrap.config[:distro].
|
159
|
+
expect(bootstrap.config[:distro]).to eq("chef11/omnibus")
|
155
160
|
end
|
156
161
|
|
157
162
|
it "configs the bootstrap's distro value driven off platform value" do
|
158
163
|
@knife.config.delete(:distro)
|
159
164
|
@knife.config[:platform] = "freebsd"
|
160
165
|
|
161
|
-
bootstrap.config[:distro].
|
166
|
+
expect(bootstrap.config[:distro]).to eq("chef11/freebsd")
|
162
167
|
end
|
163
168
|
|
164
169
|
it "configs the bootstrap's ENV with the webui password" do
|
165
170
|
bootstrap
|
166
|
-
|
171
|
+
|
172
|
+
expect(ENV["WEBUI_PASSWORD"]).to eq("daweb")
|
167
173
|
end
|
168
174
|
|
169
175
|
it "configs the bootstrap's ENV with the amqp password" do
|
170
176
|
bootstrap
|
171
|
-
|
177
|
+
|
178
|
+
expect(ENV["AMQP_PASSWORD"]).to eq("queueitup")
|
172
179
|
end
|
173
180
|
|
174
181
|
it "configs the bootstrap's name_args with the host" do
|
175
|
-
bootstrap.name_args.
|
182
|
+
expect(bootstrap.name_args).to eq(%w[172.0.10.21])
|
176
183
|
end
|
177
184
|
|
178
185
|
it "configs the bootstrap's use_sudo to true if ssh-user is not root" do
|
179
|
-
bootstrap.config[:use_sudo].
|
186
|
+
expect(bootstrap.config[:use_sudo]).to be_truthy
|
180
187
|
end
|
181
188
|
|
182
189
|
it "configs the bootstrap's use_sudo to false if ssh-user is root" do
|
183
190
|
@knife.config[:ssh_user] = "root"
|
184
191
|
|
185
|
-
bootstrap.config[:use_sudo].
|
192
|
+
expect(bootstrap.config[:use_sudo]).to_not be_truthy
|
193
|
+
end
|
194
|
+
|
195
|
+
it "skips config values with nil defaults" do
|
196
|
+
expect(bootstrap.config[:bootstrap_version]).to be_nil
|
186
197
|
end
|
187
198
|
|
188
199
|
describe "#bootstrap_auto?" do
|
189
|
-
it "should
|
200
|
+
it "should be true if set via --platform, even if the distro changes" do
|
190
201
|
@knife.config[:platform] = "auto"
|
191
|
-
bootstrap.config[:distro].
|
192
|
-
@knife.send(:bootstrap_auto?).
|
202
|
+
expect(bootstrap.config[:distro]).to_not eq("auto")
|
203
|
+
expect(@knife.send(:bootstrap_auto?)).to be_truthy
|
193
204
|
end
|
194
205
|
end
|
195
|
-
|
196
206
|
end
|
197
207
|
|
198
208
|
describe "#run" do
|
@@ -206,11 +216,11 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
206
216
|
|
207
217
|
@knife.config[:host] = "192.168.0.1"
|
208
218
|
@knife.config[:ssh_port] = "2345"
|
209
|
-
Chef::Knife::Bootstrap.
|
210
|
-
Knife::Server::SSH.
|
211
|
-
Knife::Server::Credentials.
|
212
|
-
credentials.
|
213
|
-
credentials.
|
219
|
+
allow(Chef::Knife::Bootstrap).to receive(:new) { bootstrap }
|
220
|
+
allow(Knife::Server::SSH).to receive(:new) { ssh }
|
221
|
+
allow(Knife::Server::Credentials).to receive(:new) { credentials }
|
222
|
+
allow(credentials).to receive(:install_validation_key)
|
223
|
+
allow(credentials).to receive(:create_root_client)
|
214
224
|
end
|
215
225
|
|
216
226
|
after do
|
@@ -220,11 +230,28 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
220
230
|
end
|
221
231
|
|
222
232
|
let(:bootstrap) do
|
223
|
-
|
233
|
+
double(
|
234
|
+
:run => true,
|
235
|
+
:config => Hash.new,
|
236
|
+
:ui= => true,
|
237
|
+
:name_args= => true
|
238
|
+
)
|
224
239
|
end
|
225
240
|
|
226
|
-
let(:ssh) {
|
227
|
-
let(:credentials) {
|
241
|
+
let(:ssh) { double(:exec! => true) }
|
242
|
+
let(:credentials) { double.as_null_object }
|
243
|
+
|
244
|
+
it "exits if Chef::Config[:node_name] is missing" do
|
245
|
+
Chef::Config[:node_name] = nil
|
246
|
+
|
247
|
+
expect { @knife.run }.to raise_error SystemExit
|
248
|
+
end
|
249
|
+
|
250
|
+
it "exits if Chef::Config[:client_key] is missing" do
|
251
|
+
Chef::Config[:client_key] = nil
|
252
|
+
|
253
|
+
expect { @knife.run }.to raise_error SystemExit
|
254
|
+
end
|
228
255
|
|
229
256
|
it "exits if node_name option is missing" do
|
230
257
|
@knife.config.delete(:chef_node_name)
|
@@ -239,18 +266,19 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
239
266
|
end
|
240
267
|
|
241
268
|
it "bootstraps a standalone server" do
|
242
|
-
bootstrap.
|
269
|
+
expect(bootstrap).to receive(:run)
|
270
|
+
|
243
271
|
@knife.run
|
244
272
|
end
|
245
273
|
|
246
274
|
it "create a root client key" do
|
247
|
-
credentials.
|
275
|
+
expect(credentials).to receive(:create_root_client)
|
248
276
|
|
249
277
|
@knife.run
|
250
278
|
end
|
251
279
|
|
252
280
|
it "installs a client key" do
|
253
|
-
credentials.
|
281
|
+
expect(credentials).to receive(:install_client_key).
|
254
282
|
with("smithers", "/var/tmp/myclientkey.pem")
|
255
283
|
|
256
284
|
@knife.run
|
@@ -259,27 +287,30 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
259
287
|
it "installs a new validation.pem key from the chef 10 server" do
|
260
288
|
@knife.config[:bootstrap_version] = "10"
|
261
289
|
@knife.config[:distro] = "yabba-debian"
|
262
|
-
Knife::Server::Credentials.
|
290
|
+
expect(Knife::Server::Credentials).to receive(:new).
|
263
291
|
with(ssh, "/etc/chef/validation.pem", {})
|
264
|
-
credentials.
|
292
|
+
expect(credentials).to receive(:install_validation_key)
|
265
293
|
|
266
294
|
@knife.run
|
267
295
|
end
|
268
296
|
|
269
297
|
it "installs a new validation.pem key from the omnibus server" do
|
270
|
-
Knife::Server::Credentials.
|
271
|
-
with(ssh, "/etc/chef/validation.pem",
|
272
|
-
credentials.
|
298
|
+
expect(Knife::Server::Credentials).to receive(:new).
|
299
|
+
with(ssh, "/etc/chef/validation.pem", :omnibus => true)
|
300
|
+
expect(credentials).to receive(:install_validation_key)
|
273
301
|
|
274
302
|
@knife.run
|
275
303
|
end
|
276
304
|
|
277
305
|
context "when an ssh password is missing" do
|
278
306
|
it "creates an SSH connection without a password" do
|
279
|
-
Knife::Server::SSH.
|
280
|
-
:host => "192.168.0.1",
|
281
|
-
:
|
282
|
-
|
307
|
+
expect(Knife::Server::SSH).to receive(:new).with(
|
308
|
+
:host => "192.168.0.1",
|
309
|
+
:port => "2345",
|
310
|
+
:user => "root",
|
311
|
+
:password => nil,
|
312
|
+
:keys => []
|
313
|
+
)
|
283
314
|
|
284
315
|
@knife.run
|
285
316
|
end
|
@@ -291,10 +322,13 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
291
322
|
end
|
292
323
|
|
293
324
|
it "creates an SSH connection with a password" do
|
294
|
-
Knife::Server::SSH.
|
295
|
-
:host => "192.168.0.1",
|
296
|
-
:
|
297
|
-
|
325
|
+
expect(Knife::Server::SSH).to receive(:new).with(
|
326
|
+
:host => "192.168.0.1",
|
327
|
+
:port => "2345",
|
328
|
+
:user => "root",
|
329
|
+
:password => "snoopy",
|
330
|
+
:keys => []
|
331
|
+
)
|
298
332
|
|
299
333
|
@knife.run
|
300
334
|
end
|
@@ -306,10 +340,13 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
306
340
|
end
|
307
341
|
|
308
342
|
it "creates an SSH connection with an identity file" do
|
309
|
-
Knife::Server::SSH.
|
310
|
-
:host => "192.168.0.1",
|
311
|
-
:
|
312
|
-
|
343
|
+
expect(Knife::Server::SSH).to receive(:new).with(
|
344
|
+
:host => "192.168.0.1",
|
345
|
+
:port => "2345",
|
346
|
+
:user => "root",
|
347
|
+
:password => nil,
|
348
|
+
:keys => ["poop.pem"]
|
349
|
+
)
|
313
350
|
|
314
351
|
@knife.run
|
315
352
|
end
|
@@ -317,13 +354,13 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
317
354
|
|
318
355
|
context "when key-based ssh authentication fails" do
|
319
356
|
before do
|
320
|
-
ssh.
|
357
|
+
allow(ssh).to receive(:exec!).
|
321
358
|
with("hostname -f") { raise ::Net::SSH::AuthenticationFailed }
|
322
|
-
@knife.ui.
|
359
|
+
allow(@knife.ui).to receive(:ask) { "hellacool" }
|
323
360
|
end
|
324
361
|
|
325
362
|
it "sends a authentication failure message" do
|
326
|
-
@knife.ui.
|
363
|
+
expect(@knife.ui).to receive(:warn).with(/Failed to authenticate/i)
|
327
364
|
|
328
365
|
@knife.run
|
329
366
|
end
|
@@ -331,7 +368,7 @@ describe Chef::Knife::ServerBootstrapStandalone do
|
|
331
368
|
it "sets the :ssh_password config from user input" do
|
332
369
|
@knife.run
|
333
370
|
|
334
|
-
@knife.config[:ssh_password].
|
371
|
+
expect(@knife.config[:ssh_password]).to eq("hellacool")
|
335
372
|
end
|
336
373
|
end
|
337
374
|
end
|