azure-fix 0.7.0.pre3

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 (311) hide show
  1. checksums.yaml +7 -0
  2. data/.env_sample +13 -0
  3. data/.gitignore +30 -0
  4. data/.travis.yml +13 -0
  5. data/ChangeLog.txt +56 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +702 -0
  9. data/Rakefile +121 -0
  10. data/azure.gemspec +51 -0
  11. data/bin/pfxer +35 -0
  12. data/lib/azure.rb +147 -0
  13. data/lib/azure/base_management/affinity_group.rb +32 -0
  14. data/lib/azure/base_management/base_management_service.rb +220 -0
  15. data/lib/azure/base_management/location.rb +27 -0
  16. data/lib/azure/base_management/management_http_request.rb +172 -0
  17. data/lib/azure/base_management/serialization.rb +135 -0
  18. data/lib/azure/base_management/sql_management_http_request.rb +35 -0
  19. data/lib/azure/blob/auth/shared_access_signature.rb +147 -0
  20. data/lib/azure/blob/blob.rb +32 -0
  21. data/lib/azure/blob/blob_service.rb +1452 -0
  22. data/lib/azure/blob/block.rb +31 -0
  23. data/lib/azure/blob/container.rb +32 -0
  24. data/lib/azure/blob/serialization.rb +285 -0
  25. data/lib/azure/client.rb +31 -0
  26. data/lib/azure/client_services.rb +98 -0
  27. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  28. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +135 -0
  29. data/lib/azure/cloud_service_management/serialization.rb +118 -0
  30. data/lib/azure/configurable.rb +290 -0
  31. data/lib/azure/core/auth/authorizer.rb +36 -0
  32. data/lib/azure/core/auth/shared_key.rb +118 -0
  33. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  34. data/lib/azure/core/auth/signer.rb +51 -0
  35. data/lib/azure/core/error.rb +21 -0
  36. data/lib/azure/core/filtered_service.rb +45 -0
  37. data/lib/azure/core/http/debug_filter.rb +36 -0
  38. data/lib/azure/core/http/http_error.rb +86 -0
  39. data/lib/azure/core/http/http_filter.rb +53 -0
  40. data/lib/azure/core/http/http_request.rb +173 -0
  41. data/lib/azure/core/http/http_response.rb +96 -0
  42. data/lib/azure/core/http/retry_policy.rb +74 -0
  43. data/lib/azure/core/http/signer_filter.rb +33 -0
  44. data/lib/azure/core/service.rb +46 -0
  45. data/lib/azure/core/signed_service.rb +45 -0
  46. data/lib/azure/core/utility.rb +244 -0
  47. data/lib/azure/default.rb +126 -0
  48. data/lib/azure/http_client.rb +85 -0
  49. data/lib/azure/queue/message.rb +30 -0
  50. data/lib/azure/queue/queue.rb +28 -0
  51. data/lib/azure/queue/queue_service.rb +570 -0
  52. data/lib/azure/queue/serialization.rb +105 -0
  53. data/lib/azure/service/access_policy.rb +26 -0
  54. data/lib/azure/service/cors.rb +11 -0
  55. data/lib/azure/service/cors_rule.rb +15 -0
  56. data/lib/azure/service/enumeration_results.rb +21 -0
  57. data/lib/azure/service/logging.rb +32 -0
  58. data/lib/azure/service/metrics.rb +31 -0
  59. data/lib/azure/service/retention_policy.rb +25 -0
  60. data/lib/azure/service/serialization.rb +299 -0
  61. data/lib/azure/service/signed_identifier.rb +30 -0
  62. data/lib/azure/service/storage_service.rb +86 -0
  63. data/lib/azure/service/storage_service_properties.rb +37 -0
  64. data/lib/azure/service_bus/action.rb +21 -0
  65. data/lib/azure/service_bus/auth/shared_access_signer.rb +44 -0
  66. data/lib/azure/service_bus/auth/wrap_service.rb +90 -0
  67. data/lib/azure/service_bus/auth/wrap_signer.rb +77 -0
  68. data/lib/azure/service_bus/brokered_message.rb +124 -0
  69. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  70. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  71. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  72. data/lib/azure/service_bus/false_filter.rb +38 -0
  73. data/lib/azure/service_bus/filter.rb +21 -0
  74. data/lib/azure/service_bus/interval.rb +104 -0
  75. data/lib/azure/service_bus/queue.rb +230 -0
  76. data/lib/azure/service_bus/relay.rb +88 -0
  77. data/lib/azure/service_bus/resource.rb +109 -0
  78. data/lib/azure/service_bus/rule.rb +98 -0
  79. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  80. data/lib/azure/service_bus/serialization.rb +161 -0
  81. data/lib/azure/service_bus/service_bus_service.rb +899 -0
  82. data/lib/azure/service_bus/sql_filter.rb +50 -0
  83. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  84. data/lib/azure/service_bus/subscription.rb +184 -0
  85. data/lib/azure/service_bus/topic.rb +187 -0
  86. data/lib/azure/service_bus/true_filter.rb +38 -0
  87. data/lib/azure/sql_database_management/errors.rb +11 -0
  88. data/lib/azure/sql_database_management/firewall_rule.rb +30 -0
  89. data/lib/azure/sql_database_management/serialization.rb +99 -0
  90. data/lib/azure/sql_database_management/sql_database_management_service.rb +211 -0
  91. data/lib/azure/sql_database_management/sql_server.rb +32 -0
  92. data/lib/azure/storage_management/serialization.rb +204 -0
  93. data/lib/azure/storage_management/storage_account.rb +48 -0
  94. data/lib/azure/storage_management/storage_management_service.rb +207 -0
  95. data/lib/azure/table/auth/shared_key.rb +59 -0
  96. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  97. data/lib/azure/table/batch.rb +330 -0
  98. data/lib/azure/table/batch_response.rb +118 -0
  99. data/lib/azure/table/edmtype.rb +127 -0
  100. data/lib/azure/table/entity.rb +31 -0
  101. data/lib/azure/table/guid.rb +24 -0
  102. data/lib/azure/table/query.rb +112 -0
  103. data/lib/azure/table/serialization.rb +108 -0
  104. data/lib/azure/table/table_service.rb +563 -0
  105. data/lib/azure/version.rb +31 -0
  106. data/lib/azure/virtual_machine_image_management/serialization.rb +70 -0
  107. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  108. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  109. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +83 -0
  110. data/lib/azure/virtual_machine_management/serialization.rb +459 -0
  111. data/lib/azure/virtual_machine_management/virtual_machine.rb +44 -0
  112. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +552 -0
  113. data/lib/azure/virtual_network_management/serialization.rb +193 -0
  114. data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
  115. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +108 -0
  116. data/test/fixtures/32px-fulls-black.jpg +0 -0
  117. data/test/fixtures/affinity_group.xml +33 -0
  118. data/test/fixtures/all_containers.xml +20 -0
  119. data/test/fixtures/all_tables.xml +22 -0
  120. data/test/fixtures/container_acl.xml +11 -0
  121. data/test/fixtures/create_sql_database_server.xml +2 -0
  122. data/test/fixtures/create_storage_desc_error.xml +5 -0
  123. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  124. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  125. data/test/fixtures/create_storage_full_error.xml +6 -0
  126. data/test/fixtures/create_storage_label_error.xml +5 -0
  127. data/test/fixtures/create_storage_location_error.xml +5 -0
  128. data/test/fixtures/create_storage_name_error.xml +6 -0
  129. data/test/fixtures/create_table_response_entry.xml +15 -0
  130. data/test/fixtures/delete_storage_container_error.xml +5 -0
  131. data/test/fixtures/delete_storage_error.xml +5 -0
  132. data/test/fixtures/deployment_error.xml +5 -0
  133. data/test/fixtures/empty_xml_file +0 -0
  134. data/test/fixtures/get_storage_account_error.xml +5 -0
  135. data/test/fixtures/get_storage_account_properties.xml +34 -0
  136. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  137. data/test/fixtures/http_error.xml +5 -0
  138. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  139. data/test/fixtures/list_affinity_groups.xml +22 -0
  140. data/test/fixtures/list_blobs.xml +121 -0
  141. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  142. data/test/fixtures/list_blocks_all.xml +23 -0
  143. data/test/fixtures/list_blocks_committed.xml +13 -0
  144. data/test/fixtures/list_cloud_services.xml +39 -0
  145. data/test/fixtures/list_containers.xml +38 -0
  146. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  147. data/test/fixtures/list_locations.xml +212 -0
  148. data/test/fixtures/list_os_images.xml +110 -0
  149. data/test/fixtures/list_page_ranges.xml +11 -0
  150. data/test/fixtures/list_sql_database.xml +24 -0
  151. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  152. data/test/fixtures/list_storage_account_single.xml +25 -0
  153. data/test/fixtures/list_storage_accounts.xml +48 -0
  154. data/test/fixtures/list_virtual_networks.xml +92 -0
  155. data/test/fixtures/list_vm_images.xml +21 -0
  156. data/test/fixtures/logging.xml +11 -0
  157. data/test/fixtures/management_certificate.pfx +0 -0
  158. data/test/fixtures/messages.xml +12 -0
  159. data/test/fixtures/metrics.xml +10 -0
  160. data/test/fixtures/privatekey.key +28 -0
  161. data/test/fixtures/query_entities_empty_response.xml +7 -0
  162. data/test/fixtures/query_entities_response.xml +45 -0
  163. data/test/fixtures/queue_service_properties.xml +22 -0
  164. data/test/fixtures/queue_service_properties_original.xml +19 -0
  165. data/test/fixtures/queues.xml +16 -0
  166. data/test/fixtures/retention_policy.xml +5 -0
  167. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  168. data/test/fixtures/sb_default_create_relay_response.xml +15 -0
  169. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  170. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  171. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  172. data/test/fixtures/storage_service_keys.xml +8 -0
  173. data/test/fixtures/storage_service_properties.xml +55 -0
  174. data/test/fixtures/update_storage_account.xml +16 -0
  175. data/test/fixtures/update_storage_error.xml +5 -0
  176. data/test/fixtures/updated_storage_accounts.xml +55 -0
  177. data/test/fixtures/virtual_machine.xml +116 -0
  178. data/test/fixtures/windows_virtual_machine.xml +106 -0
  179. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  180. data/test/integration/affinity_group/Create_Affinity_test.rb +64 -0
  181. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  182. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  183. data/test/integration/affinity_group/Update_Affinity_test.rb +87 -0
  184. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  185. data/test/integration/blob/blob_metadata_test.rb +75 -0
  186. data/test/integration/blob/blob_pages_test.rb +119 -0
  187. data/test/integration/blob/blob_properties_test.rb +77 -0
  188. data/test/integration/blob/block_blob_test.rb +254 -0
  189. data/test/integration/blob/container/container_acl_test.rb +69 -0
  190. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  191. data/test/integration/blob/container/create_container_test.rb +60 -0
  192. data/test/integration/blob/container/delete_container_test.rb +39 -0
  193. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  194. data/test/integration/blob/container/list_containers_test.rb +79 -0
  195. data/test/integration/blob/container/root_container_test.rb +55 -0
  196. data/test/integration/blob/copy_blob_test.rb +113 -0
  197. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  198. data/test/integration/blob/create_page_blob_test.rb +83 -0
  199. data/test/integration/blob/delete_blob_test.rb +159 -0
  200. data/test/integration/blob/get_blob_test.rb +65 -0
  201. data/test/integration/blob/informative_errors_test.rb +39 -0
  202. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  203. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  204. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  205. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  206. data/test/integration/blob/list_blobs_test.rb +113 -0
  207. data/test/integration/cloud_service/Cloud_Create_test.rb +45 -0
  208. data/test/integration/cloud_service/Cloud_Delete_test.rb +45 -0
  209. data/test/integration/database/create_sql_server_firewall_test.rb +81 -0
  210. data/test/integration/database/create_sql_server_test.rb +53 -0
  211. data/test/integration/database/delete_sql_server_firewall_test.rb +64 -0
  212. data/test/integration/database/delete_sql_server_test.rb +45 -0
  213. data/test/integration/database/list_sql_server_firewall_test.rb +44 -0
  214. data/test/integration/database/list_sql_servers_test.rb +44 -0
  215. data/test/integration/database/reset_password_sql_server_test.rb +53 -0
  216. data/test/integration/location/Location_List_test.rb +39 -0
  217. data/test/integration/location/RoleSize_List_test.rb +35 -0
  218. data/test/integration/queue/clear_messages_test.rb +42 -0
  219. data/test/integration/queue/create_message_test.rb +75 -0
  220. data/test/integration/queue/create_queue_test.rb +50 -0
  221. data/test/integration/queue/delete_message_test.rb +67 -0
  222. data/test/integration/queue/delete_queue_test.rb +45 -0
  223. data/test/integration/queue/informative_errors_test.rb +42 -0
  224. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  225. data/test/integration/queue/list_messages_test.rb +79 -0
  226. data/test/integration/queue/list_queues_test.rb +43 -0
  227. data/test/integration/queue/peek_messages_test.rb +59 -0
  228. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  229. data/test/integration/queue/queue_metadata_test.rb +40 -0
  230. data/test/integration/queue/update_message_test.rb +74 -0
  231. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  232. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  233. data/test/integration/service_bus/queues_test.rb +266 -0
  234. data/test/integration/service_bus/relay_test.rb +132 -0
  235. data/test/integration/service_bus/rules_test.rb +145 -0
  236. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  237. data/test/integration/service_bus/scenario_test.rb +101 -0
  238. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  239. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  240. data/test/integration/service_bus/topics_test.rb +129 -0
  241. data/test/integration/storage_management/storage_management_test.rb +185 -0
  242. data/test/integration/table/create_table_test.rb +36 -0
  243. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  244. data/test/integration/table/delete_entity_test.rb +94 -0
  245. data/test/integration/table/delete_table_test.rb +40 -0
  246. data/test/integration/table/get_table_test.rb +37 -0
  247. data/test/integration/table/informative_errors_test.rb +39 -0
  248. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  249. data/test/integration/table/insert_entity_test.rb +88 -0
  250. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  251. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  252. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  253. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  254. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  255. data/test/integration/table/merge_entity_test.rb +113 -0
  256. data/test/integration/table/query_entities_test.rb +196 -0
  257. data/test/integration/table/query_tables_test.rb +43 -0
  258. data/test/integration/table/query_test.rb +251 -0
  259. data/test/integration/table/table_acl_test.rb +52 -0
  260. data/test/integration/table/table_gb18030_test.rb +355 -0
  261. data/test/integration/table/update_entity_batch_test.rb +149 -0
  262. data/test/integration/table/update_entity_test.rb +131 -0
  263. data/test/integration/test_helper.rb +40 -0
  264. data/test/integration/vm/VM_Create_test.rb +262 -0
  265. data/test/integration/vm/VM_Delete_test.rb +53 -0
  266. data/test/integration/vm/VM_Operations_test.rb +172 -0
  267. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  268. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  269. data/test/integration/vnet/Virtual_Network_Create_test.rb +116 -0
  270. data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
  271. data/test/support/env.rb +19 -0
  272. data/test/support/fixtures.rb +36 -0
  273. data/test/support/name_generator.rb +168 -0
  274. data/test/support/stubs.rb +42 -0
  275. data/test/support/virtual_machine_name_generator.rb +102 -0
  276. data/test/support/virtual_network_helper.rb +73 -0
  277. data/test/test_helper.rb +47 -0
  278. data/test/unit/affinity_group/affinity_group_test.rb +189 -0
  279. data/test/unit/affinity_group/serialization_test.rb +87 -0
  280. data/test/unit/base_management/base_management_service_test.rb +19 -0
  281. data/test/unit/base_management/location_test.rb +56 -0
  282. data/test/unit/base_management/role_size_test.rb +50 -0
  283. data/test/unit/blob/auth/shared_access_signature_test.rb +71 -0
  284. data/test/unit/blob/blob_service_test.rb +1970 -0
  285. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -0
  286. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  287. data/test/unit/config/azure_test.rb +112 -0
  288. data/test/unit/config/client_test.rb +37 -0
  289. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  290. data/test/unit/core/auth/shared_key_test.rb +58 -0
  291. data/test/unit/core/auth/signer_test.rb +30 -0
  292. data/test/unit/core/http/http_error_test.rb +61 -0
  293. data/test/unit/core/http/http_request_test.rb +138 -0
  294. data/test/unit/core/http/http_response_test.rb +20 -0
  295. data/test/unit/core/http/retry_policy_test.rb +23 -0
  296. data/test/unit/core/utility_test.rb +122 -0
  297. data/test/unit/database/serialization_test.rb +94 -0
  298. data/test/unit/database/sql_database_server_service_test.rb +341 -0
  299. data/test/unit/http_client_test.rb +74 -0
  300. data/test/unit/service/serialization_test.rb +533 -0
  301. data/test/unit/service/storage_service_test.rb +297 -0
  302. data/test/unit/storage_management/serialization_test.rb +244 -0
  303. data/test/unit/storage_management/storage_management_service_test.rb +247 -0
  304. data/test/unit/table/edmtype_test.rb +108 -0
  305. data/test/unit/virtual_machine_image_management/serialization_test.rb +50 -0
  306. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +114 -0
  307. data/test/unit/virtual_machine_management/serialization_test.rb +316 -0
  308. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +480 -0
  309. data/test/unit/vnet/serialization_test.rb +187 -0
  310. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  311. metadata +579 -0
@@ -0,0 +1,44 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2013 Microsoft Open Technologies, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+
16
+ module Azure
17
+ module VirtualMachineManagement
18
+ class VirtualMachine
19
+ def initialize
20
+ yield self if block_given?
21
+ end
22
+
23
+ attr_accessor :cloud_service_name
24
+ attr_accessor :status
25
+ attr_accessor :ipaddress
26
+ attr_accessor :vm_name
27
+ attr_accessor :udp_endpoints
28
+ attr_accessor :hostname
29
+ attr_accessor :deployment_name
30
+ attr_accessor :deployment_status
31
+ attr_accessor :tcp_endpoints
32
+ attr_accessor :role_size
33
+ attr_accessor :image
34
+ attr_accessor :os_type
35
+ attr_accessor :disk_name
36
+ attr_accessor :virtual_network_name
37
+ attr_accessor :availability_set_name
38
+ attr_accessor :media_link
39
+ attr_accessor :data_disks
40
+ attr_accessor :subnet
41
+ attr_accessor :static_virtual_network_ipaddress
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,552 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2013 Microsoft Open Technologies, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require 'azure/virtual_machine_management/serialization'
16
+ include Azure::VirtualMachineImageManagement
17
+
18
+ module Azure
19
+ module VirtualMachineManagement
20
+ class VirtualMachineManagementService < BaseManagement::BaseManagementService
21
+ include Azure::Core::Utility
22
+
23
+ # Public: Get a lists of virtual machines available under the current subscription.
24
+ #
25
+ # Returns an list of Azure::VirtualMachineManagement::VirtualMachine instances.
26
+ def list_virtual_machines(*cloud_service_names)
27
+ roles = []
28
+ cloud_service_names.flatten!
29
+ if cloud_service_names.empty?
30
+ cloud_service = client.cloud_service_management
31
+ cloud_service_names = cloud_service.list_cloud_services.map(&:name)
32
+ end
33
+ cloud_service_names.each do |cloud_service_name|
34
+ request_path = "/services/hostedservices/#{cloud_service_name}/deploymentslots/production"
35
+ request = client.management_request(:get, request_path)
36
+ request.warn = true
37
+ response = request.call
38
+ roles << Serialization.virtual_machines_from_xml(response, cloud_service_name)
39
+ end
40
+ roles.flatten.compact
41
+ end
42
+
43
+ # Public: Gets a virtual machine based on the provided name and cloud service name.
44
+ #
45
+ # ==== Attributes
46
+ #
47
+ # * +name+ - String. Virtual machine name.
48
+ # * +cloud_service_name+ - String. Cloud service name.
49
+ #
50
+ # Returns an Azure::VirtualMachineManagement::VirtualMachine instance.
51
+ def get_virtual_machine(name, cloud_service_name)
52
+ server = list_virtual_machines(cloud_service_name).select { |x| x.vm_name.casecmp(name) == 0 }
53
+ server.first
54
+ end
55
+
56
+ # Public: Provisions a virtual machine based on the supplied configuration.
57
+ #
58
+ # ==== Attributes
59
+ #
60
+ # * +params+ - Hash. parameters.
61
+ # * +options+ - Hash. Optional parameters.
62
+ #
63
+ # ==== Params
64
+ #
65
+ # Accepted key/value pairs are:
66
+ # * +:vm_name+ - String. Name of virtual machine.
67
+ # * +:vm_user+ - String. User name for the virtual machine instance.
68
+ # * +:password+ - String. A description for the hosted service.
69
+ # * +:image+ - String. Name of the disk image to use to create the virtual machine.
70
+ # * +:location+ - String. The location where the virtual machine will be created.
71
+ # * +:affinity_group_name - String. The affinity group name to be used
72
+ # for the cloud service and the storage account if these do not exist.
73
+ #
74
+ # ==== Options
75
+ #
76
+ # Accepted key/value pairs are:
77
+ # * +:storage_account_name+ - String. Name of storage account.
78
+ # * +:cloud_service_name+ - String. Name of cloud service.
79
+ # * +:deployment_name+ - String. A name for the deployment.
80
+ # * +:tcp_endpoints+ - String. Specifies the internal port and external/public port separated by a colon.
81
+ # You can map multiple internal and external ports by separating them with a comma.
82
+ # * +:ssh_private_key_file+ - String. Path of private key file.
83
+ # * +:ssh_port+ - Integer. Specifies the SSH port number.
84
+ # * +:winrm_http_port+ - Integer. Specifies the WinRM HTTP port number.
85
+ # * +:winrm_https_port+ - Integer. Specifies the WinRM HTTPS port number.
86
+ # * +:vm_size+ - String. Specifies the size of the virtual machine instance.
87
+ # * +:winrm_transport+ - Array. Specifies WINRM transport protocol.
88
+ # * +:availability_set_name+ - String. Specifies the availability set name.
89
+ # * +:reserved_ip_name+ - String. Specifies the reserved IP name.
90
+ #
91
+ # @return [Azure::VirtualMachineManagement::VirtualMachine] objects of newly created instance.
92
+ #
93
+ #
94
+ # @see http://msdn.microsoft.com/en-us/library/azure/jj157194.aspx
95
+ def create_virtual_machine(params, options = {})
96
+ image = get_image(params[:image])
97
+ options[:os_type] = image.os_type
98
+ validate_deployment_params(params, options)
99
+ options[:deployment_name] ||= options[:cloud_service_name]
100
+ Azure::Loggerx.info 'Creating deployment...'
101
+
102
+ options[:cloud_service_name] ||= generate_cloud_service_name(params[:vm_name])
103
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
104
+ optionals = {}
105
+ if options[:virtual_network_name]
106
+ virtual_network_service = client.network_management
107
+ virtual_networks = virtual_network_service.list_virtual_networks.select { |x| x.name == options[:virtual_network_name] }
108
+ if virtual_networks.empty?
109
+ Azure::Loggerx.error_with_exit "Virtual network #{options[:virtual_network_name]} doesn't exists"
110
+ else
111
+ vnet = virtual_networks.first
112
+ if !vnet.affinity_group.empty?
113
+ options[:affinity_group_name] = vnet.affinity_group
114
+ else
115
+ optionals[:location] = vnet.location
116
+ end
117
+ end
118
+ elsif options[:affinity_group_name]
119
+ optionals[:affinity_group_name] = options[:affinity_group_name]
120
+ else
121
+ optionals[:location] = params[:location]
122
+ end
123
+ cloud_service = client.cloud_service_management
124
+ cloud_service.create_cloud_service(options[:cloud_service_name], optionals)
125
+ cloud_service.upload_certificate(options[:cloud_service_name], params[:certificate]) unless params[:certificate].empty?
126
+ unless image.category == 'User'
127
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
128
+ client.storage_management.create_storage_account(options[:storage_account_name], optionals)
129
+ end
130
+ body = Serialization.deployment_to_xml(params, image, options)
131
+ path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
132
+ Azure::Loggerx.info 'Deployment in progress...'
133
+ request = client.management_request(:post, path, body)
134
+ request.call
135
+ get_virtual_machine(params[:vm_name], options[:cloud_service_name])
136
+ rescue Exception => e
137
+ Azure::Loggerx.error_with_exit "Failed to create virtual machine : "+e.message
138
+ end
139
+
140
+ # Public: Add a new role to a cloud service. Atleast one deployment should exist before you can add a role.
141
+ #
142
+ # ==== Attributes
143
+ #
144
+ # * +params+ - Hash. parameters.
145
+ # * +options+ - Hash. Optional parameters.
146
+ #
147
+ # ==== Params
148
+ #
149
+ # Accepted key/value pairs are:
150
+ # * +:vm_name+ - String. Name of virtual machine.
151
+ # * +:vm_user+ - String. User name for the virtual machine instance.
152
+ # * +:password+ - String. A description for the hosted service.
153
+ # * +:image+ - String. Name of the disk image to use to create the virtual machine.
154
+ # * +:cloud_service_name+ - String. Name of cloud service.
155
+ #
156
+ # ==== Options
157
+ #
158
+ # Accepted key/value pairs are:
159
+ # * +:storage_account_name+ - String. Name of storage account.
160
+ # * +:tcp_endpoints+ - String. Specifies the internal port and external/public port separated by a colon.
161
+ # You can map multiple internal and external ports by separating them with a comma.
162
+ # * +:ssh_private_key_file+ - String. Path of private key file.
163
+ # * +:ssh_port+ - Integer. Specifies the SSH port number.
164
+ # * +:winrm_http_port - Integer. Specifies the WinRM HTTP port number.
165
+ # * +:winrm_https_port - Integer. Specifies the WinRM HTTPS port number.
166
+ # * +:vm_size+ - String. Specifies the size of the virtual machine instance.
167
+ # * +:winrm_transport+ - Array. Specifies WINRM transport protocol.
168
+ #
169
+ # Returns Azure::VirtualMachineManagement::VirtualMachine objects of newly created instance.
170
+ #
171
+ # See:
172
+ # http://msdn.microsoft.com/en-us/library/azure/jj157186.aspx
173
+ def add_role(params, options = {})
174
+ image = get_image(params[:image])
175
+ options[:os_type] = image.os_type
176
+ validate_deployment_params(params, options, true)
177
+ cloud_service = client.cloud_service_management
178
+ cloud_service = cloud_service.get_cloud_service_properties(params[:cloud_service_name])
179
+ deployment_name = cloud_service.deployment_name
180
+ Azure::Loggerx.error_with_exit "Deployment doesn't exists." if cloud_service && deployment_name.empty?
181
+ others = {}
182
+ if cloud_service.location
183
+ others[:location] = cloud_service.location
184
+ elsif cloud_service.affinity_group
185
+ others[:affinity_group_name] = cloud_service.affinity_group
186
+ end
187
+ unless image.category == 'User'
188
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
189
+ client.storage_management.create_storage_account(options[:storage_account_name], others)
190
+ end
191
+ Azure::Loggerx.info 'Deployment exists, adding role...'
192
+ existing_ports = []
193
+ cloud_service.virtual_machines[deployment_name.to_sym].each do |vm|
194
+ vm.tcp_endpoints.each do |endpoint|
195
+ existing_ports << endpoint[:public_port]
196
+ end
197
+ end
198
+ options[:existing_ports] = existing_ports
199
+ body = Serialization.role_to_xml(params, image, options).to_xml
200
+ path = "/services/hostedservices/#{cloud_service.name}/deployments/#{deployment_name}/roles"
201
+ Azure::Loggerx.info 'Deployment in progress...'
202
+ request = client.management_request(:post, path, body)
203
+ request.call
204
+ get_virtual_machine(params[:vm_name], cloud_service.name)
205
+ end
206
+
207
+ # Public: Deletes the deployment, cloud service and disk.
208
+ #
209
+ # ==== Attributes
210
+ #
211
+ # * +vm_name+ - String. Virtual machine name.
212
+ # * +cloud_service_name+ - String. Cloud service name.
213
+ #
214
+ # See http://msdn.microsoft.com/en-us/library/azure/gg441305.aspx
215
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157179.aspx
216
+ #
217
+ # Returns NONE
218
+ def delete_virtual_machine(vm_name, cloud_service_name)
219
+ virtual_machines = list_virtual_machines(cloud_service_name)
220
+ vm = virtual_machines.select { |x| x.vm_name == vm_name }.first
221
+ if vm
222
+ if virtual_machines.size == 1
223
+ cloud_service = client.cloud_service_management
224
+ cloud_service.delete_cloud_service_deployment(cloud_service_name)
225
+ cloud_service.delete_cloud_service(cloud_service_name)
226
+ else
227
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm.vm_name}"
228
+ Azure::Loggerx.info "Deleting virtual machine #{vm_name}. \n"
229
+ request = client.management_request(:delete, path)
230
+ request.call
231
+ end
232
+ Azure::Loggerx.info "Waiting for disk to be released.\n"
233
+ disk_name = vm.disk_name
234
+ disk_management_service = client.vm_disk_management
235
+ # Wait for 180s for disk to be released.
236
+ disk = nil
237
+ 18.times do
238
+ print '# '
239
+ disk = disk_management_service.get_virtual_machine_disk(disk_name)
240
+ unless disk.attached
241
+ print "Disk released.\n"
242
+ break
243
+ end
244
+ sleep 10
245
+ end
246
+ if disk.attached
247
+ Azure::Loggerx.error "\nCannot delete disk #{disk_name}."
248
+ else
249
+ disk_management_service.delete_virtual_machine_disk(disk_name)
250
+ end
251
+ else
252
+ Azure::Loggerx.error "Cannot find virtual machine #{vm_name} under cloud service #{cloud_service_name}"
253
+ end
254
+ rescue
255
+ end
256
+
257
+ # Public: Shuts down the specified virtual machine.
258
+ #
259
+ # ==== Attributes
260
+ #
261
+ # * +name+ - String. Virtual machine name.
262
+ # * +cloud_service_name+ - String. Cloud service name.
263
+ #
264
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157195.aspx
265
+ #
266
+ # Returns NONE
267
+ def shutdown_virtual_machine(vm_name, cloud_service_name)
268
+ vm = get_virtual_machine(vm_name, cloud_service_name)
269
+ if vm
270
+ if %w(StoppedVM StoppedDeallocated).include?(vm.status)
271
+ Azure::Loggerx.error 'Cannot perform the shutdown operation on a stopped virtual machine.'
272
+ elsif vm.deployment_status == 'Running'
273
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
274
+ body = Serialization.shutdown_virtual_machine_to_xml
275
+ Azure::Loggerx.info "Shutting down virtual machine \"#{vm.vm_name}\" ..."
276
+ request = client.management_request(:post, path, body)
277
+ request.call
278
+ else
279
+ Azure::Loggerx.error 'Cannot perform the shutdown operation on a stopped deployment.'
280
+ end
281
+ else
282
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\". "
283
+ end
284
+ end
285
+
286
+ # Public: Starts the specified virtual machine.
287
+ #
288
+ # ==== Attributes
289
+ #
290
+ # * +name+ - String. Virtual machine name.
291
+ # * +cloud_service_name+ - String. Cloud service name.
292
+ #
293
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157189.aspx
294
+ #
295
+ # Returns NONE
296
+ def start_virtual_machine(vm_name, cloud_service_name)
297
+ vm = get_virtual_machine(vm_name, cloud_service_name)
298
+ if vm
299
+ if vm.status == 'ReadyRole'
300
+ Azure::Loggerx.error 'Cannot perform the start operation on started virtual machine.'
301
+ else
302
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
303
+ body = Serialization.start_virtual_machine_to_xml
304
+ Azure::Loggerx.info "Starting virtual machine \"#{vm.vm_name}\" ..."
305
+ request = client.management_request(:post, path, body: body)
306
+ request.call
307
+ end
308
+ else
309
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
310
+ end
311
+ end
312
+
313
+ # Public: Restarts the specified virtual machine.
314
+ #
315
+ # ==== Attributes
316
+ #
317
+ # * +name+ - String. Virtual machine name.
318
+ # * +cloud_service_name+ - String. Cloud service name.
319
+ #
320
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157197.aspx
321
+ #
322
+ # Returns NONE
323
+ def restart_virtual_machine(vm_name, cloud_service_name)
324
+ vm = get_virtual_machine(vm_name, cloud_service_name)
325
+ if vm
326
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
327
+ body = Serialization.restart_virtual_machine_to_xml
328
+ Azure::Loggerx.info "Restarting virtual machine \"#{vm.vm_name}\" ..."
329
+ request = client.management_request(:post, path, body: body)
330
+ request.call
331
+ else
332
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
333
+ end
334
+ end
335
+
336
+ # Public: Add/Update endpoints of virtual machine.
337
+ #
338
+ # ==== Attributes
339
+ #
340
+ # * +name+ - String. Virtual machine name.
341
+ # * +cloud_service_name+ - String. Cloud service name.
342
+ # * +input_endpoints+ - Hash. A hash of the name/value pairs for the endpoint.
343
+ #
344
+ # ==== Endpoint
345
+ #
346
+ # Accepted key/value pairs are:
347
+ # * +:local_port+ - String. Specifies the internal port on which the
348
+ # Virtual Machine is listening.
349
+ # * +:public_port+ - String. Specifies the external port to use for
350
+ # the endpoint.
351
+ # * +:name+ - String. Specifies the name of the external endpoint.
352
+ # * +load_balancer_name+ - String. Specifies a name for a set of
353
+ # load-balanced endpoints.
354
+ # * +:protocol+ - String. Specifies the transport protocol
355
+ # for the endpoint. Possible values are: TCP, UDP
356
+ # * +:direct_server_return+ - String. Specifies whether the endpoint
357
+ # uses Direct Server Return. Possible values are: true, false (optional)
358
+ # * +:load_balancer - Hash. Contains properties that define the
359
+ # endpoint settings that the load balancer uses to monitor the
360
+ # availability of the Virtual Machine (optional)
361
+ #
362
+ # === Load balancer
363
+ #
364
+ # Accepted key/value pairs are:
365
+ # * +:port+ - String. Specifies the internal port on which the
366
+ # Virtual Machine is listening.
367
+ # * +:protocol+ - String. Specifies the protocol to use to inspect the
368
+ # availability status of the virtual machine.
369
+ # * +:interval+ - String. Specifies the interval for the load balancer
370
+ # probe in seconds. (optional)
371
+ # * +:timeout+ - String. Specifies the timeout for the load balancer
372
+ # probe in seconds. (optional)
373
+ # * +:path+ - String. Specifies the relative path to inspect to
374
+ # determine the availability status of the Virtual Machine. (optional)
375
+ #
376
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157187.aspx
377
+ #
378
+ # Returns NONE
379
+ def update_endpoints(vm_name, cloud_service_name, *input_endpoints)
380
+ input_endpoints.flatten!
381
+ vm = get_virtual_machine(vm_name, cloud_service_name)
382
+ if vm
383
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm_name}"
384
+ endpoints = vm.tcp_endpoints + vm.udp_endpoints
385
+ input_endpoints.each do |iep|
386
+ endpoints.delete_if { |ep| iep[:name].downcase == ep[:name].downcase }
387
+ end
388
+ endpoints += input_endpoints
389
+ body = Serialization.update_role_to_xml(endpoints, vm)
390
+ request = client.management_request(:put, path, body: body)
391
+ Azure::Loggerx.info "Updating endpoints of virtual machine #{vm.vm_name} ..."
392
+ request.call
393
+ else
394
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
395
+ end
396
+ end
397
+
398
+ # Public: Delete endpoint of virtual machine.
399
+ #
400
+ # ==== Attributes
401
+ #
402
+ # * +name+ - String. Virtual machine name.
403
+ # * +cloud_service_name+ - String. Cloud service name.
404
+ # * +endpoint_name+ - String. Name of endpoint.
405
+ #
406
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157187.aspx
407
+ #
408
+ # Returns NONE
409
+ def delete_endpoint(vm_name, cloud_service_name, endpoint_name)
410
+ vm = get_virtual_machine(vm_name, cloud_service_name)
411
+ if vm
412
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm_name}"
413
+ endpoints = vm.tcp_endpoints + vm.udp_endpoints
414
+ endpoints.delete_if { |ep| endpoint_name.downcase == ep[:name].downcase }
415
+ body = Serialization.update_role_to_xml(endpoints, vm)
416
+ request = client.management_request(:put, path, body: body)
417
+ Azure::Loggerx.info "Deleting virtual machine endpoint #{endpoint_name} ..."
418
+ request.call
419
+ else
420
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
421
+ end
422
+ end
423
+
424
+ # Public: adds a data disk to a virtual machine.
425
+ #
426
+ # ==== Attributes
427
+ #
428
+ # * +cloud_service_name+ - String. Cloud service name.
429
+ # * +vm_name+ - String. Virtual machine name.
430
+ # * +options+ - Hash. Optional parameters.
431
+ #
432
+ # ==== Options
433
+ #
434
+ # Accepted key/value pairs in options parameter are:
435
+ # * +:import+ - Boolean. if true, then allows to use an existing
436
+ # disk by disk name. if false, then create and attach new data disk.
437
+ # * +:disk_name+ - String. Specifies the name of the disk.
438
+ # Reqruied if using existing disk.
439
+ # * +:host_caching+ - String. Specifies the caching behavior of data disk
440
+ # The default is ReadOnly. Possible values are: None, ReadOnly, ReadWrite
441
+ # * +:disk_label+ - String. Specifies the description of the data disk.
442
+ # * +:disk_size+ - String. Specifies the size of disk in GB
443
+ #
444
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157199.aspx
445
+ #
446
+ # Returns None
447
+ def add_data_disk(vm_name, cloud_service_name, options = {})
448
+ options[:import] ||= false
449
+ vm = get_virtual_machine(vm_name, cloud_service_name)
450
+ if vm
451
+ path = "/services/hostedservices/#{cloud_service_name}/deployments/#{vm.deployment_name}/roles/#{vm_name}/DataDisks"
452
+ body = Serialization.add_data_disk_to_xml(vm, options)
453
+ Azure::Loggerx.info "Adding data disk to virtual machine #{vm_name} ..."
454
+ request = client.management_request(:post, path, body: body)
455
+ request.call
456
+ else
457
+ Azure::Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
458
+ end
459
+ end
460
+
461
+ private
462
+
463
+ # Private: Gets the operating system type of an image.
464
+ #
465
+ # Returns Linux or Windows
466
+ def get_image(image_name)
467
+ image_service = client.vm_image_management
468
+ image = image_service.list_virtual_machine_images.select { |x| x.name.casecmp(image_name.to_s) == 0 }.first
469
+ Azure::Loggerx.error_with_exit 'The virtual machine image source is not valid.' unless image
470
+ image
471
+ end
472
+
473
+ def generate_cloud_service_name(vm_name)
474
+ random_string(vm_name + '-service-')
475
+ end
476
+
477
+ def generate_storage_account_name(vm_name)
478
+ random_string(vm_name + 'storage').gsub(/[^0-9a-z ]/i, '').downcase[0..23]
479
+ end
480
+
481
+ def validate_deployment_params(params, options, add_role = false)
482
+ errors = []
483
+ params_keys = %w(vm_name image vm_user)
484
+ params_keys += ['password'] if options[:os_type] == 'Windows'
485
+ options_keys = []
486
+ options_keys = %w(private_key_file) if certificate_required?(params, options)
487
+ if add_role
488
+ params_keys += ['cloud_service_name']
489
+ else
490
+ params_keys += ['location']
491
+ end
492
+ params_keys.each do |key|
493
+ errors << key if params[key.to_sym].nil?
494
+ end
495
+
496
+ options_keys.each do |key|
497
+ errors << key if options[key.to_sym].nil?
498
+ end
499
+
500
+ if errors.empty?
501
+ validate_location(params[:location]) unless add_role
502
+ validate_role_size(options[:vm_size])
503
+ params[:certificate] = {}
504
+ if certificate_required?(params, options)
505
+ begin
506
+ params[:certificate][:key] = OpenSSL::PKey.read File.read(options[:private_key_file])
507
+ params[:certificate][:cert] = get_certificate(options[:private_key_file])
508
+ params[:certificate][:fingerprint] = export_fingerprint(params[:certificate][:cert])
509
+ rescue Exception => e
510
+ Azure::Loggerx.error_with_exit e.message
511
+ end
512
+ end
513
+ else
514
+ Azure::Loggerx.error_with_exit "You did not provide a valid '#{errors.uniq.join(", ")}' value."
515
+ end
516
+ end
517
+
518
+ def certificate_required?(params, options)
519
+ if options[:os_type] == 'Linux'
520
+ params[:password].nil?
521
+ else
522
+ winrm_with_https(options)
523
+ end
524
+ end
525
+
526
+ def winrm_with_https(options)
527
+ if options[:os_type] == 'Windows'
528
+ options[:winrm_transport] && options[:winrm_transport].include?('https') && options[:private_key_file]
529
+ end
530
+ end
531
+
532
+ def validate_role_size(vm_size)
533
+ suggested_role_sizes = client.base_management.list_role_sizes
534
+ if vm_size && !suggested_role_sizes.include?(vm_size)
535
+ Azure::Loggerx.warn "Value '#{vm_size}' specified for parameter 'vm_size' is not in the list of valid VM role sizes. Suggested values are '#{suggested_role_sizes.join(',')}'"
536
+ end
537
+ end
538
+
539
+ def validate_location(location_name)
540
+ locations = client.base_management.list_locations
541
+ location = locations.select { |loc| loc.name.downcase == location_name.downcase }.first
542
+ if location.nil?
543
+ Azure::Loggerx.error_with_exit "Value '#{location_name}' specified for parameter 'location' is invalid. Allowed values are #{locations.map(&:name).join(',')}"
544
+ elsif !location.available_services.include?('PersistentVMRole')
545
+ Azure::Loggerx.error_with_exit "Persistentvmrole not enabled for \"#{location.name}\". Try different location"
546
+ end
547
+ end
548
+ end
549
+ end
550
+ end
551
+
552
+ Azure::VirtualMachineManagementService = Azure::VirtualMachineManagement::VirtualMachineManagementService