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,31 @@
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
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
+ class Version
18
+ MAJOR = 0 unless defined? MAJOR
19
+ MINOR = 7 unless defined? MINOR
20
+ UPDATE = 0 unless defined? UPDATE
21
+ PRE = 'pre3' unless defined? PRE
22
+
23
+ class << self
24
+
25
+ # @return [String]
26
+ def to_s
27
+ [MAJOR, MINOR, UPDATE, PRE].compact.join('.')
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
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_image_management/virtual_machine_image'
16
+ require 'azure/virtual_machine_image_management/virtual_machine_disk'
17
+
18
+ module Azure
19
+ module VirtualMachineImageManagement
20
+ module Serialization
21
+ extend Azure::Core::Utility
22
+ def self.virtual_machine_images_from_xml(imageXML)
23
+ os_images = []
24
+ virtual_machine_images = imageXML.css('Images OSImage')
25
+ virtual_machine_images.each do |image_node|
26
+ image = VirtualMachineImage.new
27
+ image.os_type = xml_content(image_node, 'OS')
28
+ image.name = xml_content(image_node, 'Name')
29
+ image.category = xml_content(image_node, 'Category')
30
+ image.media_link = xml_content(image_node, 'MediaLink')
31
+ image.locations = xml_content(image_node, 'Location')
32
+ image.image_type = 'OS'
33
+ os_images << image
34
+ end
35
+ os_images
36
+ end
37
+
38
+ def self.virtual_machine_vm_images_from_xml(imageXML)
39
+ os_images = []
40
+ virtual_machine_images = imageXML.css('VMImages VMImage')
41
+ virtual_machine_images.each do |image_node|
42
+ image = VirtualMachineImage.new
43
+ image.name = xml_content(image_node, 'Name')
44
+ image.category = xml_content(image_node, 'Category')
45
+ image.locations = xml_content(image_node, 'Location')
46
+ image.os_type = xml_content(image_node, 'OSDiskConfiguration OS')
47
+ image.media_link = xml_content(image_node, 'OSDiskConfiguration MediaLink')
48
+ image.image_type = 'VM'
49
+ os_images << image
50
+ end
51
+ os_images
52
+ end
53
+
54
+ def self.disks_from_xml(diskXML)
55
+ os_disks = []
56
+ disks = diskXML.css('Disks Disk')
57
+ disks.each do |disk_node|
58
+ disk = VirtualMachineDisk.new
59
+ disk.name = xml_content(disk_node, 'Name')
60
+ disk.os_type = xml_content(disk_node, 'OS')
61
+ disk.attached = !xml_content(disk_node, 'AttachedTo').empty?
62
+ disk.image = xml_content(disk_node, 'SourceImageName')
63
+ disk.size = xml_content(disk_node, 'LogicalDiskSizeInGB')
64
+ os_disks << disk
65
+ end
66
+ os_disks
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,25 @@
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
+ module Azure
16
+ module VirtualMachineImageManagement
17
+ class VirtualMachineDisk
18
+ def initialize
19
+ yield self if block_given?
20
+ end
21
+
22
+ attr_accessor :name, :attached, :os_type, :image, :size
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
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
+ module Azure
16
+ module VirtualMachineImageManagement
17
+ class VirtualMachineImage
18
+ def initialize
19
+ yield self if block_given?
20
+ end
21
+
22
+ attr_accessor :os_type, :name, :category, :locations, :media_link, :image_type
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,83 @@
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_image_management/serialization'
16
+
17
+ module Azure
18
+ module VirtualMachineImageManagement
19
+ class VirtualMachineImageManagementService < BaseManagement::BaseManagementService
20
+
21
+ # Public: Gets a list of virtual machine images from the server
22
+ #
23
+ # Returns an array of Azure::VirtualMachineImageManagement::VirtualMachineImage objects
24
+ def list_virtual_machine_images
25
+ list_os_images + list_vm_images
26
+ end
27
+
28
+ # Private: Gets a list of the operating system images that is associated with the specified subscription
29
+ #
30
+ # See http://msdn.microsoft.com/en-us/library/azure/jj157191.aspx
31
+ #
32
+ # Returns an array of Azure::VirtualMachineImageManagement::VirtualMachineImage objects
33
+ def list_os_images
34
+ request_path = '/services/images'
35
+ request = client.management_request(:get, request_path, nil)
36
+ response = request.call
37
+ Serialization.virtual_machine_images_from_xml(response)
38
+ end
39
+
40
+ # Private: Gets a list of the VM Images that is associated with the specified subscription
41
+ #
42
+ # See http://msdn.microsoft.com/en-us/library/azure/dn499770.aspx
43
+ #
44
+ # Returns an array of Azure::VirtualMachineImageManagement::VirtualMachineImage objects
45
+ def list_vm_images
46
+ request_path = '/services/vmimages'
47
+ request = client.management_request(:get, request_path)
48
+ response = request.call
49
+ Serialization.virtual_machine_vm_images_from_xml(response)
50
+ end
51
+ end
52
+
53
+ class VirtualMachineDiskManagementService < BaseManagement::BaseManagementService
54
+
55
+ # Public: Gets a list of Disks from the server.
56
+ #
57
+ # Returns an array of Azure::VirtualMachineDiskManagementService objects
58
+ def list_virtual_machine_disks
59
+ request_path = '/services/disks'
60
+ request = client.management_request(:get, request_path)
61
+ response = request.call
62
+ Serialization.disks_from_xml(response)
63
+ end
64
+
65
+ def get_virtual_machine_disk(disk_name)
66
+ disk = list_virtual_machine_disks.select { |x| x.name == disk_name }
67
+ disk.first
68
+ end
69
+
70
+ # Public: Deletes the specified data or operating system disk from the image repository.
71
+ #
72
+ # Returns None
73
+ def delete_virtual_machine_disk(disk_name)
74
+ Azure::Loggerx.info "Deleting Disk \"#{disk_name}\". "
75
+ path = "/services/disks/#{disk_name}"
76
+ request = client.management_request(:delete, path)
77
+ request.call
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ Azure::VirtualMachineImageManagementService = Azure::VirtualMachineImageManagement::VirtualMachineImageManagementService
@@ -0,0 +1,459 @@
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/virtual_machine'
16
+ require 'base64'
17
+
18
+ module Azure
19
+ module VirtualMachineManagement
20
+ module Serialization
21
+ extend Azure::Core::Utility
22
+ def self.shutdown_virtual_machine_to_xml
23
+ builder = Nokogiri::XML::Builder.new do |xml|
24
+ xml.ShutdownRoleOperation(
25
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
26
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
27
+ ) do
28
+ xml.OperationType 'ShutdownRoleOperation'
29
+ xml.PostShutdownAction 'StoppedDeallocated'
30
+ end
31
+ end
32
+ builder.doc.to_xml
33
+ end
34
+
35
+ def self.start_virtual_machine_to_xml
36
+ builder = Nokogiri::XML::Builder.new do |xml|
37
+ xml.StartRoleOperation(
38
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
39
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
40
+ ) do
41
+ xml.OperationType 'StartRoleOperation'
42
+ end
43
+ end
44
+ builder.doc.to_xml
45
+ end
46
+
47
+ def self.restart_virtual_machine_to_xml
48
+ builder = Nokogiri::XML::Builder.new do |xml|
49
+ xml.RestartRoleOperation(
50
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
51
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
52
+ ) do
53
+ xml.OperationType 'RestartRoleOperation'
54
+ end
55
+ end
56
+ builder.doc.to_xml
57
+ end
58
+
59
+ def self.deployment_to_xml(params, image, options)
60
+ options[:deployment_name] ||= options[:cloud_service_name]
61
+ builder = Nokogiri::XML::Builder.new do |xml|
62
+ xml.Deployment(
63
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
64
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
65
+ ) do
66
+ xml.Name options[:deployment_name]
67
+ xml.DeploymentSlot 'Production'
68
+ xml.Label Base64.encode64(options[:deployment_name]).strip
69
+ xml.RoleList { xml.Role('i:type' => 'PersistentVMRole') }
70
+ if options[:virtual_network_name]
71
+ xml.VirtualNetworkName options[:virtual_network_name]
72
+ end
73
+ if options[:reserved_ip_name]
74
+ xml.ReservedIPName options[:reserved_ip_name]
75
+ end
76
+ end
77
+ end
78
+ builder.doc.at_css('Role') << role_to_xml(params, image, options).at_css('PersistentVMRole').children.to_s
79
+ builder.doc.to_xml
80
+ end
81
+
82
+ def self.role_to_xml(params, image, options)
83
+ builder = Nokogiri::XML::Builder.new do |xml|
84
+ xml.PersistentVMRole(
85
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
86
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
87
+ ) do
88
+ xml.RoleName { xml.text params[:vm_name] }
89
+ xml.OsVersion('i:nil' => 'true')
90
+ xml.RoleType 'PersistentVMRole'
91
+ xml.ConfigurationSets do
92
+ provisioning_configuration_to_xml(xml, params, options) if image.image_type == 'OS' || image.image_type == 'VM'
93
+ xml.ConfigurationSet('i:type' => 'NetworkConfigurationSet') do
94
+ xml.ConfigurationSetType 'NetworkConfiguration'
95
+ xml.InputEndpoints do
96
+ default_endpoints_to_xml(xml, options)
97
+ tcp_endpoints_to_xml(
98
+ xml,
99
+ options[:tcp_endpoints],
100
+ options[:existing_ports]
101
+ ) if options[:tcp_endpoints]
102
+ end
103
+ if options[:virtual_network_name] && options[:subnet_name]
104
+ xml.SubnetNames do
105
+ xml.SubnetName options[:subnet_name]
106
+ end
107
+ xml.StaticVirtualNetworkIPAddress options[:static_virtual_network_ipaddress] if options[:static_virtual_network_ipaddress]
108
+ end
109
+ end
110
+ end
111
+ xml.VMImageName image.name if image.image_type == 'VM'
112
+ xml.AvailabilitySetName options[:availability_set_name]
113
+ xml.Label Base64.encode64(params[:vm_name]).strip
114
+ if image.category == 'User'
115
+ storage_host = URI.parse( image.media_link ).host
116
+ else
117
+ storage_host = options[:storage_account_name] + '.blob.core.windows.net'
118
+ end
119
+ if image.image_type == 'OS'
120
+ xml.OSVirtualHardDisk do
121
+ xml.MediaLink 'http://' + storage_host + '/vhds/' + (Time.now.strftime('disk_%Y_%m_%d_%H_%M_%S_%L')) + '.vhd'
122
+ xml.SourceImageName params[:image]
123
+ end
124
+ end
125
+ xml.RoleSize options[:vm_size]
126
+ end
127
+ end
128
+ builder.doc
129
+ end
130
+
131
+ def self.provisioning_configuration_to_xml(xml, params, options)
132
+ fingerprint = params[:certificate][:fingerprint]
133
+ if options[:os_type] == 'Linux'
134
+ xml.ConfigurationSet('i:type' => 'LinuxProvisioningConfigurationSet') do
135
+ xml.ConfigurationSetType 'LinuxProvisioningConfiguration'
136
+ xml.HostName params[:vm_name]
137
+ xml.UserName params[:vm_user]
138
+ if params[:password]
139
+ xml.UserPassword params[:password]
140
+ xml.DisableSshPasswordAuthentication 'false'
141
+ end
142
+ if fingerprint
143
+ xml.SSH do
144
+ xml.PublicKeys do
145
+ xml.PublicKey do
146
+ xml.Fingerprint fingerprint.to_s.upcase
147
+ xml.Path "/home/#{params[:vm_user]}/.ssh/authorized_keys"
148
+ end
149
+ end
150
+ xml.KeyPairs do
151
+ xml.KeyPair do
152
+ xml.Fingerprint fingerprint.to_s.upcase
153
+ xml.Path "/home/#{params[:vm_user]}/.ssh/id_rsa"
154
+ end
155
+ end
156
+ end
157
+ end
158
+ xml.CustomData params[:custom_data] if params[:custom_data]
159
+ end
160
+ elsif options[:os_type] == 'Windows'
161
+ xml.ConfigurationSet('i:type' => 'WindowsProvisioningConfigurationSet') do
162
+ xml.ConfigurationSetType 'WindowsProvisioningConfiguration'
163
+ xml.ComputerName params[:vm_name]
164
+ xml.AdminPassword params[:password]
165
+ xml.ResetPasswordOnFirstLogon 'false'
166
+ xml.EnableAutomaticUpdates 'true'
167
+ if enable_winrm?(options[:winrm_transport])
168
+ xml.WinRM do
169
+ xml.Listeners do
170
+ if options[:winrm_transport].include?('http')
171
+ xml.Listener do
172
+ xml.Protocol 'Http'
173
+ end
174
+ end
175
+ if options[:winrm_transport].include?('https')
176
+ xml.Listener do
177
+ xml.Protocol 'Https'
178
+ xml.CertificateThumbprint fingerprint if fingerprint
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ xml.AdminUsername params[:vm_user]
185
+ end
186
+ end
187
+ end
188
+
189
+ def self.default_endpoints_to_xml(xml, options)
190
+ os_type = options[:os_type]
191
+ used_ports = options[:existing_ports]
192
+ endpoints = []
193
+ if os_type == 'Linux'
194
+ preferred_port = '22'
195
+ port_already_opened?(used_ports, options[:ssh_port])
196
+ endpoints << {
197
+ name: 'SSH',
198
+ public_port: options[:ssh_port] || assign_random_port(preferred_port, used_ports),
199
+ protocol: 'TCP',
200
+ local_port: preferred_port
201
+ }
202
+ elsif os_type == 'Windows' && options[:winrm_transport]
203
+ if options[:winrm_transport].include?('http')
204
+ preferred_port = '5985'
205
+ port_already_opened?(used_ports, options[:winrm_http_port])
206
+ endpoints << {
207
+ name: 'WinRm-Http',
208
+ public_port: options[:winrm_http_port] || assign_random_port(preferred_port, used_ports),
209
+ protocol: 'TCP',
210
+ local_port: preferred_port
211
+ }
212
+ end
213
+ if options[:winrm_transport].include?('https')
214
+ preferred_port = '5986'
215
+ port_already_opened?(used_ports, options[:winrm_https_port])
216
+ endpoints << {
217
+ name: 'PowerShell',
218
+ public_port: options[:winrm_https_port] || assign_random_port(preferred_port, used_ports),
219
+ protocol: 'TCP',
220
+ local_port: preferred_port
221
+ }
222
+ end
223
+ end
224
+ endpoints_to_xml(xml, endpoints)
225
+ end
226
+
227
+ def self.tcp_endpoints_to_xml(xml, tcp_endpoints, existing_ports = [])
228
+ endpoints = []
229
+
230
+ tcp_endpoints.split(',').each do |endpoint|
231
+ ports = endpoint.split(':')
232
+ tcp_ep = {}
233
+
234
+ if ports.length > 1
235
+ port_already_opened?(existing_ports, ports[1])
236
+
237
+ tcp_ep[:name] = "TCP-PORT-#{ports[1]}"
238
+ tcp_ep[:public_port] = ports[1]
239
+ else
240
+ port_already_opened?(existing_ports, ports[0])
241
+
242
+ tcp_ep[:name] = "TCP-PORT-#{ports[0]}"
243
+ tcp_ep[:public_port] = ports[0]
244
+ end
245
+
246
+ tcp_ep[:local_port] = ports[0]
247
+ tcp_ep[:protocol] = 'TCP'
248
+
249
+ endpoints << tcp_ep
250
+ end
251
+ endpoints_to_xml(xml, endpoints)
252
+ end
253
+
254
+ def self.virtual_machines_from_xml(deployXML, cloud_service_name)
255
+ unless deployXML.nil? or deployXML.at_css('Deployment Name').nil?
256
+ instances = deployXML.css('Deployment RoleInstanceList RoleInstance')
257
+ roles = deployXML.css('Deployment RoleList Role')
258
+ ip = deployXML.css('Deployment VirtualIPs VirtualIP')
259
+ vms = []
260
+ instances.each do |instance|
261
+ vm = VirtualMachine.new
262
+ role_name = xml_content(instance, 'RoleName')
263
+ vm.status = xml_content(instance, 'InstanceStatus')
264
+ vm.vm_name = role_name
265
+ vm.ipaddress = xml_content(ip, 'Address')
266
+ vm.role_size = xml_content(instance, 'InstanceSize')
267
+ vm.hostname = xml_content(instance, 'HostName')
268
+ vm.cloud_service_name = cloud_service_name
269
+ vm.deployment_name = xml_content(deployXML, 'Deployment Name')
270
+ vm.deployment_status = xml_content(deployXML, 'Deployment Status')
271
+ vm.virtual_network_name = xml_content(
272
+ deployXML.css('Deployment'),
273
+ 'VirtualNetworkName'
274
+ )
275
+ roles.each do |role|
276
+ if xml_content(role, 'RoleName') == role_name
277
+ vm.availability_set_name = xml_content(role, 'AvailabilitySetName')
278
+ endpoints_from_xml(role, vm)
279
+ vm.data_disks = data_disks_from_xml(role)
280
+ subnet = xml_content(role,
281
+ 'ConfigurationSets ConfigurationSet SubnetNames SubnetName'
282
+ )
283
+ vm.subnet = subnet unless subnet.empty?
284
+ static_virtual_network_ipaddress = xml_content(role,'ConfigurationSets ConfigurationSet StaticVirtualNetworkIPAddress')
285
+ vm.static_virtual_network_ipaddress = static_virtual_network_ipaddress unless static_virtual_network_ipaddress.empty?
286
+ vm.os_type = xml_content(role, 'OSVirtualHardDisk OS')
287
+ vm.disk_name = xml_content(role, 'OSVirtualHardDisk DiskName')
288
+ vm.media_link = xml_content(role, 'OSVirtualHardDisk MediaLink')
289
+ vm.image = xml_content(role, 'OSVirtualHardDisk SourceImageName')
290
+ break
291
+ end
292
+ end
293
+ vms << vm
294
+ end
295
+ vms
296
+ end
297
+ end
298
+
299
+ def self.data_disks_from_xml(rolesXML)
300
+ data_disks = []
301
+ virtual_hard_disks = rolesXML.css('DataVirtualHardDisks DataVirtualHardDisk')
302
+ virtual_hard_disks.each do |disk|
303
+ data_disk = {}
304
+ data_disk[:name] = xml_content(disk, 'DiskName')
305
+ data_disk[:lun] = xml_content(disk, 'Lun')
306
+ data_disk[:size_in_gb] = xml_content(disk, 'LogicalDiskSizeInGB')
307
+ data_disk[:media_link] = xml_content(disk, 'MediaLink')
308
+ data_disks << data_disk
309
+ end
310
+ data_disks
311
+ end
312
+
313
+ def self.endpoints_from_xml(rolesXML, vm)
314
+ vm.tcp_endpoints = []
315
+ vm.udp_endpoints = []
316
+ endpoints = rolesXML.css('ConfigurationSets ConfigurationSet InputEndpoints InputEndpoint')
317
+ endpoints.each do |endpoint|
318
+ lb_name = xml_content(endpoint, 'LoadBalancedEndpointSetName')
319
+ ep = {}
320
+ ep[:name] = xml_content(endpoint, 'Name')
321
+ ep[:vip] = xml_content(endpoint, 'Vip')
322
+ ep[:public_port] = xml_content(endpoint, 'Port')
323
+ ep[:local_port] = xml_content(endpoint, 'LocalPort')
324
+ ep[:protocol] = xml_content(endpoint, 'Protocol')
325
+ server_return = xml_content(endpoint, 'EnableDirectServerReturn')
326
+ ep[:direct_server_return] = server_return if !server_return.empty?
327
+ unless lb_name.empty?
328
+ ep[:protocol] = endpoint.css('Protocol').last.text
329
+ ep[:load_balancer_name] = lb_name
330
+ lb_port = xml_content(endpoint, 'LoadBalancerProbe Port')
331
+ lb_protocol = xml_content(endpoint, 'LoadBalancerProbe Protocol')
332
+ lb_path = xml_content(endpoint, 'LoadBalancerProbe Path')
333
+ lb_interval = xml_content(
334
+ endpoint,
335
+ 'LoadBalancerProbe IntervalInSeconds'
336
+ )
337
+ lb_timeout = xml_content(
338
+ endpoint,
339
+ 'LoadBalancerProbe TimeoutInSeconds'
340
+ )
341
+ ep[:load_balancer] = {
342
+ port: lb_port,
343
+ path: lb_path,
344
+ protocol: lb_protocol,
345
+ interval: lb_interval,
346
+ timeout: lb_timeout
347
+ }
348
+ end
349
+ if ep[:protocol].downcase == 'tcp'
350
+ vm.tcp_endpoints << ep
351
+ else
352
+ vm.udp_endpoints << ep
353
+ end
354
+ end
355
+ end
356
+
357
+ def self.update_role_to_xml(endpoints, vm)
358
+ builder = Nokogiri::XML::Builder.new do |xml|
359
+ xml.PersistentVMRole(
360
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
361
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
362
+ ) do
363
+ xml.ConfigurationSets do
364
+ xml.ConfigurationSet do
365
+ xml.ConfigurationSetType 'NetworkConfiguration'
366
+ xml.InputEndpoints do
367
+ endpoints_to_xml(xml, endpoints)
368
+ end
369
+ xml.SubnetNames do
370
+ xml.SubnetName vm.subnet if vm.subnet
371
+ end
372
+ xml.StaticVirtualNetworkIPAddress vm.static_virtual_network_ipaddress if vm.static_virtual_network_ipaddress
373
+ end
374
+ end
375
+ xml.OSVirtualHardDisk do
376
+ end
377
+ end
378
+ end
379
+ builder.doc.to_xml
380
+ end
381
+
382
+ def self.endpoints_to_xml(xml, endpoints)
383
+ endpoints.each do |endpoint|
384
+ endpoint[:load_balancer] ||= {}
385
+ protocol = endpoint[:protocol]
386
+ port = endpoint[:public_port]
387
+ interval = endpoint[:load_balancer][:interval]
388
+ timeout = endpoint[:load_balancer][:timeout]
389
+ path = endpoint[:load_balancer][:path]
390
+ balancer_name = endpoint[:load_balancer_name]
391
+ xml.InputEndpoint do
392
+ xml.LoadBalancedEndpointSetName balancer_name if balancer_name
393
+ xml.LocalPort endpoint[:local_port]
394
+ xml.Name endpoint[:name]
395
+ xml.Port endpoint[:public_port]
396
+ if balancer_name
397
+ xml.LoadBalancerProbe do
398
+ xml.Path path if path
399
+ xml.Port endpoint[:load_balancer][:port] || port
400
+ xml.Protocol endpoint[:load_balancer][:protocol] || 'TCP'
401
+ xml.IntervalInSeconds interval if interval
402
+ xml.TimeoutInSeconds timeout if timeout
403
+ end
404
+ end
405
+ xml.Protocol protocol
406
+ xml.EnableDirectServerReturn endpoint[:direct_server_return] unless endpoint[:direct_server_return].nil?
407
+ end
408
+ end
409
+ end
410
+
411
+ def self.add_data_disk_to_xml(vm, options)
412
+ if options[:import] && options[:disk_name].nil?
413
+ Azure::Loggerx.error_with_exit "The data disk name is not valid."
414
+ end
415
+ media_link = vm.media_link
416
+ builder = Nokogiri::XML::Builder.new do |xml|
417
+ xml.DataVirtualHardDisk(
418
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure',
419
+ 'xmlns:i' => 'http://www.w3.org/2001/XMLSchema-instance'
420
+ ) do
421
+ xml.HostCaching options[:host_caching] || 'ReadOnly'
422
+ xml.DiskLabel options[:disk_label]
423
+ xml.DiskName options[:disk_name] if options[:import]
424
+ xml.LogicalDiskSizeInGB options[:disk_size] || 100
425
+ unless options[:import]
426
+ disk_name = media_link[/([^\/]+)$/]
427
+ media_link = media_link.gsub(/#{disk_name}/, (Time.now.strftime('disk_%Y_%m_%d_%H_%M_%S')) + '.vhd')
428
+ xml.MediaLink media_link
429
+ end
430
+ end
431
+ end
432
+ builder.doc.to_xml
433
+ end
434
+
435
+ private
436
+
437
+ def self.port_already_opened?(existing_ports, port)
438
+ return false if existing_ports.nil?
439
+ raise "Port #{port} conflicts with a port already opened. "\
440
+ "Please select a different port." if existing_ports.include?(port)
441
+ false
442
+ end
443
+
444
+ def self.assign_random_port(preferred_port, used_ports)
445
+ random_port = nil
446
+ if used_ports.nil? || !used_ports.include?(preferred_port)
447
+ random_port = preferred_port
448
+ else
449
+ random_port = Random.new.rand(10000..65535)
450
+ while(used_ports.include?(random_port.to_s))
451
+ random_port = Random.new.rand(10000..65535)
452
+ end
453
+ end
454
+ random_port
455
+ end
456
+
457
+ end
458
+ end
459
+ end