knife-azure 3.0.6 → 4.0.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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/azure/custom_errors.rb +1 -1
  3. data/lib/azure/resource_management/ARM_deployment_template.rb +5 -5
  4. data/lib/azure/resource_management/ARM_interface.rb +4 -6
  5. data/lib/azure/resource_management/windows_credentials.rb +2 -2
  6. data/lib/chef/knife/azurerm_server_create.rb +1 -1
  7. data/lib/chef/knife/bootstrap/bootstrapper.rb +5 -10
  8. data/lib/chef/knife/helpers/azurerm_base.rb +4 -4
  9. data/lib/knife-azure/version.rb +1 -1
  10. metadata +30 -43
  11. data/lib/azure/service_management/ASM_interface.rb +0 -310
  12. data/lib/azure/service_management/ag.rb +0 -99
  13. data/lib/azure/service_management/certificate.rb +0 -235
  14. data/lib/azure/service_management/connection.rb +0 -102
  15. data/lib/azure/service_management/deploy.rb +0 -221
  16. data/lib/azure/service_management/disk.rb +0 -68
  17. data/lib/azure/service_management/host.rb +0 -184
  18. data/lib/azure/service_management/image.rb +0 -94
  19. data/lib/azure/service_management/loadbalancer.rb +0 -78
  20. data/lib/azure/service_management/rest.rb +0 -126
  21. data/lib/azure/service_management/role.rb +0 -717
  22. data/lib/azure/service_management/storageaccount.rb +0 -127
  23. data/lib/azure/service_management/utility.rb +0 -40
  24. data/lib/azure/service_management/vnet.rb +0 -134
  25. data/lib/chef/knife/azure_ag_create.rb +0 -73
  26. data/lib/chef/knife/azure_ag_list.rb +0 -35
  27. data/lib/chef/knife/azure_image_list.rb +0 -56
  28. data/lib/chef/knife/azure_internal-lb_create.rb +0 -74
  29. data/lib/chef/knife/azure_internal-lb_list.rb +0 -35
  30. data/lib/chef/knife/azure_server_create.rb +0 -531
  31. data/lib/chef/knife/azure_server_delete.rb +0 -136
  32. data/lib/chef/knife/azure_server_list.rb +0 -38
  33. data/lib/chef/knife/azure_server_show.rb +0 -41
  34. data/lib/chef/knife/azure_vnet_create.rb +0 -74
  35. data/lib/chef/knife/azure_vnet_list.rb +0 -35
  36. data/lib/chef/knife/bootstrap_azure.rb +0 -191
  37. data/lib/chef/knife/helpers/azure_base.rb +0 -392
@@ -1,68 +0,0 @@
1
- #
2
- # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- module Azure
20
- class Disks
21
- def initialize(connection)
22
- @connection = connection
23
- end
24
-
25
- def all
26
- disks = []
27
- response = @connection.query_azure("disks")
28
- founddisks = response.css("Disk")
29
- founddisks.each do |disk|
30
- item = Disk.new(disk)
31
- disks << item
32
- end
33
- disks
34
- end
35
-
36
- def find(name)
37
- founddisk = nil
38
- all.each do |disk|
39
- next unless disk.name == name
40
-
41
- founddisk = disk
42
- end
43
- founddisk
44
- end
45
-
46
- def exists(name)
47
- !find(name).nil?
48
- end
49
-
50
- def clear_unattached
51
- all.each do |disk|
52
- next unless disk.attached == false
53
-
54
- @connection.query_azure("disks/" + disk.name, "delete")
55
- end
56
- end
57
- end
58
- end
59
-
60
- module Azure
61
- class Disk
62
- attr_accessor :name, :attached
63
- def initialize(disk)
64
- @name = disk.at_css("Name").content
65
- @attached = !disk.at_css("AttachedTo").nil?
66
- end
67
- end
68
- end
@@ -1,184 +0,0 @@
1
- #
2
- # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- module Azure
20
- class Hosts
21
- include AzureUtility
22
- def initialize(connection)
23
- @connection = connection
24
- end
25
-
26
- # force_load should be true when there is something in local cache and we want to reload
27
- # first call is always load.
28
- def load(force_load = false)
29
- unless @hosted_services || force_load
30
- @hosted_services = begin
31
- hosted_services = {}
32
- responseXML = @connection.query_azure("hostedservices")
33
- servicesXML = responseXML.css("HostedServices HostedService")
34
- servicesXML.each do |serviceXML|
35
- host = Host.new(@connection).parse(serviceXML)
36
- hosted_services[host.name] = host
37
- end
38
- hosted_services
39
- end
40
- end
41
- @hosted_services
42
- end
43
-
44
- def all
45
- load.values
46
- end
47
-
48
- # first look up local cache if we have already loaded list.
49
- def exists?(name)
50
- return @hosted_services.key?(name) if @hosted_services
51
-
52
- exists_on_cloud?(name)
53
- end
54
-
55
- # Look up on cloud and not local cache
56
- def exists_on_cloud?(name)
57
- ret_val = @connection.query_azure("hostedservices/#{name}")
58
- error_code, error_message = error_from_response_xml(ret_val) if ret_val
59
- if ret_val.nil? || error_code.length > 0
60
- Chef::Log.debug("Unable to find hosted(cloud) service:" + error_code + " : " + error_message) if ret_val
61
- false
62
- else
63
- true
64
- end
65
- end
66
-
67
- # first look up local cache if we have already loaded list.
68
- def find(name)
69
- return @hosted_services[name] if @hosted_services && @hosted_services.key?(name)
70
-
71
- fetch_from_cloud(name)
72
- end
73
-
74
- # Look up hosted service on cloud and not local cache
75
- def fetch_from_cloud(name)
76
- ret_val = @connection.query_azure("hostedservices/#{name}")
77
- error_code, error_message = error_from_response_xml(ret_val) if ret_val
78
- if ret_val.nil? || error_code.length > 0
79
- Chef::Log.warn("Unable to find hosted(cloud) service:" + error_code + " : " + error_message) if ret_val
80
- nil
81
- else
82
- Host.new(@connection).parse(ret_val)
83
- end
84
- end
85
-
86
- def create(params)
87
- host = Host.new(@connection)
88
- host.create(params)
89
- end
90
-
91
- def delete(name)
92
- if exists?(name)
93
- servicecall = "hostedservices/" + name
94
- @connection.query_azure(servicecall, "delete")
95
- end
96
- end
97
- end
98
- end
99
-
100
- module Azure
101
- class Host
102
- include AzureUtility
103
- attr_accessor :connection, :name, :url, :label
104
- attr_accessor :dateCreated, :description, :location
105
- attr_accessor :dateModified, :status
106
-
107
- def initialize(connection)
108
- @connection = connection
109
- @deploys_loaded = false
110
- @deploys = {}
111
- end
112
-
113
- def parse(serviceXML)
114
- @name = xml_content(serviceXML, "ServiceName")
115
- @url = xml_content(serviceXML, "Url")
116
- @label = xml_content(serviceXML, "HostedServiceProperties Label")
117
- @dateCreated = xml_content(serviceXML, "HostedServiceProperties DateCreated")
118
- @description = xml_content(serviceXML, "HostedServiceProperties Description")
119
- @location = xml_content(serviceXML, "HostedServiceProperties Location")
120
- @dateModified = xml_content(serviceXML, "HostedServiceProperties DateLastModified")
121
- @status = xml_content(serviceXML, "HostedServiceProperties Status")
122
- self
123
- end
124
-
125
- def create(params)
126
- builder = Nokogiri::XML::Builder.new do |xml|
127
- xml.CreateHostedService("xmlns" => "http://schemas.microsoft.com/windowsazure") do
128
- xml.ServiceName params[:azure_dns_name]
129
- xml.Label Base64.encode64(params[:azure_dns_name])
130
- xml.Description "Explicitly created hosted service"
131
- unless params[:azure_service_location].nil?
132
- xml.Location params[:azure_service_location]
133
- end
134
- unless params[:azure_affinity_group].nil?
135
- xml.AffinityGroup params[:azure_affinity_group]
136
- end
137
- end
138
- end
139
- @connection.query_azure("hostedservices", "post", builder.to_xml)
140
- end
141
-
142
- def details
143
- response = @connection.query_azure("hostedservices/" + @name + "?embed-detail=true")
144
- end
145
-
146
- # Deployments within this hostedservice
147
- def add_deploy(deploy)
148
- @deploys[deploy.name] = deploy
149
- end
150
-
151
- def delete_role(role)
152
- deploys.each { |d| d.delete_role_if_present(role) }
153
- end
154
-
155
- def deploys
156
- # check if we have deploys loaded, else load.
157
- if (@deploys.length == 0) && !@deploys_loaded
158
- deploy = Deploy.new(@connection)
159
- deploy.retrieve(@name)
160
- @deploys[deploy.name] = deploy
161
- @deploys_loaded = true
162
- end
163
- @deploys.values
164
- end
165
-
166
- def roles
167
- roles = []
168
- deploys.each do |deploy|
169
- roles.concat(deploy.roles) if deploy.roles
170
- end
171
- roles
172
- end
173
-
174
- def find_role(role_name, deploy_name = nil)
175
- return @deploys[deploy_name].find_role(role_name) if deploy_name && deploys
176
-
177
- # else lookup all deploys within hostedservice
178
- deploys.each do |deploy|
179
- role = deploy.find_role(role_name)
180
- return role if role
181
- end
182
- end
183
- end
184
- end
@@ -1,94 +0,0 @@
1
- #
2
- # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- module Azure
20
- class Images
21
- def initialize(connection)
22
- @connection = connection
23
- end
24
-
25
- def load
26
- @images ||= begin
27
- osimages = get_images("OSImage") # get OSImages
28
- vmimages = get_images("VMImage") # get VMImages
29
-
30
- all_images = osimages.merge(vmimages)
31
- end
32
- end
33
-
34
- def all
35
- load.values
36
- end
37
-
38
- # img_type = OSImages or VMImage
39
- def get_images(img_type)
40
- images = {}
41
-
42
- if img_type == "OSImage"
43
- response = @connection.query_azure("images")
44
- elsif img_type == "VMImage"
45
- response = @connection.query_azure("vmimages")
46
- end
47
-
48
- unless response.to_s.empty?
49
- osimages = response.css(img_type)
50
-
51
- osimages.each do |image|
52
- item = Image.new(image)
53
- images[item.name] = item
54
- end
55
- end
56
-
57
- images
58
- end
59
-
60
- def is_os_image(image_name)
61
- os_images = get_images("OSImage").values
62
- os_images.detect { |img| img.name == image_name } ? true : false
63
- end
64
-
65
- def is_vm_image(image_name)
66
- vm_images = get_images("VMImage").values
67
- vm_images.detect { |img| img.name == image_name } ? true : false
68
- end
69
-
70
- def exists?(name)
71
- all.detect { |img| img.name == name } ? true : false
72
- end
73
-
74
- def find(name)
75
- load[name]
76
- end
77
- end
78
- end
79
-
80
- module Azure
81
- class Image
82
- attr_accessor :category, :label
83
- attr_accessor :name, :os, :eula, :description, :location
84
- def initialize(image)
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")
92
- end
93
- end
94
- end
@@ -1,78 +0,0 @@
1
- #
2
- # Author:: Aiman Alsari (aiman.alsari@gmail.com)
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- module Azure
20
- class Loadbalancer
21
- include AzureUtility
22
- attr_accessor :name, :service, :subnet, :vip
23
-
24
- def initialize(connection)
25
- @connection = connection
26
- end
27
-
28
- def load
29
- @lbs ||= begin
30
- @lbs = {}
31
- @connection.deploys.all.each do |deploy|
32
- @lbs.merge!(deploy.loadbalancers)
33
- end
34
- @lbs
35
- end
36
- end
37
-
38
- def all
39
- load.values
40
- end
41
-
42
- def exists?(name)
43
- load.key?(name)
44
- end
45
-
46
- def find(name)
47
- load[name]
48
- end
49
-
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")
55
- @service = hostedservicename
56
- self
57
- end
58
-
59
- def create(params)
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"
62
- end
63
- builder = Nokogiri::XML::Builder.new(encoding: "utf-8") do |xml|
64
- xml.LoadBalancer(xmlns: "http://schemas.microsoft.com/windowsazure") do
65
- xml.Name params[:azure_load_balancer]
66
- xml.FrontendIpConfiguration do
67
- xml.Type "Private"
68
- xml.SubnetName params[:azure_subnet_name] if params[:azure_subnet_name]
69
- xml.StaticVirtualNetworkIPAddress params[:azure_lb_static_vip] if params[:azure_lb_static_vip]
70
- end
71
- end
72
- end
73
- deploy_name = @connection.deploys.get_deploy_name_for_hostedservice(params[:azure_dns_name])
74
- servicecall = "hostedservices/#{params[:azure_dns_name]}/deployments/#{deploy_name}/loadbalancers"
75
- @connection.query_azure(servicecall, "post", builder.doc.to_xml)
76
- end
77
- end
78
- end
@@ -1,126 +0,0 @@
1
- #
2
- # Author:: Barry Davis (barryd@jetstreamsoftware.com)
3
- # Copyright:: Copyright (c) Chef Software Inc.
4
- # License:: Apache License, Version 2.0
5
- #
6
- # Licensed under the Apache License, Version 2.0 (the "License");
7
- # you may not use this file except in compliance with the License.
8
- # You may obtain a copy of the License at
9
- #
10
- # http://www.apache.org/licenses/LICENSE-2.0
11
- #
12
- # Unless required by applicable law or agreed to in writing, software
13
- # distributed under the License is distributed on an "AS IS" BASIS,
14
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- # See the License for the specific language governing permissions and
16
- # limitations under the License.
17
- #
18
-
19
- require "net/http" unless defined?(Net::HTTP)
20
- require "openssl" unless defined?(OpenSSL)
21
- require "uri" unless defined?(URI)
22
- require "nokogiri" unless defined?(Nokogiri)
23
-
24
- module AzureAPI
25
-
26
- class Rest
27
- def initialize(params)
28
- @subscription_id = params[:azure_subscription_id]
29
- @pem_file = params[:azure_mgmt_cert]
30
- @host_name = params[:azure_api_host_name]
31
- @verify_ssl = params[:verify_ssl_cert]
32
- end
33
-
34
- def query_azure(service_name,
35
- verb = "get",
36
- body = "",
37
- params = "",
38
- services = true,
39
- content_type = nil)
40
- svc_str = services ? "/services" : ""
41
- uri = URI.parse("#{@host_name}/#{@subscription_id}#{svc_str}/#{service_name}")
42
- scheme = !uri.scheme ? "https://" : ""
43
- request_url = "#{scheme}#{@host_name}/#{@subscription_id}#{svc_str}/#{service_name}"
44
- print "."
45
- response = http_query(request_url, verb, body, params, content_type)
46
- if response.code.to_i == 307
47
- Chef::Log.debug "Redirect to #{response["Location"]}"
48
- response = http_query(response["Location"], verb, body, params, content_type)
49
- end
50
- @last_request_id = response["x-ms-request-id"]
51
- response
52
- end
53
-
54
- def http_query(request_url, verb, body, params, content_type = nil)
55
- uri = URI.parse(request_url)
56
- uri.query = params
57
- http = http_setup(uri)
58
- request = request_setup(uri, verb, body, content_type)
59
- response = http.request(request)
60
- @last_request_id = response["x-ms-request-id"]
61
- response
62
- end
63
-
64
- def query_for_completion
65
- uri = URI.parse("#{@host_name}/#{@subscription_id}/operations/#{@last_request_id}")
66
- scheme = !uri.scheme ? "https://" : ""
67
- request_url = "#{scheme}#{@host_name}/#{@subscription_id}/operations/#{@last_request_id}"
68
- response = http_query(request_url, "get", "", "")
69
- if response.code.to_i == 307
70
- Chef::Log.debug "Redirect to #{response["Location"]}"
71
- response = http_query(response["Location"], "get", "", "")
72
- end
73
- response
74
- end
75
-
76
- def http_setup(uri)
77
- http = Net::HTTP.new(uri.host, uri.port)
78
- store = OpenSSL::X509::Store.new
79
- store.set_default_paths
80
- http.cert_store = store
81
- if @verify_ssl
82
- http.verify_mode = OpenSSL::SSL::VERIFY_PEER
83
- else
84
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
85
- end
86
- http.use_ssl = true
87
- begin
88
- http.cert = OpenSSL::X509::Certificate.new(@pem_file)
89
- rescue OpenSSL::X509::CertificateError => err
90
- raise "Invalid Azure Certificate pem file. Error: #{err}"
91
- end
92
- http.key = OpenSSL::PKey::RSA.new(@pem_file)
93
- http
94
- end
95
-
96
- def request_setup(uri, verb, body, content_type)
97
- if verb == "get"
98
- request = Net::HTTP::Get.new(uri.request_uri)
99
- elsif verb == "post"
100
- request = Net::HTTP::Post.new(uri.request_uri)
101
- elsif verb == "delete"
102
- request = Net::HTTP::Delete.new(uri.request_uri)
103
- elsif verb == "put"
104
- request = Net::HTTP::Put.new(uri.request_uri)
105
- end
106
- text = verb == "put" && content_type.nil?
107
- request["x-ms-version"] = "2014-05-01"
108
- request["content-type"] = text ? "text/plain" : "application/xml"
109
- request["accept"] = "application/xml"
110
- request["accept-charset"] = "utf-8"
111
- request.body = body
112
- request
113
- end
114
-
115
- def showResponse(response)
116
- puts "=== response body ==="
117
- puts response.body
118
- puts "=== response.code ==="
119
- puts response.code
120
- puts "=== response.inspect ==="
121
- puts response.inspect
122
- puts "=== all of the headers ==="
123
- puts response.each_header { |h, j| puts h.inspect + " : " + j.inspect }
124
- end
125
- end
126
- end