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,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Jeff Mendoza (jeffmendoza@live.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");
|
@@ -25,13 +25,13 @@ module Azure
|
|
25
25
|
def load
|
26
26
|
@ags ||= begin
|
27
27
|
@ags = {}
|
28
|
-
response = @connection.query_azure(
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
response = @connection.query_azure("affinitygroups",
|
29
|
+
"get",
|
30
|
+
"",
|
31
|
+
"",
|
32
32
|
true,
|
33
33
|
false)
|
34
|
-
response.css(
|
34
|
+
response.css("AffinityGroup").each do |ag|
|
35
35
|
item = AG.new(@connection).parse(ag)
|
36
36
|
@ags[item.name] = item
|
37
37
|
end
|
@@ -67,18 +67,18 @@ module Azure
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def parse(image)
|
70
|
-
@name = image.at_css(
|
71
|
-
@label = image.at_css(
|
72
|
-
@description = image.at_css(
|
73
|
-
image.at_css(
|
74
|
-
@location = image.at_css(
|
70
|
+
@name = image.at_css("Name").content
|
71
|
+
@label = image.at_css("Label").content
|
72
|
+
@description = image.at_css("Description").content if
|
73
|
+
image.at_css("Description")
|
74
|
+
@location = image.at_css("Location").content if image.at_css("Location")
|
75
75
|
self
|
76
76
|
end
|
77
77
|
|
78
78
|
def create(params)
|
79
|
-
builder = Nokogiri::XML::Builder.new(encoding:
|
79
|
+
builder = Nokogiri::XML::Builder.new(encoding: "utf-8") do |xml|
|
80
80
|
xml.CreateAffinityGroup(
|
81
|
-
xmlns:
|
81
|
+
xmlns: "http://schemas.microsoft.com/windowsazure"
|
82
82
|
) do
|
83
83
|
xml.Name params[:azure_ag_name]
|
84
84
|
xml.Label Base64.strict_encode64(params[:azure_ag_name])
|
@@ -88,10 +88,10 @@ module Azure
|
|
88
88
|
xml.Location params[:azure_location]
|
89
89
|
end
|
90
90
|
end
|
91
|
-
@connection.query_azure(
|
92
|
-
|
91
|
+
@connection.query_azure("affinitygroups",
|
92
|
+
"post",
|
93
93
|
builder.to_xml,
|
94
|
-
|
94
|
+
"",
|
95
95
|
true,
|
96
96
|
false)
|
97
97
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Mukta Aphale (mukta.aphale@clogeny.com)
|
3
|
-
# Copyright:: Copyright
|
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,7 +19,7 @@
|
|
19
19
|
module Azure
|
20
20
|
class Certificates
|
21
21
|
def initialize(connection)
|
22
|
-
@connection=connection
|
22
|
+
@connection = connection
|
23
23
|
end
|
24
24
|
|
25
25
|
def create(params)
|
@@ -33,7 +33,7 @@ module Azure
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def create_ssl_certificate(azure_dns_name)
|
36
|
-
cert_params = { output_file:
|
36
|
+
cert_params = { output_file: "winrm", key_length: 2048, cert_validity: 24,
|
37
37
|
azure_dns_name: azure_dns_name }
|
38
38
|
certificate = Certificate.new(@connection)
|
39
39
|
thumbprint = certificate.create_ssl_certificate(cert_params)
|
@@ -58,15 +58,15 @@ module Azure
|
|
58
58
|
def create(params)
|
59
59
|
# If RSA private key has been specified, then generate an x 509 certificate from the
|
60
60
|
# public part of the key
|
61
|
-
@cert_data = generate_public_key_certificate_data({:ssh_key => params[:identity_file],
|
62
|
-
|
63
|
-
add_certificate @cert_data,
|
61
|
+
@cert_data = generate_public_key_certificate_data({ :ssh_key => params[:identity_file],
|
62
|
+
:ssh_key_passphrase => params[:identity_file_passphrase] })
|
63
|
+
add_certificate @cert_data, "knifeazure", "pfx", params[:azure_dns_name]
|
64
64
|
|
65
65
|
# Return the fingerprint to be used while adding role
|
66
66
|
@fingerprint
|
67
67
|
end
|
68
68
|
|
69
|
-
def generate_public_key_certificate_data
|
69
|
+
def generate_public_key_certificate_data(params)
|
70
70
|
# Generate OpenSSL RSA key from the mentioned ssh key path (and passphrase)
|
71
71
|
key = OpenSSL::PKey::RSA.new(File.read(params[:ssh_key]), params[:ssh_key_passphrase])
|
72
72
|
# Generate X 509 certificate
|
@@ -81,28 +81,28 @@ module Azure
|
|
81
81
|
ef = OpenSSL::X509::ExtensionFactory.new
|
82
82
|
ef.subject_certificate = ca
|
83
83
|
ef.issuer_certificate = ca
|
84
|
-
ca.add_extension(ef.create_extension("basicConstraints","CA:TRUE",true))
|
85
|
-
ca.add_extension(ef.create_extension("keyUsage","keyCertSign, cRLSign", true))
|
86
|
-
ca.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false))
|
87
|
-
ca.add_extension(ef.create_extension("authorityKeyIdentifier","keyid:always",false))
|
84
|
+
ca.add_extension(ef.create_extension("basicConstraints", "CA:TRUE", true))
|
85
|
+
ca.add_extension(ef.create_extension("keyUsage", "keyCertSign, cRLSign", true))
|
86
|
+
ca.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false))
|
87
|
+
ca.add_extension(ef.create_extension("authorityKeyIdentifier", "keyid:always", false))
|
88
88
|
ca.sign(key, OpenSSL::Digest::SHA256.new)
|
89
89
|
# Generate the SHA1 fingerprint of the der format of the X 509 certificate
|
90
|
-
@fingerprint =
|
90
|
+
@fingerprint = OpenSSL::Digest::SHA1.new(ca.to_der)
|
91
91
|
# Create the pfx format of the certificate
|
92
|
-
pfx = OpenSSL::PKCS12.create(
|
92
|
+
pfx = OpenSSL::PKCS12.create("knifeazure", "knife-azure-pfx", key, ca)
|
93
93
|
# Encode the pfx format - upload this certificate
|
94
94
|
Base64.strict_encode64(pfx.to_der)
|
95
95
|
end
|
96
96
|
|
97
|
-
def add_certificate
|
97
|
+
def add_certificate(certificate_data, certificate_password, certificate_format, dns_name)
|
98
98
|
# Generate XML to call the API
|
99
99
|
# Add certificate to the hosted service
|
100
100
|
builder = Nokogiri::XML::Builder.new do |xml|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
101
|
+
xml.CertificateFile("xmlns" => "http://schemas.microsoft.com/windowsazure") do
|
102
|
+
xml.Data certificate_data
|
103
|
+
xml.CertificateFormat certificate_format
|
104
|
+
xml.Password certificate_password
|
105
|
+
end
|
106
106
|
end
|
107
107
|
# Windows Azure API call
|
108
108
|
@connection.query_azure("hostedservices/#{dns_name}/certificates", "post", builder.to_xml)
|
@@ -125,8 +125,8 @@ module Azure
|
|
125
125
|
end
|
126
126
|
|
127
127
|
######## SSL certificate generation for knife-azure ssl bootstrap ######
|
128
|
-
def create_ssl_certificate
|
129
|
-
file_path = cert_params[:output_file].sub(/\.(\w+)$/,
|
128
|
+
def create_ssl_certificate(cert_params)
|
129
|
+
file_path = cert_params[:output_file].sub(/\.(\w+)$/, "")
|
130
130
|
path = prompt_for_file_path
|
131
131
|
file_path = File.join(path, file_path) unless path.empty?
|
132
132
|
cert_params[:domain] = prompt_for_domain
|
@@ -134,21 +134,21 @@ module Azure
|
|
134
134
|
rsa_key = generate_keypair cert_params[:key_length]
|
135
135
|
cert = generate_certificate(rsa_key, cert_params)
|
136
136
|
write_certificate_to_file cert, file_path, rsa_key, cert_params
|
137
|
-
puts "*"*70
|
137
|
+
puts "*" * 70
|
138
138
|
puts "Generated Certificates:"
|
139
139
|
puts "- #{file_path}.pfx - PKCS12 format keypair. Contains both the public and private keys, usually used on the server."
|
140
140
|
puts "- #{file_path}.b64 - Base64 encoded PKCS12 keypair. Contains both the public and private keys, for upload to the Azure REST API."
|
141
141
|
puts "- #{file_path}.pem - Base64 encoded public certificate only. Required by the client to connect to the server."
|
142
142
|
puts "Certificate Thumbprint: #{@thumbprint.to_s.upcase}"
|
143
|
-
puts "*"*70
|
143
|
+
puts "*" * 70
|
144
144
|
|
145
145
|
Chef::Config[:knife][:ca_trust_file] = file_path + ".pem" if Chef::Config[:knife][:ca_trust_file].nil?
|
146
146
|
cert_data = File.read (file_path + ".b64")
|
147
|
-
add_certificate cert_data, @winrm_cert_passphrase,
|
147
|
+
add_certificate cert_data, @winrm_cert_passphrase, "pfx", cert_params[:azure_dns_name]
|
148
148
|
@thumbprint
|
149
149
|
end
|
150
150
|
|
151
|
-
def generate_keypair
|
151
|
+
def generate_keypair(key_length)
|
152
152
|
OpenSSL::PKey::RSA.new(key_length.to_i)
|
153
153
|
end
|
154
154
|
|
@@ -166,7 +166,7 @@ module Azure
|
|
166
166
|
end
|
167
167
|
|
168
168
|
def prompt_for_file_path
|
169
|
-
file_path =
|
169
|
+
file_path = ""
|
170
170
|
counter = 0
|
171
171
|
begin
|
172
172
|
print "Invalid location! \n" unless file_path.empty?
|
@@ -183,7 +183,7 @@ module Azure
|
|
183
183
|
def prompt_for_domain
|
184
184
|
counter = 0
|
185
185
|
begin
|
186
|
-
print
|
186
|
+
print "Enter the domain (mandatory):"
|
187
187
|
domain = STDIN.gets
|
188
188
|
domain = domain.strip
|
189
189
|
counter += 1
|
@@ -211,15 +211,15 @@ module Azure
|
|
211
211
|
ef = OpenSSL::X509::ExtensionFactory.new
|
212
212
|
ef.subject_certificate = cert
|
213
213
|
ef.issuer_certificate = cert
|
214
|
-
cert.add_extension(ef.create_extension("subjectKeyIdentifier","hash",false))
|
215
|
-
cert.add_extension(ef.create_extension("authorityKeyIdentifier","keyid:always",false))
|
214
|
+
cert.add_extension(ef.create_extension("subjectKeyIdentifier", "hash", false))
|
215
|
+
cert.add_extension(ef.create_extension("authorityKeyIdentifier", "keyid:always", false))
|
216
216
|
cert.add_extension(ef.create_extension("extendedKeyUsage", "1.3.6.1.5.5.7.3.1", false))
|
217
217
|
cert.sign(rsa_key, OpenSSL::Digest::SHA1.new)
|
218
218
|
@thumbprint = OpenSSL::Digest::SHA1.new(cert.to_der)
|
219
219
|
cert
|
220
220
|
end
|
221
221
|
|
222
|
-
def write_certificate_to_file
|
222
|
+
def write_certificate_to_file(cert, file_path, rsa_key, cert_params)
|
223
223
|
File.open(file_path + ".pem", "wb") { |f| f.print cert.to_pem }
|
224
224
|
@winrm_cert_passphrase = prompt_for_passphrase unless @winrm_cert_passphrase
|
225
225
|
pfx = OpenSSL::PKCS12.create("#{cert_params[:winrm_cert_passphrase]}", "winrmcert", rsa_key, cert)
|
@@ -229,6 +229,5 @@ module Azure
|
|
229
229
|
|
230
230
|
########## SSL certificate generation ends ###########
|
231
231
|
|
232
|
-
|
233
232
|
end
|
234
233
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Barry Davis (barryd@jetstreamsoftware.com)
|
3
|
-
# Copyright:: Copyright
|
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");
|
@@ -16,17 +16,17 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
19
|
+
require "azure/service_management/image"
|
20
|
+
require "azure/service_management/role"
|
21
|
+
require "azure/service_management/deploy"
|
22
|
+
require "azure/service_management/host"
|
23
|
+
require "azure/service_management/loadbalancer"
|
24
|
+
require "azure/service_management/vnet"
|
25
|
+
require "azure/service_management/utility"
|
26
|
+
require "azure/service_management/ag"
|
27
|
+
require "azure/service_management/storageaccount"
|
28
|
+
require "azure/service_management/certificate"
|
29
|
+
require "azure/service_management/disk"
|
30
30
|
|
31
31
|
module Azure
|
32
32
|
class ServiceManagement
|
@@ -37,7 +37,7 @@ module Azure
|
|
37
37
|
def initialize(rest)
|
38
38
|
@images = Images.new(self)
|
39
39
|
@roles = Roles.new(self)
|
40
|
-
@deploys
|
40
|
+
@deploys = Deploys.new(self)
|
41
41
|
@hosts = Hosts.new(self)
|
42
42
|
@rest = rest
|
43
43
|
@lbs = Loadbalancer.new(self)
|
@@ -49,19 +49,19 @@ module Azure
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def query_azure(service_name,
|
52
|
-
verb =
|
53
|
-
body =
|
54
|
-
params =
|
52
|
+
verb = "get",
|
53
|
+
body = "",
|
54
|
+
params = "",
|
55
55
|
wait = true,
|
56
56
|
services = true,
|
57
57
|
content_type = nil)
|
58
|
-
Chef::Log.info
|
59
|
-
Chef::Log.debug body unless body ==
|
58
|
+
Chef::Log.info "calling " + verb + " " + service_name + (wait ? " synchronously" : " asynchronously")
|
59
|
+
Chef::Log.debug body unless body == ""
|
60
60
|
response = @rest.query_azure(service_name, verb, body, params, services, content_type)
|
61
61
|
if response.code.to_i == 200
|
62
62
|
ret_val = Nokogiri::XML response.body
|
63
63
|
elsif !wait && response.code.to_i == 202
|
64
|
-
Chef::Log.debug
|
64
|
+
Chef::Log.debug "Request accepted in asynchronous mode"
|
65
65
|
ret_val = Nokogiri::XML response.body
|
66
66
|
elsif response.code.to_i >= 201 && response.code.to_i <= 299
|
67
67
|
ret_val = wait_for_completion()
|
@@ -70,29 +70,29 @@ module Azure
|
|
70
70
|
ret_val = Nokogiri::XML response.body
|
71
71
|
Chef::Log.debug ret_val.to_xml
|
72
72
|
error_code, error_message = error_from_response_xml(ret_val)
|
73
|
-
Chef::Log.debug error_code +
|
73
|
+
Chef::Log.debug error_code + " : " + error_message if error_code.length > 0
|
74
74
|
else
|
75
|
-
Chef::Log.warn
|
75
|
+
Chef::Log.warn "http error: " + response.code
|
76
76
|
end
|
77
77
|
end
|
78
78
|
ret_val
|
79
79
|
end
|
80
80
|
|
81
|
-
def wait_for_completion
|
82
|
-
status =
|
83
|
-
Chef::Log.info
|
84
|
-
while status ==
|
81
|
+
def wait_for_completion
|
82
|
+
status = "InProgress"
|
83
|
+
Chef::Log.info "Waiting while status returns InProgress"
|
84
|
+
while status == "InProgress"
|
85
85
|
response = @rest.query_for_completion()
|
86
86
|
ret_val = Nokogiri::XML response.body
|
87
|
-
status = xml_content(ret_val,
|
88
|
-
if status ==
|
89
|
-
print
|
87
|
+
status = xml_content(ret_val, "Status")
|
88
|
+
if status == "InProgress"
|
89
|
+
print "."
|
90
90
|
sleep(0.5)
|
91
|
-
elsif status ==
|
92
|
-
Chef::Log.debug
|
91
|
+
elsif status == "Succeeded"
|
92
|
+
Chef::Log.debug "not InProgress : " + ret_val.to_xml
|
93
93
|
else
|
94
94
|
error_code, error_message = error_from_response_xml(ret_val)
|
95
|
-
Chef::Log.debug status + error_code +
|
95
|
+
Chef::Log.debug status + error_code + " : " + error_message if error_code.length > 0
|
96
96
|
end
|
97
97
|
end
|
98
98
|
ret_val
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Barry Davis (barryd@jetstreamsoftware.com)
|
3
|
-
# Copyright:: Copyright
|
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,8 +20,9 @@ module Azure
|
|
20
20
|
class Deploys
|
21
21
|
include AzureUtility
|
22
22
|
def initialize(connection)
|
23
|
-
@connection=connection
|
23
|
+
@connection = connection
|
24
24
|
end
|
25
|
+
|
25
26
|
# force_load should be true when there is something in local cache and we want to reload
|
26
27
|
# first call is always load.
|
27
28
|
def load(force_load = false)
|
@@ -44,7 +45,7 @@ module Azure
|
|
44
45
|
end
|
45
46
|
|
46
47
|
def all
|
47
|
-
|
48
|
+
load
|
48
49
|
end
|
49
50
|
|
50
51
|
# TODO - Current knife-azure plug-in seems to have assumption that single hostedservice
|
@@ -61,14 +62,14 @@ module Azure
|
|
61
62
|
def create(params)
|
62
63
|
if params[:azure_connect_to_existing_dns]
|
63
64
|
unless @connection.hosts.exists?(params[:azure_dns_name])
|
64
|
-
Chef::Log.fatal
|
65
|
+
Chef::Log.fatal "The specified Azure DNS Name does not exist."
|
65
66
|
exit 1
|
66
67
|
end
|
67
68
|
else
|
68
69
|
ret_val = @connection.hosts.create(params)
|
69
70
|
error_code, error_message = error_from_response_xml(ret_val)
|
70
71
|
if error_code.length > 0
|
71
|
-
Chef::Log.fatal
|
72
|
+
Chef::Log.fatal "Unable to create DNS:" + error_code + " : " + error_message
|
72
73
|
exit 1
|
73
74
|
end
|
74
75
|
end
|
@@ -80,19 +81,19 @@ module Azure
|
|
80
81
|
end
|
81
82
|
if params[:cert_path]
|
82
83
|
cert_data = File.read (params[:cert_path])
|
83
|
-
@connection.certificates.add cert_data, params[:cert_password],
|
84
|
-
elsif
|
84
|
+
@connection.certificates.add cert_data, params[:cert_password], "pfx", params[:azure_dns_name]
|
85
|
+
elsif params[:winrm_transport] == "ssl"
|
85
86
|
#TODO: generate certificates for ssl listener
|
86
87
|
end
|
87
88
|
|
88
|
-
params[
|
89
|
+
params["deploy_name"] = get_deploy_name_for_hostedservice(params[:azure_dns_name])
|
89
90
|
|
90
|
-
if params[
|
91
|
+
if !params["deploy_name"].nil?
|
91
92
|
role = Role.new(@connection)
|
92
93
|
roleXML = role.setup(params)
|
93
94
|
ret_val = role.create(params, roleXML)
|
94
95
|
else
|
95
|
-
params[
|
96
|
+
params["deploy_name"] = params[:azure_dns_name]
|
96
97
|
deploy = Deploy.new(@connection)
|
97
98
|
deployXML = deploy.setup(params)
|
98
99
|
ret_val = deploy.create(params, deployXML)
|
@@ -100,7 +101,7 @@ module Azure
|
|
100
101
|
error_code, error_message = error_from_response_xml(ret_val)
|
101
102
|
if error_code.length > 0
|
102
103
|
Chef::Log.debug(ret_val.to_s)
|
103
|
-
raise Chef::Log.fatal
|
104
|
+
raise Chef::Log.fatal "Unable to create role:" + error_code + " : " + error_message
|
104
105
|
end
|
105
106
|
@connection.roles.find_in_hosted_service(params[:azure_vm_name], params[:azure_dns_name])
|
106
107
|
end
|
@@ -109,9 +110,9 @@ module Azure
|
|
109
110
|
end
|
110
111
|
|
111
112
|
def queryDeploy(hostedservicename)
|
112
|
-
|
113
|
-
|
114
|
-
|
113
|
+
deploy = Deploy.new(@connection)
|
114
|
+
deploy.retrieve(hostedservicename)
|
115
|
+
deploy
|
115
116
|
end
|
116
117
|
end
|
117
118
|
|
@@ -122,32 +123,33 @@ module Azure
|
|
122
123
|
def initialize(connection)
|
123
124
|
@connection = connection
|
124
125
|
end
|
126
|
+
|
125
127
|
def retrieve(hostedservicename)
|
126
128
|
@hostedservicename = hostedservicename
|
127
129
|
deployXML = @connection.query_azure("hostedservices/#{hostedservicename}/deploymentslots/Production")
|
128
|
-
if deployXML.at_css(
|
129
|
-
@name = xml_content(deployXML,
|
130
|
-
@status = xml_content(deployXML,
|
131
|
-
@url = xml_content(deployXML,
|
130
|
+
if deployXML.at_css("Deployment Name") != nil
|
131
|
+
@name = xml_content(deployXML, "Deployment Name")
|
132
|
+
@status = xml_content(deployXML, "Deployment Status")
|
133
|
+
@url = xml_content(deployXML, "Deployment Url")
|
132
134
|
@roles = Hash.new
|
133
|
-
rolesXML = deployXML.css(
|
134
|
-
rolesListXML = deployXML.css(
|
135
|
-
rolesXML.zip(rolesListXML).each do |roleXML,roleListXML|
|
135
|
+
rolesXML = deployXML.css("Deployment RoleInstanceList RoleInstance")
|
136
|
+
rolesListXML = deployXML.css("Deployment RoleList Role")
|
137
|
+
rolesXML.zip(rolesListXML).each do |roleXML, roleListXML|
|
136
138
|
role = Role.new(@connection)
|
137
139
|
role.parse(roleXML, hostedservicename, @name)
|
138
140
|
if role.publicipaddress.to_s.empty?
|
139
|
-
role.publicipaddress = xml_content(deployXML,
|
141
|
+
role.publicipaddress = xml_content(deployXML, "VirtualIPs VirtualIP Address")
|
140
142
|
end
|
141
143
|
role.parse_role_list_xml(roleListXML)
|
142
144
|
@roles[role.name] = role
|
143
145
|
end
|
144
146
|
@input_endpoints = Array.new
|
145
|
-
endpointsXML = deployXML.css(
|
147
|
+
endpointsXML = deployXML.css("InputEndpoint")
|
146
148
|
endpointsXML.each do |endpointXML|
|
147
149
|
@input_endpoints << parse_endpoint(endpointXML)
|
148
150
|
end
|
149
151
|
@loadbalancers = Hash.new
|
150
|
-
lbsXML = deployXML.css(
|
152
|
+
lbsXML = deployXML.css("Deployment LoadBalancers LoadBalancer")
|
151
153
|
lbsXML.each do |lbXML|
|
152
154
|
loadbalancer = Loadbalancer.new(@connection)
|
153
155
|
loadbalancer.parse(lbXML, hostedservicename)
|
@@ -162,19 +164,19 @@ module Azure
|
|
162
164
|
#roleXML = Nokogiri::XML role.setup(params)
|
163
165
|
builder = Nokogiri::XML::Builder.new do |xml|
|
164
166
|
xml.Deployment(
|
165
|
-
|
166
|
-
|
167
|
-
)
|
168
|
-
xml.Name params[
|
169
|
-
xml.DeploymentSlot
|
170
|
-
xml.Label Base64.encode64(params[
|
171
|
-
xml.RoleList { xml.Role(
|
167
|
+
"xmlns" => "http://schemas.microsoft.com/windowsazure",
|
168
|
+
"xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance"
|
169
|
+
) do
|
170
|
+
xml.Name params["deploy_name"]
|
171
|
+
xml.DeploymentSlot "Production"
|
172
|
+
xml.Label Base64.encode64(params["deploy_name"]).strip
|
173
|
+
xml.RoleList { xml.Role("i:type" => "PersistentVMRole") }
|
172
174
|
if params[:azure_network_name]
|
173
175
|
xml.VirtualNetworkName params[:azure_network_name]
|
174
176
|
end
|
175
|
-
|
177
|
+
end
|
176
178
|
end
|
177
|
-
builder.doc.at_css(
|
179
|
+
builder.doc.at_css("Role") << roleXML.at_css("PersistentVMRole").children.to_s
|
178
180
|
builder.doc
|
179
181
|
end
|
180
182
|
|
@@ -191,14 +193,14 @@ module Azure
|
|
191
193
|
hash[key] = xml_content(inputendpoint_xml, key, nil)
|
192
194
|
end
|
193
195
|
# Protocol could be in there twice... If we have two, pick the second one as the first is for the probe.
|
194
|
-
if inputendpoint_xml.css(
|
195
|
-
hash[
|
196
|
+
if inputendpoint_xml.css("Protocol").count > 1
|
197
|
+
hash["Protocol"] = inputendpoint_xml.css("Protocol")[1].content
|
196
198
|
end
|
197
|
-
probe = inputendpoint_xml.css(
|
199
|
+
probe = inputendpoint_xml.css("LoadBalancerProbe")
|
198
200
|
if probe
|
199
|
-
hash[
|
201
|
+
hash["LoadBalancerProbe"] = Hash.new
|
200
202
|
%w{Path Port Protocol IntervalInSeconds TimeoutInSeconds}.each do |key|
|
201
|
-
hash[
|
203
|
+
hash["LoadBalancerProbe"][key] = xml_content(probe, key, nil)
|
202
204
|
end
|
203
205
|
end
|
204
206
|
hash
|