knife-openstack 0.10.0 → 1.0.0.rc1

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 (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.travis.yml +6 -0
  4. data/CHANGELOG.md +20 -22
  5. data/Gemfile +11 -1
  6. data/README.md +6 -4
  7. data/Rakefile +33 -0
  8. data/knife-openstack.gemspec +7 -8
  9. data/lib/chef/knife/cloud/openstack_server_create_options.rb +75 -0
  10. data/lib/chef/knife/cloud/openstack_service.rb +62 -0
  11. data/lib/chef/knife/cloud/openstack_service_options.rb +50 -0
  12. data/lib/chef/knife/openstack_flavor_list.rb +37 -51
  13. data/lib/chef/knife/openstack_group_list.rb +38 -45
  14. data/lib/chef/knife/openstack_helpers.rb +30 -0
  15. data/lib/chef/knife/openstack_image_list.rb +42 -59
  16. data/lib/chef/knife/openstack_network_list.rb +25 -21
  17. data/lib/chef/knife/openstack_server_create.rb +166 -452
  18. data/lib/chef/knife/openstack_server_delete.rb +26 -106
  19. data/lib/chef/knife/openstack_server_list.rb +37 -59
  20. data/lib/chef/knife/openstack_server_show.rb +57 -0
  21. data/lib/knife-openstack/version.rb +1 -1
  22. data/spec/functional/flavor_list_func_spec.rb +45 -0
  23. data/spec/functional/group_list_func_spec.rb +67 -0
  24. data/spec/functional/image_list_func_spec.rb +51 -0
  25. data/spec/functional/network_list_func_spec.rb +44 -0
  26. data/spec/functional/server_create_func_spec.rb +118 -0
  27. data/spec/functional/server_delete_func_spec.rb +84 -0
  28. data/spec/functional/server_list_func_spec.rb +95 -0
  29. data/spec/functional/server_show_func_spec.rb +46 -0
  30. data/spec/integration/cleanup.rb +91 -0
  31. data/spec/integration/config/environment.yml.sample +13 -0
  32. data/spec/integration/openstack_spec.rb +618 -0
  33. data/spec/spec_helper.rb +126 -0
  34. data/spec/unit/openstack_flavor_list_spec.rb +30 -0
  35. data/spec/unit/openstack_group_list_spec.rb +43 -0
  36. data/spec/unit/openstack_image_list_spec.rb +32 -0
  37. data/spec/unit/openstack_network_list_spec.rb +39 -0
  38. data/spec/unit/openstack_server_create_spec.rb +344 -182
  39. data/spec/unit/openstack_server_delete_spec.rb +43 -0
  40. data/spec/unit/openstack_server_list_spec.rb +32 -0
  41. data/spec/unit/openstack_server_show_spec.rb +42 -0
  42. data/spec/unit/openstack_service_spec.rb +89 -0
  43. data/spec/unit/validate_spec.rb +55 -0
  44. metadata +95 -51
  45. data/lib/chef/knife/openstack_base.rb +0 -182
@@ -0,0 +1,13 @@
1
+ # FIXME For now we will fetch the creds from a config file
2
+ OPENSTACK_KEY_PAIR: OPENSTACK_KEY_PAIR
3
+ OS_SSH_USER: OS_SSH_USER
4
+ OS_WINDOWS_SSH_USER: OS_WINDOWS_SSH_USER
5
+ OS_WINDOWS_SSH_PASSWORD: OS_WINDOWS_SSH_PASSWORD
6
+ OS_WINRM_USER: OS_WINRM_USER
7
+ OS_WINRM_PASSWORD: OS_WINRM_PASSWORD
8
+ OS_LINUX_IMAGE: OS_LINUX_IMAGE
9
+ OS_WINDOWS_IMAGE: OS_WINDOWS_IMAGE
10
+ OS_WINDOWS_SSH_IMAGE: OS_WINDOWS_SSH_IMAGE
11
+ OS_LINUX_FLAVOR: OS_LINUX_FLAVOR
12
+ OS_WINDOWS_FLAVOR: OS_WINDOWS_FLAVOR
13
+ OS_INVALID_FLAVOR: OS_INVALID_FLAVOR
@@ -0,0 +1,618 @@
1
+ # Copyright:: Copyright (c) 2013-2014 Chef Software, Inc.
2
+ # License: Apache License, Version 2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ # Author:: Siddheshwar More (<siddheshwar.more@clogeny.com>)
17
+ # Author:: Ameya Varade (<ameya.varade@clogeny.com>)
18
+ # Author:: Prabhu Das (<prabhu.das@clogeny.com>)
19
+
20
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
21
+
22
+ def append_openstack_creds(is_list_cmd = false)
23
+ openstack_creds_cmd = " --openstack-username '#{ENV['OPENSTACK_USERNAME']}' --openstack-password '#{ENV['OPENSTACK_PASSWORD']}' --openstack-api-endpoint #{ENV['OPENSTACK_AUTH_URL']}"
24
+ openstack_creds_cmd = openstack_creds_cmd + " -c #{temp_dir}/knife.rb"
25
+ if(!is_list_cmd)
26
+ openstack_creds_cmd = openstack_creds_cmd + " --openstack-tenant #{ENV['OPENSTACK_TENANT']}"
27
+ end
28
+ openstack_creds_cmd
29
+ end
30
+
31
+ def append_openstack_creds_for_windows
32
+ openstack_creds_cmd = " --openstack-username '#{ENV['OPENSTACK_USERNAME']}' --openstack-password '#{ENV['OPENSTACK_PASSWORD']}' --openstack-api-endpoint #{ENV['OPENSTACK_AUTH_URL']} "
33
+ openstack_creds_cmd = openstack_creds_cmd + " -c #{temp_dir}/knife.rb"
34
+ openstack_creds_cmd = openstack_creds_cmd + " --openstack-tenant #{ENV['OPENSTACK_TENANT']}"
35
+ openstack_creds_cmd
36
+ end
37
+
38
+ def get_ssh_credentials
39
+ " --ssh-user #{@os_ssh_user}"+
40
+ " --openstack-ssh-key-id #{@openstack_key_pair}"
41
+ end
42
+
43
+ def get_ssh_credentials_for_windows_image
44
+ " --ssh-user #{@os_windows_ssh_user}"+
45
+ " --ssh-password #{@os_windows_ssh_password}"+
46
+ " --openstack-ssh-key-id #{@openstack_key_pair}"
47
+ end
48
+
49
+ def get_winrm_credentials
50
+ " --winrm-user #{@os_winrm_user}"+
51
+ " --winrm-password #{@os_winrm_password}"+
52
+ " --openstack-ssh-key-id #{@openstack_key_pair}"
53
+ end
54
+
55
+ # get openstack active instance_id for knife openstack show command run
56
+ def get_active_instance_id
57
+ server_list_output = run("knife openstack server list " + append_openstack_creds(is_list_cmd = true))
58
+ # Check command exitstatus. Non zero exitstatus indicates command execution fails.
59
+ if server_list_output.exitstatus != 0
60
+ puts "Please check Openstack user name, password and auth url are correct. Error: #{list_output.stderr}."
61
+ return false
62
+ else
63
+ servers = server_list_output.stdout
64
+ end
65
+
66
+ servers.each_line do |line|
67
+ if line.include?("ACTIVE")
68
+ instance_id = line.split(" ").first
69
+ return instance_id
70
+ end
71
+ end
72
+ return false
73
+ end
74
+
75
+ describe 'knife-openstack integration test' , :if => is_config_present do
76
+ include KnifeTestBed
77
+ include RSpec::KnifeTestUtils
78
+
79
+ before(:all) do
80
+ expect(run('gem build knife-openstack.gemspec').exitstatus).to be(0)
81
+ expect(run("gem install #{get_gem_file_name}").exitstatus).to be(0)
82
+ init_openstack_test
83
+ end
84
+
85
+ after(:all) do
86
+ run("gem uninstall knife-openstack -v '#{Knife::OpenStack::VERSION}'")
87
+ cleanup_test_data
88
+ end
89
+
90
+ describe 'display help for command' do
91
+ %w{flavor\ list server\ create server\ delete server\ list group\ list image\ list network\ list }.each do |command|
92
+ context "when --help option used with #{command} command" do
93
+ let(:command) { "knife openstack #{command} --help" }
94
+ run_cmd_check_stdout("--help")
95
+ end
96
+ end
97
+ end
98
+
99
+ describe 'display server list' do
100
+ context 'when standard options specified' do
101
+ let(:command) { "knife openstack server list" + append_openstack_creds(is_list_cmd = true) }
102
+ run_cmd_check_status_and_output("succeed", "Instance ID")
103
+ end
104
+
105
+ context 'when --chef-data CLI option specified' do
106
+ let(:command) { "knife openstack server list" + append_openstack_creds(is_list_cmd = true) + " --chef-data" }
107
+ it {skip('setup a chef-zero on workspace node')}
108
+ end
109
+
110
+ context 'when --chef-data and valid --chef-node-attribute CLI option specified' do
111
+ let(:command) { "knife openstack server list" + append_openstack_creds(is_list_cmd = true) + " --chef-data --chef-node-attribute platform_family" }
112
+ it {skip('setup a chef-zero on workspace node')}
113
+ end
114
+
115
+ context 'when --chef-data and In valid --chef-node-attribute CLI option specified' do
116
+ let(:command) { "knife openstack server list" + append_openstack_creds(is_list_cmd = true) + " --chef-data --chef-node-attribute invalid" }
117
+ it {skip('setup a chef-zero on workspace node')}
118
+ end
119
+ end
120
+
121
+ describe 'display flavor list' do
122
+ context 'when standard options specified' do
123
+ let(:command) { "knife openstack flavor list" + append_openstack_creds(is_list_cmd = true) }
124
+ run_cmd_check_status_and_output("succeed", "ID")
125
+ end
126
+ end
127
+
128
+ describe 'display image list' do
129
+ context 'when standard options specified' do
130
+ let(:command) { "knife openstack image list" + append_openstack_creds(is_list_cmd = true) }
131
+ run_cmd_check_status_and_output("succeed", "ID")
132
+ end
133
+ end
134
+
135
+ describe 'display group list' do
136
+ context 'when standard options specified' do
137
+ let(:command) { "knife openstack group list" + append_openstack_creds(is_list_cmd = true) }
138
+ run_cmd_check_status_and_output("succeed", "Name")
139
+ end
140
+ end
141
+
142
+ describe 'display network list' do
143
+ context 'when standard options specified' do
144
+ let(:command) { "knife openstack network list" + append_openstack_creds(is_list_cmd = true) }
145
+ it {skip 'Chef openstack setup not support this functionality'}
146
+ end
147
+ end
148
+
149
+ describe 'server show' do
150
+ context 'with valid instance_id' do
151
+ before(:each) do
152
+ @instance_id = get_active_instance_id
153
+ end
154
+ let(:command) { "knife openstack server show #{@instance_id}" + append_openstack_creds(is_list_cmd = true) }
155
+ run_cmd_check_status_and_output("succeed", "Instance ID")
156
+ end
157
+
158
+ context 'with invalid instance_id' do
159
+ let(:command) { "knife openstack server show invalid_instance_id" + append_openstack_creds(is_list_cmd = true) }
160
+
161
+ run_cmd_check_status_and_output("fail", "ERROR: Server doesn't exists for this invalid_instance_id instance id")
162
+ end
163
+ end
164
+
165
+ describe 'create and bootstrap Linux Server' do
166
+ before(:each) {rm_known_host}
167
+ context 'when standard options specified' do
168
+ cmd_out = ""
169
+
170
+ before(:each) { create_node_name("linux") }
171
+
172
+ after { cmd_out = "#{cmd_output}" }
173
+
174
+ let(:command) { "knife openstack server create -N #{@name_node}"+
175
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
176
+ " --template-file " + get_linux_template_file_path +
177
+ " --server-url http://localhost:8889" +
178
+ " --yes --server-create-timeout 1800" +
179
+ get_ssh_credentials +
180
+ " --identity-file #{temp_dir}/openstack.pem"+
181
+ append_openstack_creds + " --sudo"}
182
+
183
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
184
+
185
+ context "delete server after create" do
186
+ let(:command) { delete_instance_cmd(cmd_out) }
187
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
188
+ end
189
+ end
190
+
191
+ context 'when standard options and chef node name prefix is default value(i.e openstack)' do
192
+ let(:command) { "knife openstack server create "+
193
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
194
+ " --template-file " + get_linux_template_file_path +
195
+ " --server-url http://localhost:8889" +
196
+ " --yes --server-create-timeout 1800" +
197
+ get_ssh_credentials +
198
+ " --identity-file #{temp_dir}/openstack.pem"+
199
+ append_openstack_creds + " --sudo"}
200
+
201
+ after { run(delete_instance_cmd("#{cmd_output}")) }
202
+
203
+ run_cmd_check_status_and_output("succeed", "Bootstrapping Chef on")
204
+ end
205
+
206
+ context 'when standard options and chef node name prefix is user specified value' do
207
+ let(:command) { "knife openstack server create "+
208
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
209
+ " --template-file " + get_linux_template_file_path +
210
+ " --server-url http://localhost:8889" +
211
+ " --yes --server-create-timeout 1800" +
212
+ " --chef-node-name-prefix os-integration-test-" +
213
+ get_ssh_credentials +
214
+ " --identity-file #{temp_dir}/openstack.pem"+
215
+ append_openstack_creds + " --sudo"}
216
+
217
+ after { run(delete_instance_cmd("#{cmd_output}")) }
218
+
219
+ run_cmd_check_status_and_output("succeed", "os-integration-test-")
220
+ end
221
+
222
+ context 'when standard options and delete-server-on-failure specified' do
223
+ nodename = ""
224
+ before(:each) { create_node_name("linux") }
225
+
226
+ after { nodename = @name_node }
227
+
228
+ let(:command) { "knife openstack server create -N #{@name_node}"+
229
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
230
+ " --template-file " + get_linux_template_file_path +
231
+ " --server-url http://localhost:8889" +
232
+ " --yes --server-create-timeout 1800" +
233
+ " --delete-server-on-failure" +
234
+ get_ssh_credentials +
235
+ " --identity-file #{temp_dir}/openstack.pem"+
236
+ append_openstack_creds + " --sudo"}
237
+
238
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
239
+
240
+ context "delete server by using name after create" do
241
+ let(:command) { "knife openstack server delete #{nodename} " + append_openstack_creds(is_list_cmd = true) + " --yes" }
242
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
243
+ end
244
+ end
245
+
246
+ context 'when delete-server-on-failure specified and bootstrap fails' do
247
+ before(:each) { create_node_name("linux") }
248
+
249
+ let(:command) { "knife openstack server create -N #{@name_node}"+
250
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
251
+ " --template-file " + get_linux_template_file_path +
252
+ " --server-url http://localhost:8889" +
253
+ " --yes --server-create-timeout 1800" +
254
+ " --delete-server-on-failure" +
255
+ get_ssh_credentials +
256
+ " --identity-file #{temp_dir}/incorrect_openstack.pem"+
257
+ append_openstack_creds() + " --sudo" }
258
+
259
+ run_cmd_check_status_and_output("fail", "FATAL: Authentication Failed during bootstrapping")
260
+ end
261
+
262
+ context 'when openstack credentials not specified' do
263
+ before(:each) { create_node_name("linux") }
264
+
265
+ let(:command) { "knife openstack server create -N #{@name_node}"+
266
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
267
+ " --template-file " + get_linux_template_file_path +
268
+ " --server-url http://localhost:8889" +
269
+ " --yes --server-create-timeout 1800" +
270
+ get_ssh_credentials +
271
+ " --identity-file #{temp_dir}/openstack.pem --sudo" }
272
+
273
+ run_cmd_check_status_and_output("fail", "ERROR: You did not provide a valid 'Openstack Username' value")
274
+ end
275
+
276
+ context 'when ssh-password and identity-file parameters not specified' do
277
+ before(:each) { create_node_name("linux") }
278
+
279
+ let(:command) { "knife openstack server create -N #{@name_node}"+
280
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
281
+ " --template-file " + get_linux_template_file_path +
282
+ " --server-url http://localhost:8889" +
283
+ " --yes" +
284
+ append_openstack_creds() + " --sudo" }
285
+
286
+ it { skip "Chef openstack setup not support this functionality."}
287
+ end
288
+
289
+ context 'when standard options and invalid openstack security group specified' do
290
+ before(:each) { create_node_name("linux") }
291
+
292
+ let(:command) { "knife openstack server create -N #{@name_node}"+
293
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
294
+ " --template-file " + get_linux_template_file_path +
295
+ " --server-url http://localhost:8889" +
296
+ " --yes" +
297
+ get_ssh_credentials +
298
+ " --identity-file #{temp_dir}/openstack.pem"+
299
+ " --openstack-groups invalid-invalid-1212"+
300
+ append_openstack_creds() + " --sudo"}
301
+
302
+ run_cmd_check_status_and_output("fail", "Security group invalid-invalid-1212 not found")
303
+ end
304
+
305
+ context 'when standard options and invalid image id specified' do
306
+ before(:each) { create_node_name("linux") }
307
+
308
+ let(:command) { "knife openstack server create -N #{@name_node}"+
309
+ " -I #{SecureRandom.hex(18)} -f #{@os_linux_flavor} "+
310
+ " --template-file " + get_linux_template_file_path +
311
+ " --server-url http://localhost:8889" +
312
+ " --yes" +
313
+ get_ssh_credentials +
314
+ " --identity-file #{temp_dir}/openstack.pem"+
315
+ append_openstack_creds() + " --sudo"}
316
+
317
+ run_cmd_check_status_and_output("fail", "ERROR: You have not provided a valid image ID. Please note the options for this value are -I or --image")
318
+ end
319
+
320
+ context 'when standard options and invalid flavor id specified' do
321
+ before(:each) { create_node_name("linux") }
322
+
323
+ let(:command) { "knife openstack server create -N #{@name_node}"+
324
+ " -I #{@os_linux_image} -f #{@os_invalid_flavor} "+
325
+ " --template-file " + get_linux_template_file_path +
326
+ " --server-url http://localhost:8889" +
327
+ " --yes" +
328
+ get_ssh_credentials +
329
+ " --identity-file #{temp_dir}/openstack.pem"+
330
+ append_openstack_creds() + " --sudo"}
331
+
332
+ run_cmd_check_status_and_output("fail", "ERROR: You have not provided a valid flavor ID. Please note the options for this value are -f or --flavor")
333
+ end
334
+
335
+ context 'when standard options and invalid floating ip specified' do
336
+ before(:each) { create_node_name("linux") }
337
+
338
+ let(:command) { "knife openstack server create -N #{@name_node}"+
339
+ " -I #{@os_linux_image} --openstack-floating-ip #{@os_invalid_floating_ip} "+
340
+ " --template-file " + get_linux_template_file_path +
341
+ " --server-url http://localhost:8889" +
342
+ " --yes" +
343
+ get_ssh_credentials +
344
+ " --identity-file #{temp_dir}/openstack.pem"+
345
+ append_openstack_creds() + " --sudo"}
346
+
347
+ run_cmd_check_status_and_output("fail", "ERROR: You have either requested an invalid floating IP address or none are available")
348
+ end
349
+
350
+ context 'when invalid key_pair specified' do
351
+ before(:each) { create_node_name("linux") }
352
+
353
+ let(:command) { "knife openstack server create -N #{@name_node}"+
354
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
355
+ " --template-file " + get_linux_template_file_path +
356
+ " --server-url http://localhost:8889" +
357
+ " --yes" +
358
+ " --ssh-user #{@os_ssh_user}"+
359
+ " --openstack-ssh-key-id #{SecureRandom.hex(6)}"+
360
+ " --identity-file #{temp_dir}/openstack.pem"+
361
+ append_openstack_creds() + " --sudo"}
362
+
363
+ run_cmd_check_status_and_output("fail", "Invalid key_name provided")
364
+ end
365
+
366
+ context 'when incorrect openstack private_key.pem file is used' do
367
+ server_create_common_bfr_aftr
368
+
369
+ let(:command) { "knife openstack server create -N #{@name_node}"+
370
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
371
+ " --template-file " + get_linux_template_file_path +
372
+ " --server-url http://localhost:8889" +
373
+ " --yes" +
374
+ " --ssh-user #{@os_ssh_user}"+
375
+ " --openstack-ssh-key-id #{@openstack_key_pair}"+
376
+ " --identity-file #{temp_dir}/incorrect_openstack.pem"+
377
+ append_openstack_creds() + " --sudo"}
378
+
379
+ run_cmd_check_status_and_output("fail", "FATAL: Authentication Failed during bootstrapping")
380
+ end
381
+
382
+ context 'when standard options and --openstack-private-network option specified' do
383
+ server_create_common_bfr_aftr
384
+
385
+ let(:command) { "knife openstack server create -N #{@name_node}"+
386
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
387
+ " --template-file " + get_linux_template_file_path +
388
+ " --server-url http://localhost:8889" +
389
+ " --yes" +
390
+ get_ssh_credentials +
391
+ " --identity-file #{temp_dir}/openstack.pem"+
392
+ " --openstack-private-network"+
393
+ append_openstack_creds() + " --sudo"}
394
+
395
+ it { skip "not yet supported" }
396
+ end
397
+
398
+ context 'when standard options and --openstack-floating-ip option specified' do
399
+ server_create_common_bfr_aftr
400
+
401
+ let(:command) { "knife openstack server create -N #{@name_node}"+
402
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
403
+ " --template-file " + get_linux_template_file_path +
404
+ " --server-url http://localhost:8889" +
405
+ " --yes" +
406
+ get_ssh_credentials +
407
+ " --identity-file #{temp_dir}/openstack.pem"+
408
+ " --openstack-floating-ip"+
409
+ append_openstack_creds() + " --sudo"}
410
+
411
+ it {skip 'empty floating ip pool'}
412
+ end
413
+
414
+ context 'when standard options and user data specified' do
415
+ before(:each) do
416
+ create_node_name("linux")
417
+ @user_data_file = create_sh_user_data_file
418
+ end
419
+
420
+ after do
421
+ # check user_data exists in server def
422
+ expect(cmd_output).to include("user_data=>\"#{@user_data_file.read}\"")
423
+ delete_sh_user_data_file(@user_data_file)
424
+ run(delete_instance_cmd("#{cmd_output}"))
425
+ end
426
+
427
+ let(:command) { "knife openstack server create -N #{@name_node}"+
428
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
429
+ " --template-file " + get_linux_template_file_path +
430
+ " --server-url http://localhost:8889" +
431
+ " --yes --server-create-timeout 1800" +
432
+ get_ssh_credentials +
433
+ " --identity-file #{temp_dir}/openstack.pem" +
434
+ " --user-data #{@user_data_file.path}" +
435
+ append_openstack_creds + " --sudo -VV"}
436
+
437
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
438
+ end
439
+
440
+ context 'when standard options and no network option specified' do
441
+ server_create_common_bfr_aftr
442
+
443
+ let(:command) { "knife openstack server create -N #{@name_node}"+
444
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
445
+ " --template-file " + get_linux_template_file_path +
446
+ " --server-url http://localhost:8889" +
447
+ " --yes --server-create-timeout 1800" +
448
+ " --no-network" +
449
+ get_ssh_credentials +
450
+ " --identity-file #{temp_dir}/openstack.pem"+
451
+ append_openstack_creds + " --sudo"}
452
+
453
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
454
+ end
455
+
456
+ context 'when standard options and openstack endpoint type option is specified' do
457
+ server_create_common_bfr_aftr
458
+
459
+ let(:command) { "knife openstack server create -N #{@name_node}"+
460
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
461
+ " --template-file " + get_linux_template_file_path +
462
+ " --server-url http://localhost:8889" +
463
+ " --yes --server-create-timeout 1800" +
464
+ " --openstack-endpoint-type publicURL" +
465
+ get_ssh_credentials +
466
+ " --identity-file #{temp_dir}/openstack.pem"+
467
+ append_openstack_creds + " --sudo"}
468
+
469
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
470
+ end
471
+
472
+ context 'when standard options and openstack metadata option is specified' do
473
+ server_create_common_bfr_aftr
474
+
475
+ let(:command) { "knife openstack server create -N #{@name_node}"+
476
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
477
+ " --template-file " + get_linux_template_file_path +
478
+ " --server-url http://localhost:8889" +
479
+ " --yes --server-create-timeout 1800" +
480
+ " --metadata testdataone='testmetadata'" +
481
+ get_ssh_credentials +
482
+ " --identity-file #{temp_dir}/openstack.pem"+
483
+ " --metadata testdatatwo='testmetadata'" +
484
+ append_openstack_creds + " --sudo"}
485
+
486
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
487
+ end
488
+
489
+ context 'when standard options and openstack network-ids option is specified' do
490
+ server_create_common_bfr_aftr
491
+
492
+ let(:command) { "knife openstack server create -N #{@name_node}"+
493
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
494
+ " --template-file " + get_linux_template_file_path +
495
+ " --server-url http://localhost:8889" +
496
+ " --yes --server-create-timeout 1800" +
497
+ " --network-ids #{@os_network_ids} " +
498
+ get_ssh_credentials +
499
+ " --identity-file #{temp_dir}/openstack.pem"+
500
+ append_openstack_creds + " --sudo"}
501
+
502
+ it {skip 'Chef openstack setup not support this functionality'}
503
+ end
504
+
505
+ context 'when standard options and openstack availability-zone option is specified' do
506
+ server_create_common_bfr_aftr
507
+
508
+ let(:command) { "knife openstack server create -N #{@name_node}"+
509
+ " -I #{@os_linux_image} -f #{@os_linux_flavor} "+
510
+ " --template-file " + get_linux_template_file_path +
511
+ " --server-url http://localhost:8889" +
512
+ " --yes --server-create-timeout 1800" +
513
+ " --availability-zone #{@os_availability_zone} " +
514
+ get_ssh_credentials +
515
+ " --identity-file #{temp_dir}/openstack.pem"+
516
+ append_openstack_creds + " --sudo"}
517
+
518
+ it {skip 'Chef openstack setup not support this functionality'}
519
+ end
520
+ end
521
+
522
+ describe 'create and bootstrap Windows Server' do
523
+ before(:each) {rm_known_host}
524
+
525
+ context 'when standard options specified' do
526
+ cmd_out = ""
527
+
528
+ before(:each) { create_node_name("windows") }
529
+
530
+ let(:command) { "knife openstack server create -N #{@name_node}" +
531
+ " -I #{@os_windows_image} " +
532
+ " -f #{@os_windows_flavor} " +
533
+ " --template-file " + get_windows_msi_template_file_path +
534
+ " --server-url http://localhost:8889" +
535
+ " --bootstrap-protocol winrm" +
536
+ " --yes --server-create-timeout 1800" +
537
+ get_winrm_credentials+
538
+ append_openstack_creds_for_windows() }
539
+
540
+ after { cmd_out = "#{cmd_output}" }
541
+
542
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
543
+
544
+ context "delete server after create" do
545
+ let(:command) { delete_instance_cmd(cmd_out) }
546
+ run_cmd_check_status_and_output("succeed")
547
+ end
548
+ end
549
+
550
+ context 'when invalid winrm user specified' do
551
+ server_create_common_bfr_aftr("windows")
552
+
553
+ let(:command) { "knife openstack server create -N #{@name_node}" +
554
+ " -I #{@os_windows_image} " +
555
+ " -f #{@os_windows_flavor} " +
556
+ " --template-file " + get_windows_msi_template_file_path +
557
+ " --server-url http://localhost:8889" +
558
+ " --bootstrap-protocol winrm" +
559
+ " --yes --server-create-timeout 1800" +
560
+ " --winrm-user #{SecureRandom.hex(6)}"+
561
+ " --winrm-password #{@os_winrm_password}" +
562
+ append_openstack_creds_for_windows() }
563
+ it { skip "Fails due to OC-9708 bug in knife-windows." }
564
+ end
565
+
566
+ context 'when invalid winrm password specified' do
567
+ server_create_common_bfr_aftr("windows")
568
+
569
+ let(:command) { "knife openstack server create -N #{@name_node}" +
570
+ " -I #{@os_windows_image} " +
571
+ " -f #{@os_windows_flavor} " +
572
+ " --template-file " + get_windows_msi_template_file_path +
573
+ " --server-url http://localhost:8889" +
574
+ " --bootstrap-protocol winrm" +
575
+ " --yes --server-create-timeout 1800" +
576
+ " --winrm-user #{@os_winrm_user}"+
577
+ " --winrm-password #{SecureRandom.hex(6)}" +
578
+ append_openstack_creds_for_windows() }
579
+ after(:each) { run(delete_instance_cmd("#{cmd_output}")) }
580
+
581
+ it { skip "Fails due to OC-9708 bug in knife-windows." }
582
+ end
583
+
584
+ context 'when standard options ssh bootstrap and valid image-os-type protocol specified' do
585
+ server_create_common_bfr_aftr("windows")
586
+
587
+ let(:command) { "knife openstack server create -N #{@name_node}"+
588
+ " -I #{@os_windows_ssh_image}"+
589
+ " -f #{@os_windows_flavor} "+
590
+ " --template-file " + get_windows_msi_template_file_path +
591
+ " --server-url http://localhost:8889" +
592
+ " --yes --server-create-timeout 1800" +
593
+ " --identity-file #{temp_dir}/openstack.pem"+
594
+ " --openstack-ssh-key-id #{@openstack_key_pair}"+
595
+ get_ssh_credentials_for_windows_image+
596
+ append_openstack_creds() + " --image-os-type windows" }
597
+
598
+ run_cmd_check_status_and_output("succeed", "#{@name_node}")
599
+ end
600
+
601
+ context 'when standard options ssh bootstrap and invalid image-os-type protocol specified' do
602
+ before(:each) { create_node_name("windows") }
603
+
604
+ let(:command) { "knife openstack server create -N #{@name_node}"+
605
+ " -I #{@os_windows_ssh_image}"+
606
+ " -f #{@os_windows_flavor} "+
607
+ " --template-file " + get_windows_msi_template_file_path +
608
+ " --server-url http://localhost:8889" +
609
+ " --yes --server-create-timeout 1800" +
610
+ " --identity-file #{temp_dir}/openstack.pem"+
611
+ " --openstack-ssh-key-id #{@openstack_key_pair}"+
612
+ get_ssh_credentials_for_windows_image+
613
+ append_openstack_creds() + " --image-os-type invalid" }
614
+
615
+ run_cmd_check_status_and_output("fail", "ERROR: You must provide --image-os-type option [windows/linux]")
616
+ end
617
+ end
618
+ end