knife-azure 1.8.7 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/lib/azure/azure_interface.rb +79 -81
  3. data/lib/azure/custom_errors.rb +34 -35
  4. data/lib/azure/helpers.rb +43 -44
  5. data/lib/azure/resource_management/ARM_deployment_template.rb +679 -678
  6. data/lib/azure/resource_management/ARM_interface.rb +513 -515
  7. data/lib/azure/resource_management/vnet_config.rb +43 -43
  8. data/lib/azure/resource_management/windows_credentials.rb +181 -184
  9. data/lib/azure/service_management/ASM_interface.rb +309 -317
  10. data/lib/azure/service_management/ag.rb +16 -16
  11. data/lib/azure/service_management/certificate.rb +30 -31
  12. data/lib/azure/service_management/connection.rb +31 -31
  13. data/lib/azure/service_management/deploy.rb +40 -38
  14. data/lib/azure/service_management/disk.rb +14 -10
  15. data/lib/azure/service_management/host.rb +28 -24
  16. data/lib/azure/service_management/image.rb +23 -22
  17. data/lib/azure/service_management/loadbalancer.rb +12 -12
  18. data/lib/azure/service_management/rest.rb +20 -19
  19. data/lib/azure/service_management/role.rb +274 -273
  20. data/lib/azure/service_management/storageaccount.rb +29 -25
  21. data/lib/azure/service_management/utility.rb +6 -7
  22. data/lib/azure/service_management/vnet.rb +44 -44
  23. data/lib/chef/knife/azure_ag_create.rb +18 -18
  24. data/lib/chef/knife/azure_ag_list.rb +3 -3
  25. data/lib/chef/knife/azure_base.rb +56 -56
  26. data/lib/chef/knife/azure_image_list.rb +8 -10
  27. data/lib/chef/knife/azure_internal-lb_create.rb +15 -15
  28. data/lib/chef/knife/azure_internal-lb_list.rb +3 -3
  29. data/lib/chef/knife/azure_server_create.rb +49 -50
  30. data/lib/chef/knife/azure_server_delete.rb +22 -24
  31. data/lib/chef/knife/azure_server_list.rb +4 -4
  32. data/lib/chef/knife/azure_server_show.rb +5 -5
  33. data/lib/chef/knife/azure_vnet_create.rb +17 -17
  34. data/lib/chef/knife/azure_vnet_list.rb +3 -3
  35. data/lib/chef/knife/azurerm_base.rb +58 -60
  36. data/lib/chef/knife/azurerm_server_create.rb +23 -22
  37. data/lib/chef/knife/azurerm_server_delete.rb +30 -34
  38. data/lib/chef/knife/azurerm_server_list.rb +42 -42
  39. data/lib/chef/knife/azurerm_server_show.rb +1 -1
  40. data/lib/chef/knife/bootstrap/bootstrap_options.rb +7 -8
  41. data/lib/chef/knife/bootstrap/bootstrapper.rb +65 -65
  42. data/lib/chef/knife/bootstrap/common_bootstrap_options.rb +3 -4
  43. data/lib/chef/knife/bootstrap_azure.rb +13 -13
  44. data/lib/chef/knife/bootstrap_azurerm.rb +106 -106
  45. data/lib/knife-azure/version.rb +2 -2
  46. metadata +43 -76
  47. data/lib/azure/resource_management/ARM_base.rb +0 -29
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
3
+ # Copyright:: Copyright 2010-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");
@@ -19,33 +19,37 @@
19
19
  module Azure
20
20
  class Disks
21
21
  def initialize(connection)
22
- @connection=connection
22
+ @connection = connection
23
23
  end
24
+
24
25
  def all
25
26
  disks = Array.new
26
- response = @connection.query_azure('disks')
27
- founddisks = response.css('Disk')
27
+ response = @connection.query_azure("disks")
28
+ founddisks = response.css("Disk")
28
29
  founddisks.each do |disk|
29
30
  item = Disk.new(disk)
30
31
  disks << item
31
32
  end
32
33
  disks
33
34
  end
35
+
34
36
  def find(name)
35
37
  founddisk = nil
36
- self.all.each do |disk|
38
+ all.each do |disk|
37
39
  next unless disk.name == name
38
40
  founddisk = disk
39
41
  end
40
42
  founddisk
41
43
  end
44
+
42
45
  def exists(name)
43
- find(name) != nil
46
+ !find(name).nil?
44
47
  end
48
+
45
49
  def clear_unattached
46
- self.all.each do |disk|
50
+ all.each do |disk|
47
51
  next unless disk.attached == false
48
- @connection.query_azure('disks/' + disk.name, 'delete')
52
+ @connection.query_azure("disks/" + disk.name, "delete")
49
53
  end
50
54
  end
51
55
  end
@@ -55,8 +59,8 @@ module Azure
55
59
  class Disk
56
60
  attr_accessor :name, :attached
57
61
  def initialize(disk)
58
- @name = disk.at_css('Name').content
59
- @attached = disk.at_css('AttachedTo') != nil
62
+ @name = disk.at_css("Name").content
63
+ @attached = !disk.at_css("AttachedTo").nil?
60
64
  end
61
65
  end
62
66
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
3
+ # Copyright:: Copyright 2010-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");
@@ -20,7 +20,7 @@ module Azure
20
20
  class Hosts
21
21
  include AzureUtility
22
22
  def initialize(connection)
23
- @connection=connection
23
+ @connection = connection
24
24
  end
25
25
 
26
26
  # force_load should be true when there is something in local cache and we want to reload
@@ -29,8 +29,8 @@ module Azure
29
29
  if not @hosted_services || force_load
30
30
  @hosted_services = begin
31
31
  hosted_services = Hash.new
32
- responseXML = @connection.query_azure('hostedservices')
33
- servicesXML = responseXML.css('HostedServices HostedService')
32
+ responseXML = @connection.query_azure("hostedservices")
33
+ servicesXML = responseXML.css("HostedServices HostedService")
34
34
  servicesXML.each do |serviceXML|
35
35
  host = Host.new(@connection).parse(serviceXML)
36
36
  hosted_services[host.name] = host
@@ -42,13 +42,13 @@ module Azure
42
42
  end
43
43
 
44
44
  def all
45
- self.load.values
45
+ load.values
46
46
  end
47
47
 
48
48
  # first look up local cache if we have already loaded list.
49
49
  def exists?(name)
50
50
  return @hosted_services.key?(name) if @hosted_services
51
- self.exists_on_cloud?(name)
51
+ exists_on_cloud?(name)
52
52
  end
53
53
 
54
54
  # Look up on cloud and not local cache
@@ -56,7 +56,7 @@ module Azure
56
56
  ret_val = @connection.query_azure("hostedservices/#{name}")
57
57
  error_code, error_message = error_from_response_xml(ret_val) if ret_val
58
58
  if ret_val.nil? || error_code.length > 0
59
- Chef::Log.debug('Unable to find hosted(cloud) service:' + error_code + ' : ' + error_message) if ret_val
59
+ Chef::Log.debug("Unable to find hosted(cloud) service:" + error_code + " : " + error_message) if ret_val
60
60
  false
61
61
  else
62
62
  true
@@ -66,7 +66,7 @@ module Azure
66
66
  # first look up local cache if we have already loaded list.
67
67
  def find(name)
68
68
  return @hosted_services[name] if @hosted_services && @hosted_services.key?(name)
69
- self.fetch_from_cloud(name)
69
+ fetch_from_cloud(name)
70
70
  end
71
71
 
72
72
  # Look up hosted service on cloud and not local cache
@@ -74,7 +74,7 @@ module Azure
74
74
  ret_val = @connection.query_azure("hostedservices/#{name}")
75
75
  error_code, error_message = error_from_response_xml(ret_val) if ret_val
76
76
  if ret_val.nil? || error_code.length > 0
77
- Chef::Log.warn('Unable to find hosted(cloud) service:' + error_code + ' : ' + error_message) if ret_val
77
+ Chef::Log.warn("Unable to find hosted(cloud) service:" + error_code + " : " + error_message) if ret_val
78
78
  nil
79
79
  else
80
80
  Host.new(@connection).parse(ret_val)
@@ -85,10 +85,11 @@ module Azure
85
85
  host = Host.new(@connection)
86
86
  host.create(params)
87
87
  end
88
+
88
89
  def delete(name)
89
- if self.exists?(name)
90
- servicecall = "hostedservices/" + name
91
- @connection.query_azure(servicecall, "delete")
90
+ if exists?(name)
91
+ servicecall = "hostedservices/" + name
92
+ @connection.query_azure(servicecall, "delete")
92
93
  end
93
94
  end
94
95
  end
@@ -106,35 +107,38 @@ module Azure
106
107
  @deploys_loaded = false
107
108
  @deploys = Hash.new
108
109
  end
110
+
109
111
  def parse(serviceXML)
110
- @name = xml_content(serviceXML, 'ServiceName')
111
- @url = xml_content(serviceXML, 'Url')
112
- @label = xml_content(serviceXML, 'HostedServiceProperties Label')
113
- @dateCreated = xml_content(serviceXML, 'HostedServiceProperties DateCreated')
114
- @description = xml_content(serviceXML, 'HostedServiceProperties Description')
115
- @location = xml_content(serviceXML, 'HostedServiceProperties Location')
116
- @dateModified = xml_content(serviceXML, 'HostedServiceProperties DateLastModified')
117
- @status = xml_content(serviceXML, 'HostedServiceProperties Status')
112
+ @name = xml_content(serviceXML, "ServiceName")
113
+ @url = xml_content(serviceXML, "Url")
114
+ @label = xml_content(serviceXML, "HostedServiceProperties Label")
115
+ @dateCreated = xml_content(serviceXML, "HostedServiceProperties DateCreated")
116
+ @description = xml_content(serviceXML, "HostedServiceProperties Description")
117
+ @location = xml_content(serviceXML, "HostedServiceProperties Location")
118
+ @dateModified = xml_content(serviceXML, "HostedServiceProperties DateLastModified")
119
+ @status = xml_content(serviceXML, "HostedServiceProperties Status")
118
120
  self
119
121
  end
122
+
120
123
  def create(params)
121
124
  builder = Nokogiri::XML::Builder.new do |xml|
122
- xml.CreateHostedService('xmlns'=>'http://schemas.microsoft.com/windowsazure') {
125
+ xml.CreateHostedService("xmlns" => "http://schemas.microsoft.com/windowsazure") do
123
126
  xml.ServiceName params[:azure_dns_name]
124
127
  xml.Label Base64.encode64(params[:azure_dns_name])
125
- xml.Description 'Explicitly created hosted service'
128
+ xml.Description "Explicitly created hosted service"
126
129
  unless params[:azure_service_location].nil?
127
130
  xml.Location params[:azure_service_location]
128
131
  end
129
132
  unless params[:azure_affinity_group].nil?
130
133
  xml.AffinityGroup params[:azure_affinity_group]
131
134
  end
132
- }
135
+ end
133
136
  end
134
137
  @connection.query_azure("hostedservices", "post", builder.to_xml)
135
138
  end
139
+
136
140
  def details
137
- response = @connection.query_azure('hostedservices/' + @name + '?embed-detail=true')
141
+ response = @connection.query_azure("hostedservices/" + @name + "?embed-detail=true")
138
142
  end
139
143
 
140
144
  # Deployments within this hostedservice
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
3
+ # Copyright:: Copyright 2010-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");
@@ -19,29 +19,30 @@
19
19
  module Azure
20
20
  class Images
21
21
  def initialize(connection)
22
- @connection=connection
22
+ @connection = connection
23
23
  end
24
+
24
25
  def load
25
26
  @images ||= begin
26
- osimages = self.get_images("OSImage") #get OSImages
27
- vmimages = self.get_images("VMImage") #get VMImages
27
+ osimages = get_images("OSImage") #get OSImages
28
+ vmimages = get_images("VMImage") #get VMImages
28
29
 
29
30
  all_images = osimages.merge(vmimages)
30
31
  end
31
32
  end
32
33
 
33
34
  def all
34
- self.load.values
35
+ load.values
35
36
  end
36
37
 
37
38
  # img_type = OSImages or VMImage
38
39
  def get_images(img_type)
39
40
  images = Hash.new
40
41
 
41
- if(img_type == "OSImage")
42
- response = @connection.query_azure('images')
43
- elsif(img_type == "VMImage")
44
- response = @connection.query_azure('vmimages')
42
+ if img_type == "OSImage"
43
+ response = @connection.query_azure("images")
44
+ elsif img_type == "VMImage"
45
+ response = @connection.query_azure("vmimages")
45
46
  end
46
47
 
47
48
  unless response.to_s.empty?
@@ -57,21 +58,21 @@ module Azure
57
58
  end
58
59
 
59
60
  def is_os_image(image_name)
60
- os_images = self.get_images("OSImage").values
61
- os_images.detect {|img| img.name == image_name} ? true : false
61
+ os_images = get_images("OSImage").values
62
+ os_images.detect { |img| img.name == image_name } ? true : false
62
63
  end
63
64
 
64
65
  def is_vm_image(image_name)
65
- vm_images = self.get_images("VMImage").values
66
- vm_images.detect {|img| img.name == image_name} ? true : false
66
+ vm_images = get_images("VMImage").values
67
+ vm_images.detect { |img| img.name == image_name } ? true : false
67
68
  end
68
69
 
69
70
  def exists?(name)
70
- self.all.detect {|img| img.name == name} ? true : false
71
+ all.detect { |img| img.name == name } ? true : false
71
72
  end
72
73
 
73
74
  def find(name)
74
- self.load[name]
75
+ load[name]
75
76
  end
76
77
  end
77
78
  end
@@ -81,13 +82,13 @@ module Azure
81
82
  attr_accessor :category, :label
82
83
  attr_accessor :name, :os, :eula, :description, :location
83
84
  def initialize(image)
84
- @category = image.at_css('Category').content
85
- @label = image.at_css('Label').content
86
- @name = image.at_css('Name').content
87
- @os = image.at_css('OS').content
88
- @location = image.at_css('Location').content.gsub(";", ", ") if image.at_css('Location')
89
- @eula = image.at_css('Eula').content if image.at_css('Eula')
90
- @description = image.at_css('Description').content if image.at_css('Description')
85
+ @category = image.at_css("Category").content
86
+ @label = image.at_css("Label").content
87
+ @name = image.at_css("Name").content
88
+ @os = image.at_css("OS").content
89
+ @location = image.at_css("Location").content.gsub(";", ", ") if image.at_css("Location")
90
+ @eula = image.at_css("Eula").content if image.at_css("Eula")
91
+ @description = image.at_css("Description").content if image.at_css("Description")
91
92
  end
92
93
  end
93
94
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Aiman Alsari (aiman.alsari@gmail.com)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
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");
@@ -48,27 +48,27 @@ module Azure
48
48
  end
49
49
 
50
50
  def parse(lbXML, hostedservicename)
51
- @name = xml_content(lbXML, 'Name')
52
- ip_configXML = lbXML.css('FrontendIpConfiguration')
53
- @subnet = xml_content(ip_configXML, 'SubnetName')
54
- @vip = xml_content(ip_configXML, 'StaticVirtualNetworkIPAddress')
51
+ @name = xml_content(lbXML, "Name")
52
+ ip_configXML = lbXML.css("FrontendIpConfiguration")
53
+ @subnet = xml_content(ip_configXML, "SubnetName")
54
+ @vip = xml_content(ip_configXML, "StaticVirtualNetworkIPAddress")
55
55
  @service = hostedservicename
56
56
  self
57
57
  end
58
58
 
59
59
  def create(params)
60
60
  if params[:azure_lb_static_vip] && !params[:azure_subnet_name]
61
- Chef::Log.fatal 'Unable to create Loadbalancer, :azure_subnet_name needs to be set if :azure_lb_static_vip is set'
61
+ Chef::Log.fatal "Unable to create Loadbalancer, :azure_subnet_name needs to be set if :azure_lb_static_vip is set"
62
62
  end
63
- builder = Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
64
- xml.LoadBalancer(xmlns: 'http://schemas.microsoft.com/windowsazure') {
63
+ builder = Nokogiri::XML::Builder.new(encoding: "utf-8") do |xml|
64
+ xml.LoadBalancer(xmlns: "http://schemas.microsoft.com/windowsazure") do
65
65
  xml.Name params[:azure_load_balancer]
66
- xml.FrontendIpConfiguration {
67
- xml.Type 'Private'
66
+ xml.FrontendIpConfiguration do
67
+ xml.Type "Private"
68
68
  xml.SubnetName params[:azure_subnet_name] if params[:azure_subnet_name]
69
69
  xml.StaticVirtualNetworkIPAddress params[:azure_lb_static_vip] if params[:azure_lb_static_vip]
70
- }
71
- }
70
+ end
71
+ end
72
72
  end
73
73
  deploy_name = @connection.deploys.get_deploy_name_for_hostedservice(params[:azure_dns_name])
74
74
  servicecall = "hostedservices/#{params[:azure_dns_name]}/deployments/#{deploy_name}/loadbalancers"
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
3
+ # Copyright:: Copyright 2010-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");
@@ -30,22 +30,22 @@ module AzureAPI
30
30
  end
31
31
 
32
32
  def query_azure(service_name,
33
- verb = 'get',
34
- body = '',
35
- params = '',
33
+ verb = "get",
34
+ body = "",
35
+ params = "",
36
36
  services = true,
37
37
  content_type = nil)
38
- svc_str = services ? '/services' : ''
38
+ svc_str = services ? "/services" : ""
39
39
  uri = URI.parse("#{@host_name}/#{@subscription_id}#{svc_str}/#{service_name}")
40
40
  scheme = !uri.scheme ? "https://" : ""
41
41
  request_url = "#{scheme}#{@host_name}/#{@subscription_id}#{svc_str}/#{service_name}"
42
- print '.'
42
+ print "."
43
43
  response = http_query(request_url, verb, body, params, content_type)
44
44
  if response.code.to_i == 307
45
45
  Chef::Log.debug "Redirect to #{response['Location']}"
46
- response = http_query(response['Location'], verb, body, params, content_type)
46
+ response = http_query(response["Location"], verb, body, params, content_type)
47
47
  end
48
- @last_request_id = response['x-ms-request-id']
48
+ @last_request_id = response["x-ms-request-id"]
49
49
  response
50
50
  end
51
51
 
@@ -55,18 +55,18 @@ module AzureAPI
55
55
  http = http_setup(uri)
56
56
  request = request_setup(uri, verb, body, content_type)
57
57
  response = http.request(request)
58
- @last_request_id = response['x-ms-request-id']
58
+ @last_request_id = response["x-ms-request-id"]
59
59
  response
60
60
  end
61
61
 
62
- def query_for_completion()
62
+ def query_for_completion
63
63
  uri = URI.parse("#{@host_name}/#{@subscription_id}/operations/#{@last_request_id}")
64
64
  scheme = !uri.scheme ? "https://" : ""
65
65
  request_url = "#{scheme}#{@host_name}/#{@subscription_id}/operations/#{@last_request_id}"
66
- response = http_query(request_url, 'get', '', '')
66
+ response = http_query(request_url, "get", "", "")
67
67
  if response.code.to_i == 307
68
68
  Chef::Log.debug "Redirect to #{response['Location']}"
69
- response = http_query(response['Location'], 'get', '', '')
69
+ response = http_query(response["Location"], "get", "", "")
70
70
  end
71
71
  response
72
72
  end
@@ -87,20 +87,21 @@ module AzureAPI
87
87
  rescue OpenSSL::X509::CertificateError => err
88
88
  raise "Invalid Azure Certificate pem file. Error: #{err}"
89
89
  end
90
- http.key = OpenSSL::PKey::RSA.new(@pem_file)
90
+ http.key = OpenSSL::PKey::RSA.new(@pem_file)
91
91
  http
92
92
  end
93
+
93
94
  def request_setup(uri, verb, body, content_type)
94
- if verb == 'get'
95
+ if verb == "get"
95
96
  request = Net::HTTP::Get.new(uri.request_uri)
96
- elsif verb == 'post'
97
+ elsif verb == "post"
97
98
  request = Net::HTTP::Post.new(uri.request_uri)
98
- elsif verb == 'delete'
99
+ elsif verb == "delete"
99
100
  request = Net::HTTP::Delete.new(uri.request_uri)
100
- elsif verb == 'put'
101
+ elsif verb == "put"
101
102
  request = Net::HTTP::Put.new(uri.request_uri)
102
103
  end
103
- text = verb == 'put' && content_type.nil?
104
+ text = verb == "put" && content_type.nil?
104
105
  request["x-ms-version"] = "2014-05-01"
105
106
  request["content-type"] = text ? "text/plain" : "application/xml"
106
107
  request["accept"] = "application/xml"
@@ -117,7 +118,7 @@ module AzureAPI
117
118
  puts "=== response.inspect ==="
118
119
  puts response.inspect
119
120
  puts "=== all of the headers ==="
120
- puts response.each_header { |h, j| puts h.inspect + ' : ' + j.inspect}
121
+ puts response.each_header { |h, j| puts h.inspect + " : " + j.inspect }
121
122
  end
122
123
  end
123
124
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
3
+ # Copyright:: Copyright 2010-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");
@@ -15,8 +15,8 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'securerandom'
19
- require 'azure/service_management/utility'
18
+ require "securerandom"
19
+ require "azure/service_management/utility"
20
20
 
21
21
  module Azure
22
22
  class Roles
@@ -26,6 +26,7 @@ module Azure
26
26
  @connection = connection
27
27
  @roles = nil
28
28
  end
29
+
29
30
  # do not use this unless you want a list of all roles(vms) in your subscription
30
31
  def all
31
32
  @roles = Array.new
@@ -48,16 +49,16 @@ module Azure
48
49
  host.find_role(role_name)
49
50
  end
50
51
 
51
- def find(role_name, params= nil)
52
+ def find(role_name, params = nil)
52
53
  if params && params[:azure_dns_name]
53
54
  return find_in_hosted_service(role_name, params[:azure_dns_name])
54
55
  end
55
56
 
56
- all if @roles == nil
57
+ all if @roles.nil?
57
58
 
58
59
  # TODO - optimize this lookup
59
60
  @roles.each do |role|
60
- if(role.name == role_name)
61
+ if role.name == role_name
61
62
  return role
62
63
  end
63
64
  end
@@ -69,7 +70,7 @@ module Azure
69
70
  if roles && roles.length > 1
70
71
  return false
71
72
  end
72
- return true
73
+ true
73
74
  end
74
75
 
75
76
  def exists?(name)
@@ -78,19 +79,19 @@ module Azure
78
79
 
79
80
  def delete(params)
80
81
  role = find(params[:name])
81
- if role != nil
82
+ if !role.nil?
82
83
  roleXML = nil
83
84
  roleXML = @connection.query_azure("hostedservices/#{role.hostedservicename}", "get", "", "embed-detail=true")
84
- osdisk = roleXML.css(roleXML, 'OSVirtualHardDisk')
85
- disk_name = xml_content(osdisk, 'DiskName')
86
- storage_account_name = xml_content(osdisk, 'MediaLink').gsub("http://", "").gsub(/.blob(.*)$/, "")
85
+ osdisk = roleXML.css(roleXML, "OSVirtualHardDisk")
86
+ disk_name = xml_content(osdisk, "DiskName")
87
+ storage_account_name = xml_content(osdisk, "MediaLink").gsub("http://", "").gsub(/.blob(.*)$/, "")
87
88
 
88
89
  if !params[:preserve_azure_os_disk] && !params[:preserve_azure_vhd] && !params[:wait]
89
90
  # default compmedia = true. So, it deletes role and associated resources
90
91
  check_and_delete_role_and_resources(params, role)
91
92
  else
92
93
  # compmedia = false. So, it deletes only role and not associated resources
93
- check_and_delete_role_and_resources(params, role, compmedia=false)
94
+ check_and_delete_role_and_resources(params, role, compmedia = false)
94
95
  check_and_delete_disks(params, disk_name)
95
96
  check_and_delete_service(params)
96
97
  end
@@ -98,7 +99,7 @@ module Azure
98
99
  end
99
100
  end
100
101
 
101
- def check_and_delete_role_and_resources(params, role, compmedia=true)
102
+ def check_and_delete_role_and_resources(params, role, compmedia = true)
102
103
  if alone_on_hostedservice(role)
103
104
  if !params[:preserve_azure_dns_name] && compmedia
104
105
  servicecall = "hostedservices/#{role.hostedservicename}"
@@ -107,10 +108,10 @@ module Azure
107
108
  end
108
109
  else
109
110
  servicecall = "hostedservices/#{role.hostedservicename}/deployments" +
110
- "/#{role.deployname}/roles/#{role.name}"
111
+ "/#{role.deployname}/roles/#{role.name}"
111
112
  end
112
113
  if compmedia
113
- @connection.query_azure(servicecall, "delete", "", "comp=media", wait=params[:wait])
114
+ @connection.query_azure(servicecall, "delete", "", "comp=media", wait = params[:wait])
114
115
  else
115
116
  @connection.query_azure(servicecall, "delete")
116
117
  end
@@ -127,13 +128,13 @@ module Azure
127
128
  # So Iteratively check for disk detachment from the VM while waiting for 5 minutes ,
128
129
  # exit otherwise after 12 attempts.
129
130
  for attempt in 0..12
130
- break if @connection.query_azure(servicecall, "get").search("AttachedTo").text == ""
131
- if attempt == 12 then puts "The associated disk could not be deleted due to time out." else sleep 25 end
131
+ break if @connection.query_azure(servicecall, "get").search("AttachedTo").text == ""
132
+ attempt == 12 ? (puts "The associated disk could not be deleted due to time out.") : (sleep 25)
132
133
  end
133
134
  unless params[:preserve_azure_vhd]
134
- @connection.query_azure(servicecall, 'delete', '', 'comp=media', wait=params[:wait])
135
+ @connection.query_azure(servicecall, "delete", "", "comp=media", wait = params[:wait])
135
136
  else
136
- @connection.query_azure(servicecall, 'delete')
137
+ @connection.query_azure(servicecall, "delete")
137
138
  end
138
139
  end
139
140
  end
@@ -151,11 +152,11 @@ module Azure
151
152
  end
152
153
 
153
154
  def check_and_delete_storage(params, disk_name, storage_account_name)
154
- if params[:delete_azure_storage_account]
155
- # Iteratively check for disk deletion
155
+ if params[:delete_azure_storage_account]
156
+ # Iteratively check for disk deletion
156
157
  for attempt in 0..12
157
- break unless @connection.query_azure("disks").search("Name").text.include?(disk_name)
158
- if attempt == 12 then puts "The associated disk could not be deleted due to time out." else sleep 25 end
158
+ break unless @connection.query_azure("disks").search("Name").text.include?(disk_name)
159
+ attempt == 12 ? (puts "The associated disk could not be deleted due to time out.") : (sleep 25)
159
160
  end
160
161
  begin
161
162
  @connection.query_azure("storageservices/#{storage_account_name}", "delete")
@@ -163,7 +164,7 @@ module Azure
163
164
  ui.warn("#{ex.message}")
164
165
  ui.warn("#{ex.backtrace.join("\n")}")
165
166
  end
166
- end
167
+ end
167
168
  end
168
169
 
169
170
  def update(name, params)
@@ -184,55 +185,55 @@ module Azure
184
185
  attr_accessor :hostname, :tcpports, :udpports
185
186
  attr_accessor :role_xml, :os_type, :os_version
186
187
 
187
- TCP_ENDPOINTS_MAPPING = { '3389' => 'Remote Desktop',
188
- '5986' => 'PowerShell',
189
- '22' => 'SSH',
190
- '21' => 'FTP',
191
- '25' => 'SMTP',
192
- '53' => 'DNS',
193
- '80' => 'HTTP',
194
- '110' => 'POP3',
195
- '143' => 'IMAP',
196
- '389' => 'LDAP',
197
- '443' => 'HTTPs',
198
- '587' => 'SMTPS',
199
- '995' => 'POP3S',
200
- '993' => 'IMAPS',
201
- '1433' => 'MSSQL',
202
- '3306' => 'MySQL'
203
- }
188
+ TCP_ENDPOINTS_MAPPING = { "3389" => "Remote Desktop",
189
+ "5986" => "PowerShell",
190
+ "22" => "SSH",
191
+ "21" => "FTP",
192
+ "25" => "SMTP",
193
+ "53" => "DNS",
194
+ "80" => "HTTP",
195
+ "110" => "POP3",
196
+ "143" => "IMAP",
197
+ "389" => "LDAP",
198
+ "443" => "HTTPs",
199
+ "587" => "SMTPS",
200
+ "995" => "POP3S",
201
+ "993" => "IMAPS",
202
+ "1433" => "MSSQL",
203
+ "3306" => "MySQL"
204
+ }
204
205
 
205
206
  def initialize(connection)
206
207
  @connection = connection
207
208
  end
208
209
 
209
210
  def parse(roleXML, hostedservicename, deployname)
210
- @name = xml_content(roleXML, 'RoleName')
211
- @status = xml_content(roleXML, 'InstanceStatus')
212
- @size = xml_content(roleXML, 'InstanceSize')
213
- @ipaddress = xml_content(roleXML, 'IpAddress')
214
- @hostname = xml_content(roleXML, 'HostName')
211
+ @name = xml_content(roleXML, "RoleName")
212
+ @status = xml_content(roleXML, "InstanceStatus")
213
+ @size = xml_content(roleXML, "InstanceSize")
214
+ @ipaddress = xml_content(roleXML, "IpAddress")
215
+ @hostname = xml_content(roleXML, "HostName")
215
216
  @hostedservicename = hostedservicename
216
217
  @deployname = deployname
217
218
  @thumbprint = fetch_thumbprint
218
219
  @tcpports = Array.new
219
220
  @udpports = Array.new
220
221
 
221
- endpoints = roleXML.css('InstanceEndpoint')
222
- @publicipaddress = xml_content(endpoints[0], 'Vip') if !endpoints.empty?
222
+ endpoints = roleXML.css("InstanceEndpoint")
223
+ @publicipaddress = xml_content(endpoints[0], "Vip") if !endpoints.empty?
223
224
  endpoints.each do |endpoint|
224
- if xml_content(endpoint, 'Name').downcase == 'ssh'
225
- @sshport = xml_content(endpoint, 'PublicPort')
226
- elsif xml_content(endpoint, 'Name').downcase == 'winrm'
227
- @winrmport = xml_content(endpoint, 'PublicPort')
225
+ if xml_content(endpoint, "Name").casecmp("ssh").zero?
226
+ @sshport = xml_content(endpoint, "PublicPort")
227
+ elsif xml_content(endpoint, "Name").casecmp("winrm").zero?
228
+ @winrmport = xml_content(endpoint, "PublicPort")
228
229
  else
229
230
  hash = Hash.new
230
- hash['Name'] = xml_content(endpoint, 'Name')
231
- hash['Vip'] = xml_content(endpoint, 'Vip')
232
- hash['PublicPort'] = xml_content(endpoint, 'PublicPort')
233
- hash['LocalPort'] = xml_content(endpoint, 'LocalPort')
231
+ hash["Name"] = xml_content(endpoint, "Name")
232
+ hash["Vip"] = xml_content(endpoint, "Vip")
233
+ hash["PublicPort"] = xml_content(endpoint, "PublicPort")
234
+ hash["LocalPort"] = xml_content(endpoint, "LocalPort")
234
235
 
235
- if xml_content(endpoint, 'Protocol') == 'tcp'
236
+ if xml_content(endpoint, "Protocol") == "tcp"
236
237
  @tcpports << hash
237
238
  else # == 'udp'
238
239
  @udpports << hash
@@ -243,31 +244,31 @@ module Azure
243
244
 
244
245
  def parse_role_list_xml(roleListXML)
245
246
  @role_xml = roleListXML
246
- os_disk_xml = roleListXML.css('OSVirtualHardDisk')
247
- @os_type = xml_content(os_disk_xml, 'OS')
248
- @os_version = xml_content(os_disk_xml, 'SourceImageName')
247
+ os_disk_xml = roleListXML.css("OSVirtualHardDisk")
248
+ @os_type = xml_content(os_disk_xml, "OS")
249
+ @os_version = xml_content(os_disk_xml, "SourceImageName")
249
250
  end
250
251
 
251
252
  # Expects endpoint_param_string to be in the form {localport}:{publicport}:{lb_set_name}:{lb_probe_path}
252
253
  # Only localport is mandatory.
253
254
  def parse_endpoint_from_params(protocol, azure_vm_name, endpoint_param_string)
254
- fields = endpoint_param_string.split(':').map(&:strip)
255
+ fields = endpoint_param_string.split(":").map(&:strip)
255
256
  hash = {}
256
- hash['LocalPort'] = fields[0]
257
- hash['Port'] = fields[1] || fields[0]
258
- hash['LoadBalancerName'] = fields[2] if fields[2] != 'EXTERNAL' # TODO: hackity hack.. Shouldn't use magic words.
259
- hash['LoadBalancedEndpointSetName'] = fields[3]
260
- hash['Protocol'] = protocol
261
- if TCP_ENDPOINTS_MAPPING.include?(hash['Port']) && protocol == 'TCP'
262
- hash['Name'] = TCP_ENDPOINTS_MAPPING[hash['Port']]
257
+ hash["LocalPort"] = fields[0]
258
+ hash["Port"] = fields[1] || fields[0]
259
+ hash["LoadBalancerName"] = fields[2] if fields[2] != "EXTERNAL" # TODO: hackity hack.. Shouldn't use magic words.
260
+ hash["LoadBalancedEndpointSetName"] = fields[3]
261
+ hash["Protocol"] = protocol
262
+ if TCP_ENDPOINTS_MAPPING.include?(hash["Port"]) && protocol == "TCP"
263
+ hash["Name"] = TCP_ENDPOINTS_MAPPING[hash["Port"]]
263
264
  else
264
- hash['Name'] = "#{protocol}Endpoint_chef_#{fields[0]}"
265
+ hash["Name"] = "#{protocol}Endpoint_chef_#{fields[0]}"
265
266
  end
266
267
  if fields[2]
267
- hash['LoadBalancerProbe'] = {}
268
- hash['LoadBalancerProbe']['Path'] = fields[4]
269
- hash['LoadBalancerProbe']['Port'] = fields[0]
270
- hash['LoadBalancerProbe']['Protocol'] = fields[4] ? 'HTTP' : protocol
268
+ hash["LoadBalancerProbe"] = {}
269
+ hash["LoadBalancerProbe"]["Path"] = fields[4]
270
+ hash["LoadBalancerProbe"]["Port"] = fields[0]
271
+ hash["LoadBalancerProbe"]["Protocol"] = fields[4] ? "HTTP" : protocol
271
272
  end
272
273
  hash
273
274
  end
@@ -283,252 +284,252 @@ module Azure
283
284
 
284
285
  if existing_endpoints
285
286
  existing_endpoints.each do |eep|
286
- ep = eep if eep['LoadBalancedEndpointSetName'] && ep['LoadBalancedEndpointSetName'] && ( eep['LoadBalancedEndpointSetName'] == ep['LoadBalancedEndpointSetName'] )
287
+ ep = eep if eep["LoadBalancedEndpointSetName"] && ep["LoadBalancedEndpointSetName"] && ( eep["LoadBalancedEndpointSetName"] == ep["LoadBalancedEndpointSetName"] )
287
288
  end
288
289
  end
289
290
 
290
- if ep['Port'] == params[:port] && ep['Protocol'].downcase == 'tcp'
291
+ if ep["Port"] == params[:port] && ep["Protocol"].casecmp("tcp").zero?
291
292
  puts("Skipping tcp-endpoints: #{ep['LocalPort']} because this port is already in use by ssh/winrm endpoint in current VM.")
292
293
  next
293
294
  end
294
295
 
295
- xml.InputEndpoint {
296
- xml.LoadBalancedEndpointSetName ep['LoadBalancedEndpointSetName'] if ep['LoadBalancedEndpointSetName']
297
- xml.LocalPort ep['LocalPort']
298
- xml.Name ep['Name']
299
- xml.Port ep['Port']
300
- if ep['LoadBalancerProbe']
301
- xml.LoadBalancerProbe {
302
- xml.Path ep['LoadBalancerProbe']['Path'] if ep['LoadBalancerProbe']['Path']
303
- xml.Port ep['LoadBalancerProbe']['Port']
304
- xml.Protocol ep['LoadBalancerProbe']['Protocol']
305
- xml.IntervalInSeconds ep['LoadBalancerProbe']['IntervalInSeconds'] if ep['LoadBalancerProbe']['IntervalInSeconds']
306
- xml.TimeoutInSeconds ep['LoadBalancerProbe']['TimeoutInSeconds'] if ep['LoadBalancerProbe']['TimeoutInSeconds']
307
- }
296
+ xml.InputEndpoint do
297
+ xml.LoadBalancedEndpointSetName ep["LoadBalancedEndpointSetName"] if ep["LoadBalancedEndpointSetName"]
298
+ xml.LocalPort ep["LocalPort"]
299
+ xml.Name ep["Name"]
300
+ xml.Port ep["Port"]
301
+ if ep["LoadBalancerProbe"]
302
+ xml.LoadBalancerProbe do
303
+ xml.Path ep["LoadBalancerProbe"]["Path"] if ep["LoadBalancerProbe"]["Path"]
304
+ xml.Port ep["LoadBalancerProbe"]["Port"]
305
+ xml.Protocol ep["LoadBalancerProbe"]["Protocol"]
306
+ xml.IntervalInSeconds ep["LoadBalancerProbe"]["IntervalInSeconds"] if ep["LoadBalancerProbe"]["IntervalInSeconds"]
307
+ xml.TimeoutInSeconds ep["LoadBalancerProbe"]["TimeoutInSeconds"] if ep["LoadBalancerProbe"]["TimeoutInSeconds"]
308
+ end
308
309
  end
309
- xml.Protocol ep['Protocol']
310
- xml.EnableDirectServerReturn ep['EnableDirectServerReturn'] if ep['EnableDirectServerReturn']
311
- xml.LoadBalancerName ep['LoadBalancerName'] if ep['LoadBalancerName']
312
- xml.IdleTimeoutInMinutes ep['IdleTimeoutInMinutes'] if ep['IdleTimeoutInMinutes']
313
- }
310
+ xml.Protocol ep["Protocol"]
311
+ xml.EnableDirectServerReturn ep["EnableDirectServerReturn"] if ep["EnableDirectServerReturn"]
312
+ xml.LoadBalancerName ep["LoadBalancerName"] if ep["LoadBalancerName"]
313
+ xml.IdleTimeoutInMinutes ep["IdleTimeoutInMinutes"] if ep["IdleTimeoutInMinutes"]
314
+ end
314
315
  end
315
316
  end
316
317
 
317
318
  def fetch_thumbprint
318
319
  query_result = connection.query_azure("hostedservices/#{@hostedservicename}/deployments/#{@hostedservicename}/roles/#{@name}")
319
- query_result.at_css("DefaultWinRmCertificateThumbprint").nil? ? '' : query_result.at_css("DefaultWinRmCertificateThumbprint").text
320
+ query_result.at_css("DefaultWinRmCertificateThumbprint").nil? ? "" : query_result.at_css("DefaultWinRmCertificateThumbprint").text
320
321
  end
321
322
 
322
323
  def setup(params)
323
324
  azure_user_domain_name = params[:azure_user_domain_name] || params[:azure_domain_name]
324
325
  builder = Nokogiri::XML::Builder.new do |xml|
325
326
  xml.PersistentVMRole(
326
- 'xmlns'=>'http://schemas.microsoft.com/windowsazure',
327
- 'xmlns:i'=>'http://www.w3.org/2001/XMLSchema-instance'
328
- ) {
329
- xml.RoleName {xml.text params[:azure_vm_name]}
330
- xml.OsVersion('i:nil' => 'true')
331
- xml.RoleType 'PersistentVMRole'
332
-
333
- xml.ConfigurationSets {
334
- if params[:os_type] == 'Linux'
335
- xml.ConfigurationSet('i:type' => 'LinuxProvisioningConfigurationSet') {
336
- xml.ConfigurationSetType 'LinuxProvisioningConfiguration'
327
+ "xmlns" => "http://schemas.microsoft.com/windowsazure",
328
+ "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance"
329
+ ) do
330
+ xml.RoleName { xml.text params[:azure_vm_name] }
331
+ xml.OsVersion("i:nil" => "true")
332
+ xml.RoleType "PersistentVMRole"
333
+
334
+ xml.ConfigurationSets do
335
+ if params[:os_type] == "Linux"
336
+ xml.ConfigurationSet("i:type" => "LinuxProvisioningConfigurationSet") do
337
+ xml.ConfigurationSetType "LinuxProvisioningConfiguration"
337
338
  xml.HostName params[:azure_vm_name]
338
339
  xml.UserName params[:ssh_user]
339
340
  unless params[:identity_file].nil?
340
- xml.DisableSshPasswordAuthentication 'true'
341
- xml.SSH {
342
- xml.PublicKeys {
343
- xml.PublicKey {
344
- xml.Fingerprint params[:fingerprint].to_s.upcase
345
- xml.Path '/home/' + params[:ssh_user] + '/.ssh/authorized_keys'
346
- }
347
- }
348
- }
341
+ xml.DisableSshPasswordAuthentication "true"
342
+ xml.SSH do
343
+ xml.PublicKeys do
344
+ xml.PublicKey do
345
+ xml.Fingerprint params[:fingerprint].to_s.upcase
346
+ xml.Path "/home/" + params[:ssh_user] + "/.ssh/authorized_keys"
347
+ end
348
+ end
349
+ end
349
350
  else
350
351
  xml.UserPassword params[:ssh_password]
351
- xml.DisableSshPasswordAuthentication 'false'
352
+ xml.DisableSshPasswordAuthentication "false"
352
353
  end
353
- }
354
- elsif params[:os_type] == 'Windows'
355
- xml.ConfigurationSet('i:type' => 'WindowsProvisioningConfigurationSet') {
356
- xml.ConfigurationSetType 'WindowsProvisioningConfiguration'
354
+ end
355
+ elsif params[:os_type] == "Windows"
356
+ xml.ConfigurationSet("i:type" => "WindowsProvisioningConfigurationSet") do
357
+ xml.ConfigurationSetType "WindowsProvisioningConfiguration"
357
358
  xml.ComputerName params[:azure_vm_name]
358
359
  xml.AdminPassword params[:admin_password]
359
- xml.ResetPasswordOnFirstLogon 'false'
360
- xml.EnableAutomaticUpdates 'false'
360
+ xml.ResetPasswordOnFirstLogon "false"
361
+ xml.EnableAutomaticUpdates "false"
361
362
  if params[:azure_domain_name]
362
- xml.DomainJoin {
363
- xml.Credentials {
363
+ xml.DomainJoin do
364
+ xml.Credentials do
364
365
  xml.Domain azure_user_domain_name
365
- xml.Username params[:azure_domain_user]
366
- xml.Password params[:azure_domain_passwd]
367
- }
368
- xml.JoinDomain params[:azure_domain_name]
369
- xml.MachineObjectOU params[:azure_domain_ou_dn] if params[:azure_domain_ou_dn]
370
- }
366
+ xml.Username params[:azure_domain_user]
367
+ xml.Password params[:azure_domain_passwd]
368
+ end
369
+ xml.JoinDomain params[:azure_domain_name]
370
+ xml.MachineObjectOU params[:azure_domain_ou_dn] if params[:azure_domain_ou_dn]
371
+ end
371
372
  end
372
- if params[:bootstrap_proto].downcase == 'winrm'
373
- if params[:ssl_cert_fingerprint]
374
- xml.StoredCertificateSettings {
375
- xml.CertificateSetting {
376
- xml.StoreLocation "LocalMachine"
377
- xml.StoreName "My"
378
- xml.Thumbprint params[:ssl_cert_fingerprint]
379
- }
380
- }
373
+ if params[:bootstrap_proto].casecmp("winrm").zero?
374
+ if params[:ssl_cert_fingerprint]
375
+ xml.StoredCertificateSettings do
376
+ xml.CertificateSetting do
377
+ xml.StoreLocation "LocalMachine"
378
+ xml.StoreName "My"
379
+ xml.Thumbprint params[:ssl_cert_fingerprint]
380
+ end
381
381
  end
382
- xml.WinRM {
383
- xml.Listeners {
384
- if params[:winrm_transport] == "ssl" || params[:ssl_cert_fingerprint]
385
- xml.Listener {
382
+ end
383
+ xml.WinRM do
384
+ xml.Listeners do
385
+ if params[:winrm_transport] == "ssl" || params[:ssl_cert_fingerprint]
386
+ xml.Listener do
386
387
  xml.CertificateThumbprint params[:ssl_cert_fingerprint] if params[:ssl_cert_fingerprint]
387
- xml.Protocol 'Https'
388
- }
389
- else
390
- xml.Listener {
391
- xml.Protocol 'Http'
392
- }
388
+ xml.Protocol "Https"
393
389
  end
394
- }
395
- }
390
+ else
391
+ xml.Listener do
392
+ xml.Protocol "Http"
393
+ end
394
+ end
395
+ end
396
396
  end
397
+ end
397
398
  xml.AdminUsername params[:winrm_user]
398
- if params[:bootstrap_proto].downcase == 'winrm' && (params[:winrm_max_timeout] || params[:winrm_max_memoryPerShell])
399
- xml.AdditionalUnattendContent {
400
- xml.Passes {
401
- xml.UnattendPass {
402
- xml.PassName 'oobeSystem'
403
- xml.Components {
404
- xml.UnattendComponent {
405
- xml.ComponentName 'Microsoft-Windows-Shell-Setup'
406
- xml.ComponentSettings {
407
- xml.ComponentSetting {
408
- xml.SettingName 'AutoLogon'
399
+ if params[:bootstrap_proto].casecmp("winrm").zero? && (params[:winrm_max_timeout] || params[:winrm_max_memoryPerShell])
400
+ xml.AdditionalUnattendContent do
401
+ xml.Passes do
402
+ xml.UnattendPass do
403
+ xml.PassName "oobeSystem"
404
+ xml.Components do
405
+ xml.UnattendComponent do
406
+ xml.ComponentName "Microsoft-Windows-Shell-Setup"
407
+ xml.ComponentSettings do
408
+ xml.ComponentSetting do
409
+ xml.SettingName "AutoLogon"
409
410
  xml.Content Base64.encode64(
410
411
  Nokogiri::XML::Builder.new do |auto_logon_xml|
411
- auto_logon_xml.AutoLogon {
412
+ auto_logon_xml.AutoLogon do
412
413
  auto_logon_xml.Username params[:winrm_user]
413
- auto_logon_xml.Password {
414
+ auto_logon_xml.Password do
414
415
  auto_logon_xml.Value params[:admin_password]
415
416
  auto_logon_xml.PlainText true
416
- }
417
+ end
417
418
  auto_logon_xml.LogonCount 1
418
419
  auto_logon_xml.Enabled true
419
- }
420
+ end
420
421
  end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
421
422
  ).strip
422
- }
423
- xml.ComponentSetting {
424
- xml.SettingName 'FirstLogonCommands'
423
+ end
424
+ xml.ComponentSetting do
425
+ xml.SettingName "FirstLogonCommands"
425
426
  xml.Content Base64.encode64(
426
427
  Nokogiri::XML::Builder.new do |first_logon_xml|
427
- first_logon_xml.FirstLogonCommands {
428
+ first_logon_xml.FirstLogonCommands do
428
429
  if params[:winrm_max_timeout]
429
- first_logon_xml.SynchronousCommand('wcm:action' => 'add') {
430
+ first_logon_xml.SynchronousCommand("wcm:action" => "add") do
430
431
  first_logon_xml.Order 1
431
432
  first_logon_xml.CommandLine "cmd.exe /c winrm set winrm/config @{MaxTimeoutms=\"#{params[:winrm_max_timeout]}\"}"
432
433
  first_logon_xml.Description "Bump WinRM max timeout to #{params[:winrm_max_timeout]} milliseconds"
433
- }
434
+ end
434
435
  end
435
436
 
436
437
  if params[:winrm_max_memoryPerShell]
437
- first_logon_xml.SynchronousCommand('wcm:action' => 'add') {
438
+ first_logon_xml.SynchronousCommand("wcm:action" => "add") do
438
439
  first_logon_xml.Order 2
439
440
  first_logon_xml.CommandLine "cmd.exe /c winrm set winrm/config/winrs @{MaxMemoryPerShellMB=\"#{params[:winrm_max_memoryPerShell]}\"}"
440
441
  first_logon_xml.Description "Bump WinRM max memory per shell to #{params[:winrm_max_memoryPerShell]} MB"
441
- }
442
+ end
442
443
  end
443
- }
444
+ end
444
445
  end.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION)
445
446
  ).strip
446
- }
447
- }
448
- }
449
- }
450
- }
451
- }
452
- }
447
+ end
448
+ end
449
+ end
450
+ end
451
+ end
452
+ end
453
+ end
453
454
  end
454
- }
455
+ end
455
456
  end
456
457
 
457
- xml.ConfigurationSet('i:type' => 'NetworkConfigurationSet') {
458
- xml.ConfigurationSetType 'NetworkConfiguration'
459
- xml.InputEndpoints {
458
+ xml.ConfigurationSet("i:type" => "NetworkConfigurationSet") do
459
+ xml.ConfigurationSetType "NetworkConfiguration"
460
+ xml.InputEndpoints do
460
461
 
461
462
  #1. bootstrap_proto = 'winrm' for windows => Set winrm port
462
463
  #2. bootstrap_proto = 'ssh' for windows and linux => Set ssh port
463
464
  #3. bootstrap_proto = 'cloud-api' for windows and linux => Set no port
464
- if params[:os_type] == 'Windows' and params[:bootstrap_proto].downcase == 'winrm'
465
- xml.InputEndpoint {
466
- if params[:winrm_transport] == "ssl"
467
- xml.LocalPort '5986'
468
- else
469
- xml.LocalPort '5985'
465
+ if (params[:os_type] == "Windows") && (params[:bootstrap_proto].casecmp("winrm").zero?)
466
+ xml.InputEndpoint do
467
+ if params[:winrm_transport] == "ssl"
468
+ xml.LocalPort "5986"
469
+ else
470
+ xml.LocalPort "5985"
471
+ end
472
+ xml.Name "WinRM"
473
+ xml.Port params[:port]
474
+ xml.Protocol "TCP"
475
+ end
476
+ elsif params[:bootstrap_proto].casecmp("ssh").zero?
477
+ xml.InputEndpoint do
478
+ xml.LocalPort "22"
479
+ xml.Name "SSH"
480
+ xml.Port params[:port]
481
+ xml.Protocol "TCP"
470
482
  end
471
- xml.Name 'WinRM'
472
- xml.Port params[:port]
473
- xml.Protocol 'TCP'
474
- }
475
- elsif(params[:bootstrap_proto].downcase == 'ssh')
476
- xml.InputEndpoint {
477
- xml.LocalPort '22'
478
- xml.Name 'SSH'
479
- xml.Port params[:port]
480
- xml.Protocol 'TCP'
481
- }
482
483
  end
483
484
  all_endpoints = Array.new
484
485
 
485
486
  if params[:tcp_endpoints]
486
- params[:tcp_endpoints].split(',').map(&:strip).each do |endpoint|
487
- all_endpoints << parse_endpoint_from_params('TCP', params[:azure_vm_name], endpoint)
487
+ params[:tcp_endpoints].split(",").map(&:strip).each do |endpoint|
488
+ all_endpoints << parse_endpoint_from_params("TCP", params[:azure_vm_name], endpoint)
488
489
  end
489
490
  end
490
491
  if params[:udp_endpoints]
491
- params[:udp_endpoints].split(',').map(&:strip).each do |endpoint|
492
- all_endpoints << parse_endpoint_from_params('UDP', params[:azure_vm_name], endpoint)
492
+ params[:udp_endpoints].split(",").map(&:strip).each do |endpoint|
493
+ all_endpoints << parse_endpoint_from_params("UDP", params[:azure_vm_name], endpoint)
493
494
  end
494
495
  end
495
496
  add_endpoints_to_xml(xml, all_endpoints, params) if all_endpoints.any?
496
- }
497
+ end
497
498
  if params[:azure_subnet_name]
498
- xml.SubnetNames {
499
+ xml.SubnetNames do
499
500
  xml.SubnetName params[:azure_subnet_name]
500
- }
501
+ end
501
502
  end
502
- }
503
- }
503
+ end
504
+ end
504
505
 
505
506
  # Azure resource extension support
506
- if params[:bootstrap_proto] == 'cloud-api'
507
- xml.ResourceExtensionReferences {
508
- xml.ResourceExtensionReference {
507
+ if params[:bootstrap_proto] == "cloud-api"
508
+ xml.ResourceExtensionReferences do
509
+ xml.ResourceExtensionReference do
509
510
  xml.ReferenceName params[:chef_extension]
510
511
  xml.Publisher params[:chef_extension_publisher]
511
512
  xml.Name params[:chef_extension]
512
513
  xml.Version params[:chef_extension_version]
513
- xml.ResourceExtensionParameterValues {
514
+ xml.ResourceExtensionParameterValues do
514
515
  if params[:chef_extension_public_param]
515
- xml.ResourceExtensionParameterValue {
516
+ xml.ResourceExtensionParameterValue do
516
517
  xml.Key "PublicParams"
517
518
  xml.Value Base64.encode64(params[:chef_extension_public_param].to_json)
518
519
  xml.Type "Public"
519
- }
520
+ end
520
521
  end
521
522
  if params[:chef_extension_private_param]
522
- xml.ResourceExtensionParameterValue {
523
+ xml.ResourceExtensionParameterValue do
523
524
  xml.Key "PrivateParams"
524
525
  xml.Value Base64.encode64(params[:chef_extension_private_param].to_json)
525
526
  xml.Type "Private"
526
- }
527
+ end
527
528
  end
528
- }
529
+ end
529
530
  xml.State "Enable"
530
- }
531
- }
531
+ end
532
+ end
532
533
  end
533
534
 
534
535
  if params[:azure_availability_set]
@@ -540,26 +541,26 @@ module Azure
540
541
  xml.Label Base64.encode64(params[:azure_vm_name]).strip
541
542
 
542
543
  #OSVirtualHardDisk not required in case azure_source_image is a VMImage
543
- unless(params[:is_vm_image])
544
- xml.OSVirtualHardDisk {
544
+ unless params[:is_vm_image]
545
+ xml.OSVirtualHardDisk do
545
546
  disk_name = params[:azure_os_disk_name] || "disk_" + SecureRandom.uuid
546
547
  xml.DiskName disk_name
547
- domain_suffix = params[:azure_api_host_name] ? params[:azure_api_host_name].scan(/core.*/)[0] : ''
548
- xml.MediaLink 'http://' + params[:azure_storage_account] + '.blob.' + domain_suffix + '/vhds/' + disk_name + '.vhd'
548
+ domain_suffix = params[:azure_api_host_name] ? params[:azure_api_host_name].scan(/core.*/)[0] : ""
549
+ xml.MediaLink "http://" + params[:azure_storage_account] + ".blob." + domain_suffix + "/vhds/" + disk_name + ".vhd"
549
550
  xml.SourceImageName params[:azure_source_image]
550
- }
551
+ end
551
552
  end
552
553
 
553
554
  xml.RoleSize params[:azure_vm_size]
554
- xml.ProvisionGuestAgent true if params[:bootstrap_proto] == 'cloud-api'
555
- }
555
+ xml.ProvisionGuestAgent true if params[:bootstrap_proto] == "cloud-api"
556
+ end
556
557
  end
557
558
  builder.doc
558
559
  end
559
560
 
560
561
  def create(params, roleXML)
561
562
  servicecall = "hostedservices/#{params[:azure_dns_name]}/deployments" +
562
- "/#{params['deploy_name']}/roles"
563
+ "/#{params['deploy_name']}/roles"
563
564
  @connection.query_azure(servicecall, "post", roleXML.to_xml)
564
565
  end
565
566
 
@@ -576,31 +577,31 @@ module Azure
576
577
  ## using the required values of the updated role_xml
577
578
  builder = Nokogiri::XML::Builder.new do |xml|
578
579
  xml.PersistentVMRole(
579
- 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
580
- 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
581
- ) {
582
- xml.ConfigurationSets role_xml.at_css('ConfigurationSets').children if !role_xml.at_css('ConfigurationSets').nil?
583
- xml.ResourceExtensionReferences role_xml.at_css('ResourceExtensionReferences').children if !role_xml.at_css('ResourceExtensionReferences').nil?
584
- xml.AvailabilitySetName role_xml.at_css('AvailabilitySetName').children if !role_xml.at_css('AvailabilitySetName').nil?
585
- xml.DataVirtualHardDisks role_xml.at_css('DataVirtualHardDisks').children if !role_xml.at_css('DataVirtualHardDisks').nil?
586
- xml.OSVirtualHardDisk role_xml.at_css('OSVirtualHardDisk').children if !role_xml.at_css('OSVirtualHardDisk').nil?
587
- xml.RoleSize role_xml.at_css('RoleSize').children if !role_xml.at_css('RoleSize').nil?
588
- xml.ProvisionGuestAgent role_xml.at_css('ProvisionGuestAgent').children if !role_xml.at_css('ProvisionGuestAgent').nil?
589
- }
580
+ "xmlns" => "http://schemas.microsoft.com/windowsazure",
581
+ "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance"
582
+ ) do
583
+ xml.ConfigurationSets role_xml.at_css("ConfigurationSets").children if !role_xml.at_css("ConfigurationSets").nil?
584
+ xml.ResourceExtensionReferences role_xml.at_css("ResourceExtensionReferences").children if !role_xml.at_css("ResourceExtensionReferences").nil?
585
+ xml.AvailabilitySetName role_xml.at_css("AvailabilitySetName").children if !role_xml.at_css("AvailabilitySetName").nil?
586
+ xml.DataVirtualHardDisks role_xml.at_css("DataVirtualHardDisks").children if !role_xml.at_css("DataVirtualHardDisks").nil?
587
+ xml.OSVirtualHardDisk role_xml.at_css("OSVirtualHardDisk").children if !role_xml.at_css("OSVirtualHardDisk").nil?
588
+ xml.RoleSize role_xml.at_css("RoleSize").children if !role_xml.at_css("RoleSize").nil?
589
+ xml.ProvisionGuestAgent role_xml.at_css("ProvisionGuestAgent").children if !role_xml.at_css("ProvisionGuestAgent").nil?
590
+ end
590
591
  end
591
592
 
592
- builder.doc.to_xml.gsub("&lt\;","<").gsub("&gt\;",">")
593
+ builder.doc.to_xml.gsub("&lt\;", "<").gsub("&gt\;", ">")
593
594
  end
594
595
 
595
596
  def update_role_xml_for_extension(roleXML, params)
596
597
  ## check if 'ResourceExtensionReferences' node already exist in the XML,
597
598
  ## if no add it, else retrieve the object of the existing node
598
- add_resource_extension_references = roleXML.at_css('ResourceExtensionReferences').nil?
599
+ add_resource_extension_references = roleXML.at_css("ResourceExtensionReferences").nil?
599
600
 
600
601
  if add_resource_extension_references
601
- resource_extension_references = Nokogiri::XML::Node.new('ResourceExtensionReferences', roleXML)
602
+ resource_extension_references = Nokogiri::XML::Node.new("ResourceExtensionReferences", roleXML)
602
603
  else
603
- resource_extension_references = roleXML.css('ResourceExtensionReferences')
604
+ resource_extension_references = roleXML.css("ResourceExtensionReferences")
604
605
  end
605
606
 
606
607
  ## check if Azure Chef Extension is already installed on the given server,
@@ -608,8 +609,8 @@ module Azure
608
609
  ## already installed
609
610
  ext = nil
610
611
  if !add_resource_extension_references
611
- if !resource_extension_references.at_css('ReferenceName').nil?
612
- resource_extension_references.css('ReferenceName').each { |node| ext = node if node.content == params[:chef_extension] }
612
+ if !resource_extension_references.at_css("ReferenceName").nil?
613
+ resource_extension_references.css("ReferenceName").each { |node| ext = node if node.content == params[:chef_extension] }
613
614
  end
614
615
  end
615
616
 
@@ -617,56 +618,56 @@ module Azure
617
618
 
618
619
  ## create Azure Chef Extension config and add it in the role_xml
619
620
  if add_resource_extension_reference
620
- resource_extension_reference = Nokogiri::XML::Node.new('ResourceExtensionReference', roleXML)
621
+ resource_extension_reference = Nokogiri::XML::Node.new("ResourceExtensionReference", roleXML)
621
622
 
622
- reference_name = Nokogiri::XML::Node.new('ReferenceName', roleXML)
623
+ reference_name = Nokogiri::XML::Node.new("ReferenceName", roleXML)
623
624
  reference_name.content = params[:chef_extension]
624
625
  resource_extension_reference.add_child(reference_name)
625
626
 
626
- publisher = Nokogiri::XML::Node.new('Publisher', roleXML)
627
+ publisher = Nokogiri::XML::Node.new("Publisher", roleXML)
627
628
  publisher.content = params[:chef_extension_publisher]
628
629
  resource_extension_reference.add_child(publisher)
629
630
 
630
- name = Nokogiri::XML::Node.new('Name', roleXML)
631
+ name = Nokogiri::XML::Node.new("Name", roleXML)
631
632
  name.content = params[:chef_extension]
632
633
  resource_extension_reference.add_child(name)
633
634
 
634
- version = Nokogiri::XML::Node.new('Version', roleXML)
635
+ version = Nokogiri::XML::Node.new("Version", roleXML)
635
636
  version.content = params[:chef_extension_version]
636
637
  resource_extension_reference.add_child(version)
637
638
 
638
- resource_extension_parameter_values = Nokogiri::XML::Node.new('ResourceExtensionParameterValues', roleXML)
639
+ resource_extension_parameter_values = Nokogiri::XML::Node.new("ResourceExtensionParameterValues", roleXML)
639
640
  if params[:chef_extension_public_param]
640
- resource_extension_parameter_value = Nokogiri::XML::Node.new('ResourceExtensionParameterValue', roleXML)
641
+ resource_extension_parameter_value = Nokogiri::XML::Node.new("ResourceExtensionParameterValue", roleXML)
641
642
 
642
- key = Nokogiri::XML::Node.new('Key', roleXML)
643
- key.content = 'PublicParams'
643
+ key = Nokogiri::XML::Node.new("Key", roleXML)
644
+ key.content = "PublicParams"
644
645
  resource_extension_parameter_value.add_child(key)
645
646
 
646
- value = Nokogiri::XML::Node.new('Value', roleXML)
647
+ value = Nokogiri::XML::Node.new("Value", roleXML)
647
648
  value.content = Base64.encode64(params[:chef_extension_public_param].to_json)
648
649
  resource_extension_parameter_value.add_child(value)
649
650
 
650
- type = Nokogiri::XML::Node.new('Type', roleXML)
651
- type.content = 'Public'
651
+ type = Nokogiri::XML::Node.new("Type", roleXML)
652
+ type.content = "Public"
652
653
  resource_extension_parameter_value.add_child(type)
653
654
 
654
655
  resource_extension_parameter_values.add_child(resource_extension_parameter_value)
655
656
  end
656
657
 
657
658
  if params[:chef_extension_private_param]
658
- resource_extension_parameter_value = Nokogiri::XML::Node.new('ResourceExtensionParameterValue', roleXML)
659
+ resource_extension_parameter_value = Nokogiri::XML::Node.new("ResourceExtensionParameterValue", roleXML)
659
660
 
660
- key = Nokogiri::XML::Node.new('Key', roleXML)
661
- key.content = 'PrivateParams'
661
+ key = Nokogiri::XML::Node.new("Key", roleXML)
662
+ key.content = "PrivateParams"
662
663
  resource_extension_parameter_value.add_child(key)
663
664
 
664
- value = Nokogiri::XML::Node.new('Value', roleXML)
665
+ value = Nokogiri::XML::Node.new("Value", roleXML)
665
666
  value.content = Base64.encode64(params[:chef_extension_private_param].to_json)
666
667
  resource_extension_parameter_value.add_child(value)
667
668
 
668
- type = Nokogiri::XML::Node.new('Type', roleXML)
669
- type.content = 'Private'
669
+ type = Nokogiri::XML::Node.new("Type", roleXML)
670
+ type.content = "Private"
670
671
  resource_extension_parameter_value.add_child(type)
671
672
 
672
673
  resource_extension_parameter_values.add_child(resource_extension_parameter_value)
@@ -674,8 +675,8 @@ module Azure
674
675
 
675
676
  resource_extension_reference.add_child(resource_extension_parameter_values)
676
677
 
677
- state = Nokogiri::XML::Node.new('State', roleXML)
678
- state.content = 'enable'
678
+ state = Nokogiri::XML::Node.new("State", roleXML)
679
+ state.content = "enable"
679
680
  resource_extension_reference.add_child(state)
680
681
 
681
682
  if add_resource_extension_references
@@ -686,13 +687,13 @@ module Azure
686
687
 
687
688
  roleXML.add_child(resource_extension_references) if add_resource_extension_references
688
689
 
689
- add_provision_guest_agent = roleXML.at_css('ProvisionGuestAgent').nil?
690
+ add_provision_guest_agent = roleXML.at_css("ProvisionGuestAgent").nil?
690
691
 
691
692
  if add_provision_guest_agent
692
- provision_guest_agent = Nokogiri::XML::Node.new('ProvisionGuestAgent', roleXML)
693
+ provision_guest_agent = Nokogiri::XML::Node.new("ProvisionGuestAgent", roleXML)
693
694
  provision_guest_agent.content = true
694
695
  else
695
- provision_guest_agent = roleXML.css('ProvisionGuestAgent')
696
+ provision_guest_agent = roleXML.css("ProvisionGuestAgent")
696
697
  provision_guest_agent.first.content = true
697
698
  end
698
699
 
@@ -707,12 +708,12 @@ module Azure
707
708
  def update(name, params, roleXML)
708
709
  puts "Updating server role..."
709
710
  servicecall = "hostedservices/#{params[:azure_dns_name]}" +
710
- "/deployments/#{params[:deploy_name]}/roles/#{name}"
711
- ret_val = @connection.query_azure(servicecall, 'put', roleXML, '', true, true, 'application/xml')
711
+ "/deployments/#{params[:deploy_name]}/roles/#{name}"
712
+ ret_val = @connection.query_azure(servicecall, "put", roleXML, "", true, true, "application/xml")
712
713
  error_code, error_message = error_from_response_xml(ret_val)
713
714
  if error_code.length > 0
714
715
  Chef::Log.debug(ret_val.to_s)
715
- raise 'Unable to update role:' + error_code + ' : ' + error_message
716
+ raise "Unable to update role:" + error_code + " : " + error_message
716
717
  end
717
718
  end
718
719
  end