knife-rackspace 0.11.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.github/ISSUE_TEMPLATE.md +21 -0
- data/.travis.yml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +8 -1
- data/README.md +230 -0
- data/Rakefile +18 -18
- data/knife-rackspace.gemspec +7 -11
- data/lib/chef/knife/rackspace_base.rb +28 -28
- data/lib/chef/knife/rackspace_flavor_list.rb +17 -17
- data/lib/chef/knife/rackspace_image_list.rb +5 -5
- data/lib/chef/knife/rackspace_network_create.rb +4 -4
- data/lib/chef/knife/rackspace_network_delete.rb +2 -2
- data/lib/chef/knife/rackspace_network_list.rb +4 -4
- data/lib/chef/knife/rackspace_server_create.rb +78 -81
- data/lib/chef/knife/rackspace_server_delete.rb +8 -8
- data/lib/chef/knife/rackspace_server_list.rb +19 -15
- data/lib/knife-rackspace/version.rb +2 -2
- data/spec/integration_spec_helper.rb +30 -30
- data/spec/spec_helper.rb +3 -3
- data/spec/unit/rackspace_base_spec.rb +8 -8
- metadata +23 -78
- data/README.rdoc +0 -225
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Seth Chisamore (<schisamo@
|
3
|
-
# Copyright:: Copyright (c) 2011
|
2
|
+
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2011-2016 Chef Software, Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require
|
19
|
+
require "chef/knife/rackspace_base"
|
20
20
|
|
21
21
|
class Chef
|
22
22
|
class Knife
|
@@ -28,8 +28,8 @@ class Chef
|
|
28
28
|
|
29
29
|
def run
|
30
30
|
image_list = [
|
31
|
-
ui.color(
|
32
|
-
ui.color(
|
31
|
+
ui.color("ID", :bold),
|
32
|
+
ui.color("Name", :bold),
|
33
33
|
]
|
34
34
|
|
35
35
|
connection.images.sort_by(&:name).each do |image|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef/knife/rackspace_base"
|
2
2
|
|
3
3
|
class Chef
|
4
4
|
class Knife
|
@@ -26,9 +26,9 @@ class Chef
|
|
26
26
|
exit 1
|
27
27
|
else
|
28
28
|
networks_list = [
|
29
|
-
ui.color(
|
30
|
-
ui.color(
|
31
|
-
ui.color(
|
29
|
+
ui.color("Label", :bold),
|
30
|
+
ui.color("CIDR", :bold),
|
31
|
+
ui.color("ID", :bold),
|
32
32
|
]
|
33
33
|
end
|
34
34
|
options = {}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef/knife/rackspace_base"
|
2
2
|
|
3
3
|
class Chef
|
4
4
|
class Knife
|
@@ -15,7 +15,7 @@ class Chef
|
|
15
15
|
else
|
16
16
|
@name_args.each do |net_id|
|
17
17
|
network = connection.networks.get(net_id)
|
18
|
-
unless
|
18
|
+
unless network
|
19
19
|
ui.error "Could not locate network: #{net_id}"
|
20
20
|
exit 1
|
21
21
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "chef/knife/rackspace_base"
|
2
2
|
|
3
3
|
class Chef
|
4
4
|
class Knife
|
@@ -14,9 +14,9 @@ class Chef
|
|
14
14
|
exit 1
|
15
15
|
else
|
16
16
|
networks_list = [
|
17
|
-
ui.color(
|
18
|
-
ui.color(
|
19
|
-
ui.color(
|
17
|
+
ui.color("Label", :bold),
|
18
|
+
ui.color("CIDR", :bold),
|
19
|
+
ui.color("ID", :bold),
|
20
20
|
]
|
21
21
|
end
|
22
22
|
connection.networks.sort_by(&:id).each do |network|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Adam Jacob (<adam@
|
3
|
-
# Author:: Matt Ray (<matt@
|
4
|
-
# Copyright:: Copyright (c) 2009-
|
2
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
+
# Author:: Matt Ray (<matt@chef.io>)
|
4
|
+
# Copyright:: Copyright (c) 2009-2016 Chef Software, Inc.
|
5
5
|
# License:: Apache License, Version 2.0
|
6
6
|
#
|
7
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,9 +17,9 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
20
|
+
require "chef/knife/rackspace_base"
|
21
|
+
require "chef/knife/winrm_base"
|
22
|
+
require "chef/knife"
|
23
23
|
|
24
24
|
class Chef
|
25
25
|
class Knife
|
@@ -28,12 +28,11 @@ class Chef
|
|
28
28
|
include Knife::RackspaceBase
|
29
29
|
include Chef::Knife::WinrmBase
|
30
30
|
|
31
|
-
|
32
31
|
deps do
|
33
|
-
require
|
34
|
-
require
|
35
|
-
require
|
36
|
-
require
|
32
|
+
require "fog/rackspace"
|
33
|
+
require "readline"
|
34
|
+
require "chef/json_compat"
|
35
|
+
require "chef/knife/bootstrap"
|
37
36
|
Chef::Knife::Bootstrap.load_deps
|
38
37
|
end
|
39
38
|
|
@@ -79,7 +78,7 @@ class Chef
|
|
79
78
|
option :bootstrap_network,
|
80
79
|
:long => "--bootstrap-network LABEL",
|
81
80
|
:description => "Use IP address on this network for bootstrap",
|
82
|
-
:default =>
|
81
|
+
:default => "public"
|
83
82
|
|
84
83
|
option :private_network,
|
85
84
|
:long => "--private-network",
|
@@ -160,8 +159,8 @@ class Chef
|
|
160
159
|
:default => false
|
161
160
|
|
162
161
|
option :rackconnect_v3_network_id,
|
163
|
-
:long =>
|
164
|
-
:description =>
|
162
|
+
:long => "--rackconnect-v3-network-id ID",
|
163
|
+
:description => "Rackconnect V3 ONLY: Link a new server to an existing network",
|
165
164
|
:proc => lambda { |o| Chef::Config[:knife][:rackconnect_v3_network_id] = o },
|
166
165
|
:default => nil
|
167
166
|
|
@@ -214,7 +213,7 @@ class Chef
|
|
214
213
|
:default => true
|
215
214
|
|
216
215
|
option :network,
|
217
|
-
:long =>
|
216
|
+
:long => "--network [LABEL_OR_ID]",
|
218
217
|
:description => "Add private network. Use multiple --network options to specify multiple networks.",
|
219
218
|
:proc => Proc.new{ |name|
|
220
219
|
Chef::Config[:knife][:rackspace_networks] ||= []
|
@@ -230,7 +229,7 @@ class Chef
|
|
230
229
|
:long => "--server-create-timeout timeout",
|
231
230
|
:description => "How long to wait until the server is ready; default is 1200 seconds",
|
232
231
|
:default => 1200,
|
233
|
-
:proc => Proc.new { |v| Chef::Config[:knife][:server_create_timeout] = v}
|
232
|
+
:proc => Proc.new { |v| Chef::Config[:knife][:server_create_timeout] = v }
|
234
233
|
|
235
234
|
option :bootstrap_proxy,
|
236
235
|
:long => "--bootstrap-proxy PROXY_URL",
|
@@ -265,15 +264,15 @@ class Chef
|
|
265
264
|
:proc => Proc.new { |sf| Chef::Config[:knife][:secret_file] = sf }
|
266
265
|
|
267
266
|
option :bootstrap_vault_file,
|
268
|
-
:long =>
|
269
|
-
:description =>
|
267
|
+
:long => "--bootstrap-vault-file VAULT_FILE",
|
268
|
+
:description => "A JSON file with a list of vault(s) and item(s) to be updated"
|
270
269
|
|
271
270
|
option :bootstrap_vault_json,
|
272
|
-
:long =>
|
273
|
-
:description =>
|
271
|
+
:long => "--bootstrap-vault-json VAULT_JSON",
|
272
|
+
:description => "A JSON string with the vault(s) and item(s) to be updated"
|
274
273
|
|
275
274
|
option :bootstrap_vault_item,
|
276
|
-
:long =>
|
275
|
+
:long => "--bootstrap-vault-item VAULT_ITEM",
|
277
276
|
:description => 'A single vault and item to update as "vault:item"',
|
278
277
|
:proc => Proc.new { |i|
|
279
278
|
(vault, item) = i.split(/:/)
|
@@ -284,11 +283,11 @@ class Chef
|
|
284
283
|
}
|
285
284
|
|
286
285
|
def load_winrm_deps
|
287
|
-
require
|
288
|
-
require
|
289
|
-
require
|
290
|
-
require
|
291
|
-
require
|
286
|
+
require "winrm"
|
287
|
+
require "em-winrm"
|
288
|
+
require "chef/knife/bootstrap_windows_winrm"
|
289
|
+
require "chef/knife/core/windows_bootstrap_context"
|
290
|
+
require "chef/knife/winrm"
|
292
291
|
end
|
293
292
|
|
294
293
|
def tcp_test_ssh(server, bootstrap_ip)
|
@@ -298,7 +297,7 @@ class Chef
|
|
298
297
|
count = 0
|
299
298
|
|
300
299
|
begin
|
301
|
-
Net::SSH.start(bootstrap_ip,
|
300
|
+
Net::SSH.start(bootstrap_ip, "root", :password => server.password ) do |ssh|
|
302
301
|
Chef::Log.debug("sshd accepting connections on #{bootstrap_ip}")
|
303
302
|
break
|
304
303
|
end
|
@@ -306,7 +305,7 @@ class Chef
|
|
306
305
|
count += 1
|
307
306
|
|
308
307
|
if count <= limit
|
309
|
-
print
|
308
|
+
print "."
|
310
309
|
sleep locate_config_value(:retry_ssh_every).to_i
|
311
310
|
tcp_test_ssh(server, bootstrap_ip)
|
312
311
|
else
|
@@ -317,7 +316,7 @@ class Chef
|
|
317
316
|
end
|
318
317
|
|
319
318
|
def parse_file_argument(arg)
|
320
|
-
dest, src = arg.split(
|
319
|
+
dest, src = arg.split("=")
|
321
320
|
unless dest && src
|
322
321
|
ui.error "Unable to process file arguments #{arg}. The --file option requires both the destination on the remote machine as well as the local source be supplied using the form DESTINATION-PATH=SOURCE-PATH"
|
323
322
|
exit 1
|
@@ -337,7 +336,7 @@ class Chef
|
|
337
336
|
end
|
338
337
|
|
339
338
|
def files
|
340
|
-
return {} unless
|
339
|
+
return {} unless Chef::Config[:knife][:file]
|
341
340
|
|
342
341
|
files = []
|
343
342
|
Chef::Config[:knife][:file].each do |arg|
|
@@ -345,14 +344,12 @@ class Chef
|
|
345
344
|
Chef::Log.debug("Inject file #{src} into #{dest}")
|
346
345
|
files << {
|
347
346
|
:path => dest,
|
348
|
-
:contents => encode_file(src)
|
347
|
+
:contents => encode_file(src),
|
349
348
|
}
|
350
349
|
end
|
351
350
|
files
|
352
351
|
end
|
353
352
|
|
354
|
-
|
355
|
-
|
356
353
|
def tcp_test_winrm(hostname, port)
|
357
354
|
TCPSocket.new(hostname, port)
|
358
355
|
return true
|
@@ -389,7 +386,7 @@ class Chef
|
|
389
386
|
}
|
390
387
|
|
391
388
|
# Maybe deprecate this option at some point
|
392
|
-
config[:bootstrap_network] =
|
389
|
+
config[:bootstrap_network] = "private" if locate_config_value(:private_network)
|
393
390
|
|
394
391
|
flavor_id = locate_config_value(:flavor)
|
395
392
|
flavor = connection.flavors.get(flavor_id)
|
@@ -406,25 +403,25 @@ class Chef
|
|
406
403
|
# In the case we are trying to create one of these flavors, we should
|
407
404
|
# swap out the image_id argument with the boot_image_id argument.
|
408
405
|
if flavor.disk == 0
|
409
|
-
server_create_options[:image_id] =
|
406
|
+
server_create_options[:image_id] = ""
|
410
407
|
server_create_options[:boot_volume_id] = locate_config_value(:boot_volume_id)
|
411
408
|
server_create_options[:boot_image_id] = locate_config_value(:image)
|
412
409
|
server_create_options[:boot_volume_size] = locate_config_value(:boot_volume_size)
|
413
410
|
|
414
411
|
if server_create_options[:boot_image_id] && server_create_options[:boot_volume_id]
|
415
|
-
ui.error(
|
412
|
+
ui.error("Please specify either --boot-volume-id (-B) or --image (-I)")
|
416
413
|
exit 1
|
417
414
|
end
|
418
415
|
else
|
419
416
|
server_create_options[:image_id] = locate_config_value(:image)
|
420
417
|
|
421
418
|
if !server_create_options[:image_id]
|
422
|
-
ui.error(
|
419
|
+
ui.error("Please specify an Image ID for the server with --image (-I)")
|
423
420
|
exit 1
|
424
421
|
end
|
425
422
|
end
|
426
423
|
|
427
|
-
if locate_config_value(:bootstrap_protocol) ==
|
424
|
+
if locate_config_value(:bootstrap_protocol) == "winrm"
|
428
425
|
load_winrm_deps
|
429
426
|
end
|
430
427
|
|
@@ -448,36 +445,36 @@ class Chef
|
|
448
445
|
msg_pair("Metadata", server.metadata.all)
|
449
446
|
msg_pair("ConfigDrive", server.config_drive)
|
450
447
|
msg_pair("UserData", locate_config_value(:rackspace_user_data))
|
451
|
-
msg_pair("RackConnect Wait", rackconnect_wait ?
|
452
|
-
msg_pair("RackConnect V3", locate_config_value(:rackconnect_v3_network_id) ?
|
453
|
-
msg_pair("ServiceLevel Wait", rackspace_servicelevel_wait ?
|
448
|
+
msg_pair("RackConnect Wait", rackconnect_wait ? "yes" : "no")
|
449
|
+
msg_pair("RackConnect V3", locate_config_value(:rackconnect_v3_network_id) ? "yes" : "no")
|
450
|
+
msg_pair("ServiceLevel Wait", rackspace_servicelevel_wait ? "yes" : "no")
|
454
451
|
msg_pair("SSH Key", locate_config_value(:rackspace_ssh_keypair))
|
455
452
|
|
456
453
|
# wait for it to be ready to do stuff
|
457
454
|
begin
|
458
|
-
server.wait_for(Integer(locate_config_value(:server_create_timeout)))
|
455
|
+
server.wait_for(Integer(locate_config_value(:server_create_timeout))) do
|
459
456
|
print ".";
|
460
457
|
Chef::Log.debug("#{progress}%")
|
461
458
|
|
462
|
-
if rackconnect_wait
|
459
|
+
if rackconnect_wait && rackspace_servicelevel_wait
|
463
460
|
Chef::Log.debug("rackconnect_automation_status: #{metadata.all['rackconnect_automation_status']}")
|
464
461
|
Chef::Log.debug("rax_service_level_automation: #{metadata.all['rax_service_level_automation']}")
|
465
|
-
ready?
|
462
|
+
ready? && metadata.all["rackconnect_automation_status"] == "DEPLOYED" && metadata.all["rax_service_level_automation"] == "Complete"
|
466
463
|
elsif rackconnect_wait
|
467
464
|
Chef::Log.debug("rackconnect_automation_status: #{metadata.all['rackconnect_automation_status']}")
|
468
|
-
ready?
|
465
|
+
ready? && metadata.all["rackconnect_automation_status"] == "DEPLOYED"
|
469
466
|
elsif rackspace_servicelevel_wait
|
470
467
|
Chef::Log.debug("rax_service_level_automation: #{metadata.all['rax_service_level_automation']}")
|
471
|
-
ready?
|
468
|
+
ready? && metadata.all["rax_service_level_automation"] == "Complete"
|
472
469
|
else
|
473
470
|
ready?
|
474
471
|
end
|
475
|
-
|
472
|
+
end
|
476
473
|
rescue Fog::Errors::TimeoutError
|
477
|
-
ui.error(
|
478
|
-
msg_pair(
|
479
|
-
msg_pair(
|
480
|
-
msg_pair(
|
474
|
+
ui.error("Timeout waiting for the server to be created")
|
475
|
+
msg_pair("Progress", "#{server.progress}%")
|
476
|
+
msg_pair("rackconnect_automation_status", server.metadata.all["rackconnect_automation_status"])
|
477
|
+
msg_pair("rax_service_level_automation", server.metadata.all["rax_service_level_automation"])
|
481
478
|
Chef::Application.fatal! 'Server didn\'t finish on time'
|
482
479
|
end
|
483
480
|
|
@@ -497,12 +494,12 @@ class Chef
|
|
497
494
|
end
|
498
495
|
|
499
496
|
if server_create_options[:networks] && locate_config_value(:rackspace_networks)
|
500
|
-
msg_pair("Networks", locate_config_value(:rackspace_networks).sort.join(
|
497
|
+
msg_pair("Networks", locate_config_value(:rackspace_networks).sort.join(", "))
|
501
498
|
end
|
502
499
|
|
503
500
|
msg_pair("Public DNS Name", public_dns_name(server))
|
504
|
-
msg_pair("Public IP Address", ip_address(server,
|
505
|
-
msg_pair("Private IP Address", ip_address(server,
|
501
|
+
msg_pair("Public IP Address", ip_address(server, "public"))
|
502
|
+
msg_pair("Private IP Address", ip_address(server, "private"))
|
506
503
|
msg_pair("Password", server.password)
|
507
504
|
msg_pair("Metadata", server.metadata.all)
|
508
505
|
|
@@ -514,7 +511,7 @@ class Chef
|
|
514
511
|
exit 1
|
515
512
|
end
|
516
513
|
|
517
|
-
if locate_config_value(:bootstrap_protocol) ==
|
514
|
+
if locate_config_value(:bootstrap_protocol) == "winrm"
|
518
515
|
print "\n#{ui.color("Waiting for winrm", :magenta)}"
|
519
516
|
print(".") until tcp_test_winrm(bootstrap_ip_address, locate_config_value(:winrm_port))
|
520
517
|
bootstrap_for_windows_node(server, bootstrap_ip_address).run
|
@@ -533,11 +530,11 @@ class Chef
|
|
533
530
|
msg_pair("Boot Image ID", server.boot_image_id) if server.boot_image_id
|
534
531
|
msg_pair("Metadata", server.metadata)
|
535
532
|
msg_pair("Public DNS Name", public_dns_name(server))
|
536
|
-
msg_pair("Public IP Address", ip_address(server,
|
537
|
-
msg_pair("Private IP Address", ip_address(server,
|
533
|
+
msg_pair("Public IP Address", ip_address(server, "public"))
|
534
|
+
msg_pair("Private IP Address", ip_address(server, "private"))
|
538
535
|
msg_pair("Password", server.password)
|
539
|
-
msg_pair("Environment", config[:environment] ||
|
540
|
-
msg_pair("Run List", config[:run_list].join(
|
536
|
+
msg_pair("Environment", config[:environment] || "_default")
|
537
|
+
msg_pair("Run List", config[:run_list].join(", "))
|
541
538
|
end
|
542
539
|
|
543
540
|
def setup_rackconnect_network!(server)
|
@@ -549,8 +546,8 @@ class Chef
|
|
549
546
|
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
550
547
|
begin
|
551
548
|
req = Net::HTTP::Post.new(uri.request_uri)
|
552
|
-
req[
|
553
|
-
req[
|
549
|
+
req["X-Auth-Token"] = auth_token
|
550
|
+
req["Content-Type"] = "application/json"
|
554
551
|
req.body = JSON.dump("cloud_server" => { "id" => server.id })
|
555
552
|
http.use_ssl = true
|
556
553
|
http.request req
|
@@ -586,8 +583,8 @@ class Chef
|
|
586
583
|
bootstrap.config[:bootstrap_vault_json] = locate_config_value(:bootstrap_vault_json) if locate_config_value(:bootstrap_vault_json)
|
587
584
|
bootstrap.config[:bootstrap_vault_item] = locate_config_value(:bootstrap_vault_item) if locate_config_value(:bootstrap_vault_item)
|
588
585
|
# bootstrap will run as root...sudo (by default) also messes up Ohai on CentOS boxes
|
589
|
-
bootstrap.config[:use_sudo] = true unless locate_config_value(:ssh_user) ==
|
590
|
-
bootstrap.config[:distro] = locate_config_value(:distro)
|
586
|
+
bootstrap.config[:use_sudo] = true unless locate_config_value(:ssh_user) == "root"
|
587
|
+
bootstrap.config[:distro] = locate_config_value(:distro) || "chef-full"
|
591
588
|
bootstrap_common_params(bootstrap, server)
|
592
589
|
end
|
593
590
|
|
@@ -608,7 +605,7 @@ class Chef
|
|
608
605
|
# bootstrap.config[:encrypted_data_bag_secret] = config[:encrypted_data_bag_secret]
|
609
606
|
# bootstrap.config[:encrypted_data_bag_secret_file] = config[:encrypted_data_bag_secret_file]
|
610
607
|
bootstrap.config[:secret] = locate_config_value(:secret)
|
611
|
-
bootstrap.config[:secret_file] = locate_config_value(:secret_file)
|
608
|
+
bootstrap.config[:secret_file] = locate_config_value(:secret_file) || ""
|
612
609
|
|
613
610
|
Chef::Config[:knife][:hints] ||= {}
|
614
611
|
Chef::Config[:knife][:hints]["rackspace"] ||= {}
|
@@ -618,11 +615,11 @@ class Chef
|
|
618
615
|
def bootstrap_for_windows_node(server, bootstrap_ip_address)
|
619
616
|
bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
|
620
617
|
bootstrap.name_args = [bootstrap_ip_address]
|
621
|
-
bootstrap.config[:winrm_user] = locate_config_value(:winrm_user) ||
|
618
|
+
bootstrap.config[:winrm_user] = locate_config_value(:winrm_user) || "Administrator"
|
622
619
|
bootstrap.config[:winrm_password] = locate_config_value(:winrm_password) || server.password
|
623
620
|
bootstrap.config[:winrm_transport] = locate_config_value(:winrm_transport)
|
624
621
|
bootstrap.config[:winrm_port] = locate_config_value(:winrm_port)
|
625
|
-
bootstrap.config[:distro] = locate_config_value(:distro)
|
622
|
+
bootstrap.config[:distro] = locate_config_value(:distro) || "windows-chef-client-msi"
|
626
623
|
bootstrap_common_params(bootstrap, server)
|
627
624
|
end
|
628
625
|
|
@@ -631,29 +628,29 @@ class Chef
|
|
631
628
|
def get_node_name(chef_node_name)
|
632
629
|
return chef_node_name unless chef_node_name.nil?
|
633
630
|
#lazy uuids
|
634
|
-
chef_node_name = "rs-"+rand.to_s.split(
|
631
|
+
chef_node_name = "rs-" + rand.to_s.split(".")[1] unless version_one?
|
635
632
|
end
|
636
633
|
|
637
|
-
def get_networks(names, rackconnect3=false)
|
634
|
+
def get_networks(names, rackconnect3 = false)
|
638
635
|
names = Array(names)
|
639
636
|
|
640
|
-
if
|
637
|
+
if locate_config_value(:rackspace_version) == "v2"
|
641
638
|
nets = if rackconnect3
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
639
|
+
[locate_config_value(:rackconnect_v3_network_id)]
|
640
|
+
elsif locate_config_value(:default_networks)
|
641
|
+
[
|
642
|
+
"00000000-0000-0000-0000-000000000000",
|
643
|
+
"11111111-1111-1111-1111-111111111111",
|
644
|
+
]
|
645
|
+
else
|
646
|
+
[]
|
647
|
+
end
|
651
648
|
|
652
649
|
available_networks = connection.networks.all
|
653
650
|
|
654
651
|
names.each do |name|
|
655
|
-
net = available_networks.detect{|n| n.label == name || n.id == name}
|
656
|
-
if
|
652
|
+
net = available_networks.detect { |n| n.label == name || n.id == name }
|
653
|
+
if net
|
657
654
|
nets << net.id
|
658
655
|
else
|
659
656
|
ui.error("Failed to locate network: #{name}")
|
@@ -661,7 +658,7 @@ class Chef
|
|
661
658
|
end
|
662
659
|
end
|
663
660
|
nets
|
664
|
-
elsif
|
661
|
+
elsif names && !names.empty?
|
665
662
|
ui.error("Custom networks are only available in v2 API")
|
666
663
|
exit 1
|
667
664
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Adam Jacob (<adam@
|
3
|
-
# Author:: Matt Ray (<matt@
|
4
|
-
# Copyright:: Copyright (c) 2009-
|
2
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
+
# Author:: Matt Ray (<matt@chef.io>)
|
4
|
+
# Copyright:: Copyright (c) 2009-2016 Chef Software, Inc.
|
5
5
|
# License:: Apache License, Version 2.0
|
6
6
|
#
|
7
7
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -17,11 +17,11 @@
|
|
17
17
|
# limitations under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
20
|
+
require "chef/knife/rackspace_base"
|
21
21
|
|
22
22
|
# These two are needed for the '--purge' deletion case
|
23
|
-
require
|
24
|
-
require
|
23
|
+
require "chef/node"
|
24
|
+
require "chef/api_client"
|
25
25
|
|
26
26
|
class Chef
|
27
27
|
class Knife
|
@@ -68,8 +68,8 @@ class Chef
|
|
68
68
|
msg_pair("Flavor", server.flavor.name)
|
69
69
|
msg_pair("Image", server.image.name) if server.image
|
70
70
|
msg_pair("Boot Image ID", server.boot_image_id) if server.boot_image_id
|
71
|
-
msg_pair("Public IP Address", ip_address(server,
|
72
|
-
msg_pair("Private IP Address", ip_address(server,
|
71
|
+
msg_pair("Public IP Address", ip_address(server, "public"))
|
72
|
+
msg_pair("Private IP Address", ip_address(server, "private"))
|
73
73
|
|
74
74
|
puts "\n"
|
75
75
|
confirm("Do you really want to delete this server")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Adam Jacob (<adam@
|
3
|
-
# Copyright:: Copyright (c) 2009
|
2
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2009-2016 Chef Software, Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require
|
19
|
+
require "chef/knife/rackspace_base"
|
20
20
|
|
21
21
|
class Chef
|
22
22
|
class Knife
|
@@ -30,34 +30,38 @@ class Chef
|
|
30
30
|
$stdout.sync = true
|
31
31
|
|
32
32
|
server_list = [
|
33
|
-
ui.color(
|
34
|
-
ui.color(
|
35
|
-
ui.color(
|
36
|
-
ui.color(
|
37
|
-
ui.color(
|
38
|
-
ui.color('Image', :bold),
|
39
|
-
ui.color('State', :bold)
|
33
|
+
ui.color("Instance ID", :bold),
|
34
|
+
ui.color("Name", :bold),
|
35
|
+
ui.color("Flavor", :bold),
|
36
|
+
ui.color("Image", :bold),
|
37
|
+
ui.color("State", :bold),
|
40
38
|
]
|
39
|
+
if version_one?
|
40
|
+
network_list = %w{public private}
|
41
|
+
else
|
42
|
+
network_list = connection.images.sort_by(&:name).collect { |t| t.label }
|
43
|
+
end
|
44
|
+
server_list.insert(2, network_list.collect { |n| ui.color("#{n.capitalize} IP", :bold) }).flatten!
|
45
|
+
num_columns_across = server_list.length
|
41
46
|
connection.servers.all.each do |server|
|
42
47
|
server = connection.servers.get(server.id)
|
43
48
|
server_list << server.id.to_s
|
44
49
|
server_list << server.name
|
45
|
-
server_list
|
46
|
-
server_list << ip_address(server, 'private')
|
50
|
+
server_list += network_list.collect { |n| ip_address(server, n) }
|
47
51
|
server_list << (server.flavor_id == nil ? "" : server.flavor_id.to_s)
|
48
52
|
server_list << (server.image_id == nil ? "" : server.image_id.to_s)
|
49
53
|
server_list << begin
|
50
54
|
case server.state.downcase
|
51
|
-
when
|
55
|
+
when "deleted", "suspended"
|
52
56
|
ui.color(server.state.downcase, :red)
|
53
|
-
when
|
57
|
+
when "build", "unknown"
|
54
58
|
ui.color(server.state.downcase, :yellow)
|
55
59
|
else
|
56
60
|
ui.color(server.state.downcase, :green)
|
57
61
|
end
|
58
62
|
end
|
59
63
|
end
|
60
|
-
puts ui.list(server_list, :uneven_columns_across,
|
64
|
+
puts ui.list(server_list, :uneven_columns_across, num_columns_across)
|
61
65
|
end
|
62
66
|
end
|
63
67
|
end
|