azurex 0.6.5

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