knife-azure 1.8.7 → 1.9.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/lib/azure/azure_interface.rb +79 -81
- data/lib/azure/custom_errors.rb +34 -35
- data/lib/azure/helpers.rb +43 -44
- data/lib/azure/resource_management/ARM_deployment_template.rb +679 -678
- data/lib/azure/resource_management/ARM_interface.rb +513 -515
- data/lib/azure/resource_management/vnet_config.rb +43 -43
- data/lib/azure/resource_management/windows_credentials.rb +181 -184
- data/lib/azure/service_management/ASM_interface.rb +309 -317
- data/lib/azure/service_management/ag.rb +16 -16
- data/lib/azure/service_management/certificate.rb +30 -31
- data/lib/azure/service_management/connection.rb +31 -31
- data/lib/azure/service_management/deploy.rb +40 -38
- data/lib/azure/service_management/disk.rb +14 -10
- data/lib/azure/service_management/host.rb +28 -24
- data/lib/azure/service_management/image.rb +23 -22
- data/lib/azure/service_management/loadbalancer.rb +12 -12
- data/lib/azure/service_management/rest.rb +20 -19
- data/lib/azure/service_management/role.rb +274 -273
- data/lib/azure/service_management/storageaccount.rb +29 -25
- data/lib/azure/service_management/utility.rb +6 -7
- data/lib/azure/service_management/vnet.rb +44 -44
- data/lib/chef/knife/azure_ag_create.rb +18 -18
- data/lib/chef/knife/azure_ag_list.rb +3 -3
- data/lib/chef/knife/azure_base.rb +56 -56
- data/lib/chef/knife/azure_image_list.rb +8 -10
- data/lib/chef/knife/azure_internal-lb_create.rb +15 -15
- data/lib/chef/knife/azure_internal-lb_list.rb +3 -3
- data/lib/chef/knife/azure_server_create.rb +49 -50
- data/lib/chef/knife/azure_server_delete.rb +22 -24
- data/lib/chef/knife/azure_server_list.rb +4 -4
- data/lib/chef/knife/azure_server_show.rb +5 -5
- data/lib/chef/knife/azure_vnet_create.rb +17 -17
- data/lib/chef/knife/azure_vnet_list.rb +3 -3
- data/lib/chef/knife/azurerm_base.rb +58 -60
- data/lib/chef/knife/azurerm_server_create.rb +23 -22
- data/lib/chef/knife/azurerm_server_delete.rb +30 -34
- data/lib/chef/knife/azurerm_server_list.rb +42 -42
- data/lib/chef/knife/azurerm_server_show.rb +1 -1
- data/lib/chef/knife/bootstrap/bootstrap_options.rb +7 -8
- data/lib/chef/knife/bootstrap/bootstrapper.rb +65 -65
- data/lib/chef/knife/bootstrap/common_bootstrap_options.rb +3 -4
- data/lib/chef/knife/bootstrap_azure.rb +13 -13
- data/lib/chef/knife/bootstrap_azurerm.rb +106 -106
- data/lib/knife-azure/version.rb +2 -2
- metadata +43 -76
- data/lib/azure/resource_management/ARM_base.rb +0 -29
@@ -1,8 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Barry Davis (barryd@jetstreamsoftware.com)
|
3
|
-
# Author:: Seth Chisamore (<schisamo@
|
4
|
-
# Author:: Adam Jacob (<adam@
|
5
|
-
# Copyright:: Copyright
|
3
|
+
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
4
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
5
|
+
# Copyright:: Copyright 2010-2018 Chef Software, Inc.
|
6
6
|
# License:: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# limitations under the License.
|
19
19
|
#
|
20
20
|
|
21
|
-
require File.expand_path(
|
21
|
+
require File.expand_path("../azure_base", __FILE__)
|
22
22
|
|
23
23
|
class Chef
|
24
24
|
class Knife
|
@@ -34,24 +34,22 @@ class Chef
|
|
34
34
|
:boolean => true,
|
35
35
|
:description => "Show all the fields of the images"
|
36
36
|
|
37
|
-
|
38
37
|
def run
|
39
38
|
$stdout.sync = true
|
40
39
|
|
41
40
|
validate_asm_keys!
|
42
41
|
items = service.list_images
|
43
42
|
|
44
|
-
image_labels = !locate_config_value(:show_all_fields) ?
|
45
|
-
image_list = image_labels.map {|label| ui.color(label, :bold)}
|
43
|
+
image_labels = !locate_config_value(:show_all_fields) ? %w{Name OS Location} : %w{Name Category Label OS Location}
|
44
|
+
image_list = image_labels.map { |label| ui.color(label, :bold) }
|
46
45
|
|
47
|
-
image_items = image_labels.map {|item| item.downcase }
|
46
|
+
image_items = image_labels.map { |item| item.downcase }
|
48
47
|
items.each do |image|
|
49
|
-
|
48
|
+
image_items.each { |item| image_list << image.send(item).to_s }
|
50
49
|
end
|
51
50
|
|
52
51
|
puts "\n"
|
53
52
|
puts ui.list(image_list, :uneven_columns_across, !locate_config_value(:show_all_fields) ? 3 : 5)
|
54
|
-
|
55
53
|
end
|
56
54
|
end
|
57
55
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Aiman Alsari (aiman.alsari@gmail.com)
|
3
|
-
# Copyright:: Copyright
|
3
|
+
# Copyright:: Copyright 2013-2018 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,28 +16,28 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require File.expand_path(
|
19
|
+
require File.expand_path("../azure_base", __FILE__)
|
20
20
|
|
21
21
|
class Chef
|
22
22
|
class Knife
|
23
23
|
class AzureInternalLbCreate < Knife
|
24
24
|
include Knife::AzureBase
|
25
25
|
|
26
|
-
banner
|
26
|
+
banner "knife azure internal lb create (options)"
|
27
27
|
|
28
28
|
option :azure_load_balancer,
|
29
|
-
:short =>
|
30
|
-
:long =>
|
31
|
-
:description =>
|
29
|
+
:short => "-n NAME",
|
30
|
+
:long => "--azure-load-balancer NAME",
|
31
|
+
:description => "Required. Specifies new load balancer name."
|
32
32
|
|
33
33
|
option :azure_lb_static_vip,
|
34
|
-
:long =>
|
35
|
-
:description =>
|
34
|
+
:long => "--azure-lb-static-vip VIP",
|
35
|
+
:description => "Optional. The Virtual IP that will be used for the load balancer."
|
36
36
|
|
37
37
|
option :azure_subnet_name,
|
38
|
-
:long =>
|
39
|
-
:description =>
|
40
|
-
|
38
|
+
:long => "--azure-subnet-name SUBNET_NAME",
|
39
|
+
:description => "Required if static VIP is set. Specifies the subnet name "\
|
40
|
+
"the load balancer is located in."
|
41
41
|
|
42
42
|
option :azure_dns_name,
|
43
43
|
:long => "--azure-dns-name DNS_NAME",
|
@@ -46,7 +46,7 @@ class Chef
|
|
46
46
|
def run
|
47
47
|
$stdout.sync = true
|
48
48
|
|
49
|
-
Chef::Log.info(
|
49
|
+
Chef::Log.info("validating...")
|
50
50
|
validate_asm_keys!(:azure_load_balancer)
|
51
51
|
|
52
52
|
params = {
|
@@ -58,9 +58,9 @@ class Chef
|
|
58
58
|
|
59
59
|
rsp = service.create_internal_lb(params)
|
60
60
|
print "\n"
|
61
|
-
if rsp.at_css(
|
62
|
-
if rsp.at_css(
|
63
|
-
puts
|
61
|
+
if rsp.at_css("Status").nil?
|
62
|
+
if rsp.at_css("Code").nil? || rsp.at_css("Message").nil?
|
63
|
+
puts "Unknown Error. try -VV"
|
64
64
|
else
|
65
65
|
puts "#{rsp.at_css('Code').content}: "\
|
66
66
|
"#{rsp.at_css('Message').content}"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Aiman Alsari (aiman.alsari@gmail.com)
|
3
|
-
# Copyright:: Copyright
|
3
|
+
# Copyright:: Copyright 2013-2018 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,14 +16,14 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require File.expand_path(
|
19
|
+
require File.expand_path("../azure_base", __FILE__)
|
20
20
|
|
21
21
|
class Chef
|
22
22
|
class Knife
|
23
23
|
class AzureInternalLbList < Knife
|
24
24
|
include Knife::AzureBase
|
25
25
|
|
26
|
-
banner
|
26
|
+
banner "knife azure internal lb list (options)"
|
27
27
|
|
28
28
|
def run
|
29
29
|
$stdout.sync = true
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Barry Davis (barryd@jetstreamsoftware.com)
|
3
|
-
# Author:: Adam Jacob (<adam@
|
4
|
-
# Author:: Seth Chisamore (<schisamo@
|
5
|
-
# Copyright:: Copyright
|
3
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
+
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
5
|
+
# Copyright:: Copyright 2010-2018 Chef Software, Inc.
|
6
6
|
# License:: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -18,11 +18,11 @@
|
|
18
18
|
# limitations under the License.
|
19
19
|
#
|
20
20
|
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
21
|
+
require "chef/knife/azure_base"
|
22
|
+
require "chef/knife/winrm_base"
|
23
|
+
require "securerandom"
|
24
|
+
require "chef/knife/bootstrap/bootstrap_options"
|
25
|
+
require "chef/knife/bootstrap/bootstrapper"
|
26
26
|
|
27
27
|
class Chef
|
28
28
|
class Knife
|
@@ -34,11 +34,11 @@ class Chef
|
|
34
34
|
include Knife::Bootstrap::Bootstrapper
|
35
35
|
|
36
36
|
deps do
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require
|
41
|
-
require
|
37
|
+
require "readline"
|
38
|
+
require "chef/json_compat"
|
39
|
+
require "chef/knife/bootstrap"
|
40
|
+
require "chef/knife/bootstrap_windows_ssh"
|
41
|
+
require "chef/knife/core/windows_bootstrap_context"
|
42
42
|
Chef::Knife::Bootstrap.load_deps
|
43
43
|
end
|
44
44
|
|
@@ -46,7 +46,6 @@ class Chef
|
|
46
46
|
|
47
47
|
attr_accessor :initial_sleep_delay
|
48
48
|
|
49
|
-
|
50
49
|
option :bootstrap_protocol,
|
51
50
|
:long => "--bootstrap-protocol protocol",
|
52
51
|
:description => "Protocol to bootstrap windows servers. options: 'winrm' or 'ssh' or 'cloud-api'.",
|
@@ -71,7 +70,7 @@ class Chef
|
|
71
70
|
:long => "--node-ssl-verify-mode [peer|none]",
|
72
71
|
:description => "Whether or not to verify the SSL cert for all HTTPS requests.",
|
73
72
|
:proc => Proc.new { |v|
|
74
|
-
valid_values =
|
73
|
+
valid_values = %w{none peer}
|
75
74
|
unless valid_values.include?(v)
|
76
75
|
raise "Invalid value '#{v}' for --node-ssl-verify-mode. Valid values are: #{valid_values.join(", ")}"
|
77
76
|
end
|
@@ -131,8 +130,9 @@ class Chef
|
|
131
130
|
option :azure_vm_size,
|
132
131
|
:short => "-z SIZE",
|
133
132
|
:long => "--azure-vm-size SIZE",
|
134
|
-
:description => "Optional. Size of virtual machine
|
135
|
-
|
133
|
+
:description => "Optional. Size of virtual machine. Default is Standard_A1_v2.
|
134
|
+
Eg: Standard_A1_v2, Standard_F2, Standard_G1 etc.",
|
135
|
+
:default => "Standard_A1_v2",
|
136
136
|
:proc => Proc.new { |si| Chef::Config[:knife][:azure_vm_size] = si }
|
137
137
|
|
138
138
|
option :azure_availability_set,
|
@@ -263,14 +263,14 @@ class Chef
|
|
263
263
|
end
|
264
264
|
end
|
265
265
|
rescue Exception => e
|
266
|
-
Chef::Log.error("#{e
|
267
|
-
raise
|
266
|
+
Chef::Log.error("#{e}")
|
267
|
+
raise "Verify connectivity to Azure and subscription resource limit compliance (e.g. maximum CPU core limits) and try again."
|
268
268
|
end
|
269
269
|
end
|
270
270
|
|
271
271
|
def wait_for_virtual_machine_state(vm_status_goal, total_wait_time_in_minutes, retry_interval_in_seconds)
|
272
|
-
vm_status_ordering = {:vm_status_not_detected => 0, :vm_status_provisioning => 1, :vm_status_ready => 2}
|
273
|
-
vm_status_description = {:vm_status_not_detected =>
|
272
|
+
vm_status_ordering = { :vm_status_not_detected => 0, :vm_status_provisioning => 1, :vm_status_ready => 2 }
|
273
|
+
vm_status_description = { :vm_status_not_detected => "any", :vm_status_provisioning => "provisioning", :vm_status_ready => "ready" }
|
274
274
|
|
275
275
|
print ui.color("Waiting for virtual machine to reach status '#{vm_status_description[vm_status_goal]}'", :magenta)
|
276
276
|
|
@@ -283,7 +283,7 @@ class Chef
|
|
283
283
|
begin
|
284
284
|
vm_status = get_virtual_machine_status()
|
285
285
|
vm_ready = vm_status_ordering[vm_status] >= vm_status_ordering[vm_status_goal]
|
286
|
-
print
|
286
|
+
print "."
|
287
287
|
sleep retry_interval_in_seconds if !vm_ready
|
288
288
|
polling_attempts += 1
|
289
289
|
end until vm_ready || polling_attempts >= max_polling_attempts
|
@@ -298,10 +298,9 @@ class Chef
|
|
298
298
|
end
|
299
299
|
|
300
300
|
def wait_for_resource_extension_state(extension_status_goal, total_wait_time_in_minutes, retry_interval_in_seconds)
|
301
|
+
extension_status_ordering = { :extension_status_not_detected => 0, :wagent_provisioning => 1, :extension_installing => 2, :extension_provisioning => 3, :extension_ready => 4 }
|
301
302
|
|
302
|
-
|
303
|
-
|
304
|
-
status_description = {:extension_status_not_detected => 'any', :wagent_provisioning => 'wagent provisioning', :extension_installing => "installing", :extension_provisioning => "provisioning", :extension_ready => "ready" }
|
303
|
+
status_description = { :extension_status_not_detected => "any", :wagent_provisioning => "wagent provisioning", :extension_installing => "installing", :extension_provisioning => "provisioning", :extension_ready => "ready" }
|
305
304
|
|
306
305
|
print ui.color("Waiting for Resource Extension to reach status '#{status_description[extension_status_goal]}'", :magenta)
|
307
306
|
|
@@ -313,7 +312,7 @@ class Chef
|
|
313
312
|
begin
|
314
313
|
extension_status = get_extension_status()
|
315
314
|
extension_ready = extension_status_ordering[extension_status[:status]] >= extension_status_ordering[extension_status_goal]
|
316
|
-
print
|
315
|
+
print "."
|
317
316
|
sleep retry_interval_in_seconds if !extension_ready
|
318
317
|
polling_attempts += 1
|
319
318
|
end until extension_ready || polling_attempts >= max_polling_attempts
|
@@ -328,11 +327,11 @@ class Chef
|
|
328
327
|
extension_status[:status]
|
329
328
|
end
|
330
329
|
|
331
|
-
def get_virtual_machine_status
|
330
|
+
def get_virtual_machine_status
|
332
331
|
role = service.get_role_server(locate_config_value(:azure_dns_name), locate_config_value(:azure_vm_name))
|
333
332
|
unless role.nil?
|
334
|
-
Chef::Log.debug("Role status is #{role.status
|
335
|
-
if
|
333
|
+
Chef::Log.debug("Role status is #{role.status}")
|
334
|
+
if "ReadyRole".eql? role.status.to_s
|
336
335
|
return :vm_status_ready
|
337
336
|
elsif "Provisioning".eql? role.status.to_s
|
338
337
|
return :vm_status_provisioning
|
@@ -340,16 +339,16 @@ class Chef
|
|
340
339
|
return :vm_status_not_detected
|
341
340
|
end
|
342
341
|
end
|
343
|
-
|
342
|
+
:vm_status_not_detected
|
344
343
|
end
|
345
344
|
|
346
|
-
def get_extension_status
|
345
|
+
def get_extension_status
|
347
346
|
deployment_name = service.deployment_name(locate_config_value(:azure_dns_name))
|
348
347
|
deployment = service.deployment("hostedservices/#{locate_config_value(:azure_dns_name)}/deployments/#{deployment_name}")
|
349
348
|
extension_status = Hash.new
|
350
349
|
|
351
|
-
if deployment.at_css(
|
352
|
-
role_list_xml =
|
350
|
+
if deployment.at_css("Deployment Name") != nil
|
351
|
+
role_list_xml = deployment.css("RoleInstanceList RoleInstance")
|
353
352
|
role_list_xml.each do |role|
|
354
353
|
if role.at_css("RoleName").text == locate_config_value(:azure_vm_name)
|
355
354
|
lnx_waagent_fail_msg = "Failed to deserialize the status reported by the Guest Agent"
|
@@ -370,7 +369,7 @@ class Chef
|
|
370
369
|
extension_status[:status] = :extension_status_not_detected
|
371
370
|
end
|
372
371
|
# This fix is for linux waagent issue: api unable to deserialize the waagent status.
|
373
|
-
elsif (role.at_css(
|
372
|
+
elsif (role.at_css("GuestAgentStatus Status").text == "NotReady") && (waagent_status_msg == lnx_waagent_fail_msg)
|
374
373
|
extension_status[:status] = :extension_ready
|
375
374
|
else
|
376
375
|
extension_status[:status] = :wagent_provisioning
|
@@ -383,7 +382,7 @@ class Chef
|
|
383
382
|
else
|
384
383
|
extension_status[:status] = :extension_status_not_detected
|
385
384
|
end
|
386
|
-
|
385
|
+
extension_status
|
387
386
|
end
|
388
387
|
|
389
388
|
def run
|
@@ -399,14 +398,14 @@ class Chef
|
|
399
398
|
config[:chef_node_name] = locate_config_value(:azure_vm_name) unless locate_config_value(:chef_node_name)
|
400
399
|
service.create_server(create_server_def)
|
401
400
|
wait_until_virtual_machine_ready()
|
402
|
-
if locate_config_value(:bootstrap_protocol) ==
|
401
|
+
if locate_config_value(:bootstrap_protocol) == "cloud-api" && locate_config_value(:extended_logs)
|
403
402
|
print "\n\nWaiting for the first chef-client run"
|
404
403
|
fetch_chef_client_logs(Time.now, 30)
|
405
404
|
end
|
406
405
|
server = service.get_role_server(locate_config_value(:azure_dns_name), locate_config_value(:azure_vm_name))
|
407
406
|
msg_server_summary(server)
|
408
407
|
|
409
|
-
bootstrap_exec(server) unless locate_config_value(:bootstrap_protocol) ==
|
408
|
+
bootstrap_exec(server) unless locate_config_value(:bootstrap_protocol) == "cloud-api"
|
410
409
|
end
|
411
410
|
|
412
411
|
def create_server_def
|
@@ -436,7 +435,7 @@ class Chef
|
|
436
435
|
:winrm_max_memoryPerShell => locate_config_value(:winrm_max_memory_per_shell)
|
437
436
|
}
|
438
437
|
|
439
|
-
if locate_config_value(:bootstrap_protocol) ==
|
438
|
+
if locate_config_value(:bootstrap_protocol) == "cloud-api"
|
440
439
|
server_def[:chef_extension] = get_chef_extension_name
|
441
440
|
server_def[:chef_extension_publisher] = get_chef_extension_publisher
|
442
441
|
server_def[:chef_extension_version] = get_chef_extension_version
|
@@ -444,7 +443,7 @@ class Chef
|
|
444
443
|
server_def[:chef_extension_private_param] = get_chef_extension_private_params
|
445
444
|
else
|
446
445
|
if is_image_windows?
|
447
|
-
if not locate_config_value(:winrm_password)
|
446
|
+
if (not locate_config_value(:winrm_password)) || (not locate_config_value(:bootstrap_protocol))
|
448
447
|
ui.error("WinRM Password and Bootstrapping Protocol are compulsory parameters")
|
449
448
|
exit 1
|
450
449
|
end
|
@@ -465,7 +464,7 @@ class Chef
|
|
465
464
|
ui.error("SSH User is compulsory parameter")
|
466
465
|
exit 1
|
467
466
|
end
|
468
|
-
unless locate_config_value(:ssh_password)
|
467
|
+
unless locate_config_value(:ssh_password) || locate_config_value(:identity_file)
|
469
468
|
ui.error("Specify either SSH Key or SSH Password")
|
470
469
|
exit 1
|
471
470
|
end
|
@@ -473,12 +472,12 @@ class Chef
|
|
473
472
|
end
|
474
473
|
|
475
474
|
if is_image_windows?
|
476
|
-
server_def[:os_type] =
|
475
|
+
server_def[:os_type] = "Windows"
|
477
476
|
server_def[:admin_password] = locate_config_value(:winrm_password)
|
478
477
|
server_def[:bootstrap_proto] = locate_config_value(:bootstrap_protocol)
|
479
478
|
else
|
480
|
-
server_def[:os_type] =
|
481
|
-
server_def[:bootstrap_proto] = (locate_config_value(:bootstrap_protocol) ==
|
479
|
+
server_def[:os_type] = "Linux"
|
480
|
+
server_def[:bootstrap_proto] = (locate_config_value(:bootstrap_protocol) == "winrm") ? "ssh" : locate_config_value(:bootstrap_protocol)
|
482
481
|
server_def[:ssh_user] = locate_config_value(:ssh_user)
|
483
482
|
server_def[:ssh_password] = locate_config_value(:ssh_password)
|
484
483
|
server_def[:identity_file] = locate_config_value(:identity_file)
|
@@ -486,11 +485,11 @@ class Chef
|
|
486
485
|
end
|
487
486
|
|
488
487
|
azure_connect_to_existing_dns = locate_config_value(:azure_connect_to_existing_dns)
|
489
|
-
if is_image_windows? && server_def[:bootstrap_proto] ==
|
490
|
-
port = locate_config_value(:winrm_port) ||
|
488
|
+
if is_image_windows? && server_def[:bootstrap_proto] == "winrm"
|
489
|
+
port = locate_config_value(:winrm_port) || "5985"
|
491
490
|
port = locate_config_value(:winrm_port) || Random.rand(64000) + 1000 if azure_connect_to_existing_dns
|
492
|
-
elsif server_def[:bootstrap_proto] ==
|
493
|
-
port = locate_config_value(:ssh_port) ||
|
491
|
+
elsif server_def[:bootstrap_proto] == "ssh"
|
492
|
+
port = locate_config_value(:ssh_port) || "22"
|
494
493
|
port = locate_config_value(:ssh_port) || Random.rand(64000) + 1000 if azure_connect_to_existing_dns
|
495
494
|
end
|
496
495
|
|
@@ -502,11 +501,11 @@ class Chef
|
|
502
501
|
if locate_config_value(:azure_domain_user)
|
503
502
|
# extract domain name since it should be part of username
|
504
503
|
case locate_config_value(:azure_domain_user)
|
505
|
-
when /(\S+)\\(.+)/
|
504
|
+
when /(\S+)\\(.+)/ # format - fully-qualified-DNS-domain\username
|
506
505
|
server_def[:azure_domain_name] = $1 if locate_config_value(:azure_domain_name).nil?
|
507
506
|
server_def[:azure_user_domain_name] = $1
|
508
507
|
server_def[:azure_domain_user] = $2
|
509
|
-
when /(.+)@(\S+)/
|
508
|
+
when /(.+)@(\S+)/ # format - user@fully-qualified-DNS-domain
|
510
509
|
server_def[:azure_domain_name] = $2 if locate_config_value(:azure_domain_name).nil?
|
511
510
|
server_def[:azure_user_domain_name] = $2
|
512
511
|
server_def[:azure_domain_user] = $1
|
@@ -557,7 +556,7 @@ class Chef
|
|
557
556
|
def get_dns_name(azure_dns_name, prefix = "az-")
|
558
557
|
return azure_dns_name unless azure_dns_name.nil?
|
559
558
|
if locate_config_value(:azure_vm_name).nil?
|
560
|
-
azure_dns_name = prefix + SecureRandom.hex(( MAX_VM_NAME_CHARACTERS - prefix.length)/2)
|
559
|
+
azure_dns_name = prefix + SecureRandom.hex(( MAX_VM_NAME_CHARACTERS - prefix.length) / 2)
|
561
560
|
else
|
562
561
|
azure_dns_name = locate_config_value(:azure_vm_name)
|
563
562
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Barry Davis (barryd@jetstreamsoftware.com)
|
3
|
-
# Author:: Adam Jacob (<adam@
|
4
|
-
# Author:: Seth Chisamore (<schisamo@
|
5
|
-
# Copyright:: Copyright
|
3
|
+
# Author:: Adam Jacob (<adam@chef.io>)
|
4
|
+
# Author:: Seth Chisamore (<schisamo@chef.io>)
|
5
|
+
# Copyright:: Copyright 2009-2018 Chef Software, Inc.
|
6
6
|
# License:: Apache License, Version 2.0
|
7
7
|
#
|
8
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -18,11 +18,11 @@
|
|
18
18
|
# limitations under the License.
|
19
19
|
#
|
20
20
|
|
21
|
-
require File.expand_path(
|
21
|
+
require File.expand_path("../azure_base", __FILE__)
|
22
22
|
|
23
23
|
# These two are needed for the '--purge' deletion case
|
24
|
-
require
|
25
|
-
require
|
24
|
+
require "chef/node"
|
25
|
+
require "chef/api_client"
|
26
26
|
|
27
27
|
class Chef
|
28
28
|
class Knife
|
@@ -84,22 +84,20 @@ class Chef
|
|
84
84
|
# the user is already making their intent known. It is not
|
85
85
|
# necessary to make them confirm two more times.
|
86
86
|
def destroy_item(klass, name, type_name)
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
ui.warn("Could not find a #{type_name} named #{name} to delete. Please provide --node-name option and it's value")
|
93
|
-
end
|
87
|
+
object = klass.load(name)
|
88
|
+
object.destroy
|
89
|
+
ui.warn("Deleted #{type_name} #{name}")
|
90
|
+
rescue Net::HTTPServerException
|
91
|
+
ui.warn("Could not find a #{type_name} named #{name} to delete. Please provide --node-name option and it's value")
|
94
92
|
end
|
95
93
|
|
96
94
|
def validate_disk_and_storage
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
95
|
+
if locate_config_value(:preserve_azure_os_disk) && locate_config_value(:delete_azure_storage_account)
|
96
|
+
ui.warn("Cannot delete storage account while keeping OS Disk. Please set any one option.")
|
97
|
+
exit
|
98
|
+
else
|
99
|
+
true
|
100
|
+
end
|
103
101
|
end
|
104
102
|
|
105
103
|
def run
|
@@ -108,16 +106,16 @@ class Chef
|
|
108
106
|
@name_args.each do |name|
|
109
107
|
begin
|
110
108
|
service.delete_server( { name: name, preserve_azure_os_disk: locate_config_value(:preserve_azure_os_disk),
|
111
|
-
|
112
|
-
|
113
|
-
|
109
|
+
preserve_azure_vhd: locate_config_value(:preserve_azure_vhd),
|
110
|
+
preserve_azure_dns_name: locate_config_value(:preserve_azure_dns_name),
|
111
|
+
delete_azure_storage_account: locate_config_value(:delete_azure_storage_account),
|
114
112
|
wait: locate_config_value(:wait) } )
|
115
113
|
|
116
114
|
if config[:purge]
|
117
115
|
node_to_delete = config[:chef_node_name] || name
|
118
116
|
if node_to_delete
|
119
|
-
destroy_item(Chef::Node, node_to_delete,
|
120
|
-
destroy_item(Chef::ApiClient, node_to_delete,
|
117
|
+
destroy_item(Chef::Node, node_to_delete, "node")
|
118
|
+
destroy_item(Chef::ApiClient, node_to_delete, "client")
|
121
119
|
else
|
122
120
|
ui.warn("Node name to purge not provided. Corresponding client node will remain on Chef Server.")
|
123
121
|
end
|