azure 0.6.0 → 0.6.1

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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -11
  3. data/.travis.yml +11 -33
  4. data/ChangeLog.txt +20 -5
  5. data/Gemfile +15 -15
  6. data/README.md +541 -537
  7. data/Rakefile +129 -127
  8. data/azure.gemspec +43 -42
  9. data/lib/azure.rb +52 -51
  10. data/lib/azure/base_management/affinity_group.rb +32 -32
  11. data/lib/azure/base_management/base_management_service.rb +234 -234
  12. data/lib/azure/base_management/location.rb +27 -27
  13. data/lib/azure/base_management/management_http_request.rb +171 -148
  14. data/lib/azure/base_management/serialization.rb +129 -129
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -0
  16. data/lib/azure/blob/blob.rb +31 -31
  17. data/lib/azure/blob/blob_service.rb +1423 -1423
  18. data/lib/azure/blob/block.rb +30 -30
  19. data/lib/azure/blob/container.rb +31 -31
  20. data/lib/azure/blob/serialization.rb +284 -284
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -31
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +134 -125
  23. data/lib/azure/cloud_service_management/serialization.rb +101 -63
  24. data/lib/azure/core.rb +39 -36
  25. data/lib/azure/core/auth/authorizer.rb +36 -36
  26. data/lib/azure/core/auth/shared_key.rb +110 -110
  27. data/lib/azure/core/auth/shared_key_lite.rb +48 -48
  28. data/lib/azure/core/auth/signer.rb +48 -48
  29. data/lib/azure/core/configuration.rb +211 -184
  30. data/lib/azure/core/error.rb +22 -22
  31. data/lib/azure/core/filtered_service.rb +43 -43
  32. data/lib/azure/core/http/debug_filter.rb +35 -35
  33. data/lib/azure/core/http/http_error.rb +88 -88
  34. data/lib/azure/core/http/http_filter.rb +52 -52
  35. data/lib/azure/core/http/http_request.rb +157 -157
  36. data/lib/azure/core/http/http_response.rb +140 -140
  37. data/lib/azure/core/http/retry_policy.rb +73 -73
  38. data/lib/azure/core/http/signer_filter.rb +33 -33
  39. data/lib/azure/core/service.rb +62 -62
  40. data/lib/azure/core/signed_service.rb +42 -42
  41. data/lib/azure/core/utility.rb +190 -190
  42. data/lib/azure/queue/message.rb +29 -29
  43. data/lib/azure/queue/queue.rb +28 -28
  44. data/lib/azure/queue/queue_service.rb +567 -567
  45. data/lib/azure/queue/serialization.rb +106 -106
  46. data/lib/azure/service/access_policy.rb +25 -25
  47. data/lib/azure/service/enumeration_results.rb +20 -20
  48. data/lib/azure/service/logging.rb +31 -31
  49. data/lib/azure/service/metrics.rb +30 -30
  50. data/lib/azure/service/retention_policy.rb +24 -24
  51. data/lib/azure/service/serialization.rb +239 -239
  52. data/lib/azure/service/signed_identifier.rb +29 -29
  53. data/lib/azure/service/storage_service.rb +78 -78
  54. data/lib/azure/service/storage_service_properties.rb +31 -31
  55. data/lib/azure/service_bus/action.rb +21 -21
  56. data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
  57. data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
  58. data/lib/azure/service_bus/brokered_message.rb +123 -123
  59. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
  60. data/lib/azure/service_bus/correlation_filter.rb +45 -45
  61. data/lib/azure/service_bus/empty_rule_action.rb +29 -29
  62. data/lib/azure/service_bus/false_filter.rb +38 -38
  63. data/lib/azure/service_bus/filter.rb +21 -21
  64. data/lib/azure/service_bus/interval.rb +103 -103
  65. data/lib/azure/service_bus/queue.rb +229 -229
  66. data/lib/azure/service_bus/resource.rb +108 -108
  67. data/lib/azure/service_bus/rule.rb +97 -97
  68. data/lib/azure/service_bus/rule_aspect.rb +34 -34
  69. data/lib/azure/service_bus/serialization.rb +160 -160
  70. data/lib/azure/service_bus/service_bus_service.rb +828 -828
  71. data/lib/azure/service_bus/sql_filter.rb +50 -50
  72. data/lib/azure/service_bus/sql_rule_action.rb +50 -50
  73. data/lib/azure/service_bus/subscription.rb +183 -183
  74. data/lib/azure/service_bus/topic.rb +186 -186
  75. data/lib/azure/service_bus/true_filter.rb +38 -38
  76. data/lib/azure/sql_database_management/serialization.rb +111 -90
  77. data/lib/azure/sql_database_management/sql_database.rb +31 -31
  78. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -202
  79. data/lib/azure/storage_management/serialization.rb +190 -50
  80. data/lib/azure/storage_management/storage_account.rb +40 -29
  81. data/lib/azure/storage_management/storage_management_service.rb +166 -99
  82. data/lib/azure/table/auth/shared_key.rb +92 -92
  83. data/lib/azure/table/auth/shared_key_lite.rb +44 -44
  84. data/lib/azure/table/batch.rb +329 -329
  85. data/lib/azure/table/batch_response.rb +118 -118
  86. data/lib/azure/table/edmtype.rb +126 -126
  87. data/lib/azure/table/entity.rb +30 -30
  88. data/lib/azure/table/guid.rb +23 -23
  89. data/lib/azure/table/query.rb +111 -111
  90. data/lib/azure/table/serialization.rb +107 -107
  91. data/lib/azure/table/table_service.rb +559 -559
  92. data/lib/azure/version.rb +30 -30
  93. data/lib/azure/virtual_machine_image_management/serialization.rb +49 -49
  94. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +27 -27
  95. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +27 -27
  96. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -66
  97. data/lib/azure/virtual_machine_management/serialization.rb +257 -247
  98. data/lib/azure/virtual_machine_management/virtual_machine.rb +41 -57
  99. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +317 -304
  100. data/lib/azure/virtual_network_management/serialization.rb +186 -186
  101. data/lib/azure/virtual_network_management/virtual_network.rb +36 -36
  102. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
  103. data/test/fixtures/affinity_group.xml +33 -33
  104. data/test/fixtures/all_containers.xml +20 -20
  105. data/test/fixtures/all_tables.xml +22 -22
  106. data/test/fixtures/certificate.pem +21 -21
  107. data/test/fixtures/container_acl.xml +11 -11
  108. data/test/fixtures/create_sql_database_server.xml +1 -1
  109. data/test/fixtures/create_storage_desc_error.xml +5 -0
  110. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  111. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  112. data/test/fixtures/create_storage_full_error.xml +6 -0
  113. data/test/fixtures/create_storage_label_error.xml +5 -0
  114. data/test/fixtures/create_storage_location_error.xml +5 -0
  115. data/test/fixtures/create_storage_name_error.xml +6 -0
  116. data/test/fixtures/create_table_response_entry.xml +15 -15
  117. data/test/fixtures/delete_storage_container_error.xml +5 -0
  118. data/test/fixtures/delete_storage_error.xml +5 -0
  119. data/test/fixtures/deployment_error.xml +5 -5
  120. data/test/fixtures/get_storage_account_error.xml +5 -0
  121. data/test/fixtures/get_storage_account_properties.xml +32 -0
  122. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  123. data/test/fixtures/http_error.xml +5 -5
  124. data/test/fixtures/insert_entity_response_entry.xml +25 -25
  125. data/test/fixtures/list_affinity_groups.xml +22 -22
  126. data/test/fixtures/list_blobs.xml +120 -120
  127. data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
  128. data/test/fixtures/list_blocks_all.xml +22 -22
  129. data/test/fixtures/list_blocks_committed.xml +12 -12
  130. data/test/fixtures/list_cloud_services.xml +38 -28
  131. data/test/fixtures/list_containers.xml +37 -37
  132. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  133. data/test/fixtures/list_images.xml +110 -110
  134. data/test/fixtures/list_locations.xml +62 -62
  135. data/test/fixtures/list_page_ranges.xml +10 -10
  136. data/test/fixtures/list_sql_database.xml +36 -36
  137. data/test/fixtures/list_sql_server_firewall.xml +23 -23
  138. data/test/fixtures/list_storage_accounts.xml +45 -45
  139. data/test/fixtures/list_virtual_networks.xml +92 -92
  140. data/test/fixtures/logging.xml +11 -11
  141. data/test/fixtures/management_certificate.pem +55 -55
  142. data/test/fixtures/messages.xml +12 -12
  143. data/test/fixtures/metrics.xml +10 -10
  144. data/test/fixtures/privatekey.key +28 -28
  145. data/test/fixtures/query_entities_empty_response.xml +7 -7
  146. data/test/fixtures/query_entities_response.xml +45 -45
  147. data/test/fixtures/queue_service_properties.xml +22 -22
  148. data/test/fixtures/queue_service_properties_original.xml +19 -19
  149. data/test/fixtures/queues.xml +16 -16
  150. data/test/fixtures/retention_policy.xml +5 -5
  151. data/test/fixtures/sb_default_create_queue_response.xml +23 -23
  152. data/test/fixtures/sb_default_create_topic_response.xml +18 -18
  153. data/test/fixtures/sb_get_access_token_response.txt +1 -1
  154. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
  155. data/test/fixtures/storage_service_properties.xml +23 -23
  156. data/test/fixtures/update_storage_account.xml +16 -0
  157. data/test/fixtures/update_storage_error.xml +5 -0
  158. data/test/fixtures/updated_storage_accounts.xml +53 -0
  159. data/test/fixtures/virtual_machine.xml +108 -107
  160. data/test/fixtures/windows_virtual_machine.xml +106 -106
  161. data/test/integration/affinity_group/Affinity_test.rb +55 -55
  162. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
  163. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
  164. data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
  165. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
  166. data/test/integration/blob/blob_gb18030_test.rb +199 -199
  167. data/test/integration/blob/blob_metadata_test.rb +75 -75
  168. data/test/integration/blob/blob_pages_test.rb +119 -119
  169. data/test/integration/blob/blob_properties_test.rb +77 -77
  170. data/test/integration/blob/block_blob_test.rb +254 -254
  171. data/test/integration/blob/container/container_acl_test.rb +69 -69
  172. data/test/integration/blob/container/container_metadata_test.rb +50 -50
  173. data/test/integration/blob/container/create_container_test.rb +60 -60
  174. data/test/integration/blob/container/delete_container_test.rb +39 -39
  175. data/test/integration/blob/container/get_container_properties_test.rb +48 -48
  176. data/test/integration/blob/container/list_containers_test.rb +79 -79
  177. data/test/integration/blob/container/root_container_test.rb +53 -53
  178. data/test/integration/blob/copy_blob_test.rb +113 -113
  179. data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
  180. data/test/integration/blob/create_page_blob_test.rb +83 -83
  181. data/test/integration/blob/delete_blob_test.rb +159 -159
  182. data/test/integration/blob/get_blob_test.rb +65 -65
  183. data/test/integration/blob/informative_errors_test.rb +38 -38
  184. data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
  185. data/test/integration/blob/lease/break_lease_test.rb +40 -40
  186. data/test/integration/blob/lease/release_lease_test.rb +40 -40
  187. data/test/integration/blob/lease/renew_lease_test.rb +42 -42
  188. data/test/integration/blob/list_blobs_test.rb +113 -113
  189. data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
  190. data/test/integration/database/create_sql_server_test.rb +53 -57
  191. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -72
  192. data/test/integration/database/delete_sql_server_test.rb +58 -63
  193. data/test/integration/database/list_sql_server_firewall_test.rb +45 -46
  194. data/test/integration/database/list_sql_servers_test.rb +44 -45
  195. data/test/integration/database/reset_password_sql_server_test.rb +55 -56
  196. data/test/integration/location/Location_List_test.rb +39 -39
  197. data/test/integration/queue/clear_messages_test.rb +42 -42
  198. data/test/integration/queue/create_message_test.rb +75 -75
  199. data/test/integration/queue/create_queue_test.rb +50 -50
  200. data/test/integration/queue/delete_message_test.rb +67 -67
  201. data/test/integration/queue/delete_queue_test.rb +45 -45
  202. data/test/integration/queue/informative_errors_test.rb +41 -41
  203. data/test/integration/queue/list_messages_encoded_test.rb +79 -79
  204. data/test/integration/queue/list_messages_test.rb +79 -79
  205. data/test/integration/queue/list_queues_test.rb +44 -44
  206. data/test/integration/queue/peek_messages_test.rb +59 -59
  207. data/test/integration/queue/queue_gb18030_test.rb +131 -131
  208. data/test/integration/queue/queue_metadata_test.rb +40 -40
  209. data/test/integration/queue/update_message_test.rb +74 -74
  210. data/test/integration/service_bus/informative_errors_test.rb +36 -36
  211. data/test/integration/service_bus/queues_scenario_test.rb +200 -200
  212. data/test/integration/service_bus/queues_test.rb +265 -265
  213. data/test/integration/service_bus/rules_test.rb +144 -144
  214. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
  215. data/test/integration/service_bus/scenario_test.rb +101 -101
  216. data/test/integration/service_bus/subscriptions_test.rb +211 -211
  217. data/test/integration/service_bus/topics_scenario_test.rb +406 -406
  218. data/test/integration/service_bus/topics_test.rb +129 -129
  219. data/test/integration/storage_management/storage_management_test.rb +160 -0
  220. data/test/integration/table/create_table_test.rb +35 -35
  221. data/test/integration/table/delete_entity_batch_test.rb +106 -106
  222. data/test/integration/table/delete_entity_test.rb +93 -93
  223. data/test/integration/table/delete_table_test.rb +39 -39
  224. data/test/integration/table/get_table_test.rb +36 -36
  225. data/test/integration/table/informative_errors_test.rb +38 -38
  226. data/test/integration/table/insert_entity_batch_test.rb +99 -99
  227. data/test/integration/table/insert_entity_test.rb +87 -87
  228. data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
  229. data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
  230. data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
  231. data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
  232. data/test/integration/table/merge_entity_batch_test.rb +127 -127
  233. data/test/integration/table/merge_entity_test.rb +112 -112
  234. data/test/integration/table/query_entities_test.rb +194 -194
  235. data/test/integration/table/query_tables_test.rb +42 -42
  236. data/test/integration/table/query_test.rb +250 -250
  237. data/test/integration/table/table_acl_test.rb +51 -51
  238. data/test/integration/table/table_gb18030_test.rb +355 -355
  239. data/test/integration/table/update_entity_batch_test.rb +148 -148
  240. data/test/integration/table/update_entity_test.rb +130 -130
  241. data/test/integration/test_helper.rb +42 -44
  242. data/test/integration/vm/VM_Create_test.rb +213 -235
  243. data/test/integration/vm/VM_Delete_test.rb +55 -55
  244. data/test/integration/vm/VM_List_test.rb +71 -71
  245. data/test/integration/vm/VM_ShutDown_test.rb +59 -59
  246. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
  247. data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
  248. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
  249. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
  250. data/test/support/env.rb +19 -19
  251. data/test/support/fixtures.rb +36 -36
  252. data/test/support/name_generator.rb +160 -160
  253. data/test/support/stubs.rb +42 -42
  254. data/test/support/virtual_machine_name_generator.rb +117 -127
  255. data/test/support/virtual_network_helper.rb +73 -73
  256. data/test/test_helper.rb +52 -52
  257. data/test/unit/affinity_group/affinity_group_test.rb +192 -192
  258. data/test/unit/affinity_group/serialization_test.rb +88 -88
  259. data/test/unit/base_management/location_test.rb +57 -57
  260. data/test/unit/blob/blob_service_test.rb +1946 -1946
  261. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
  262. data/test/unit/cloud_service_management/serialization_test.rb +169 -76
  263. data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
  264. data/test/unit/core/auth/shared_key_test.rb +58 -58
  265. data/test/unit/core/auth/signer_test.rb +30 -30
  266. data/test/unit/core/http/http_error_test.rb +57 -57
  267. data/test/unit/core/http/http_request_test.rb +66 -66
  268. data/test/unit/core/http/http_response_test.rb +45 -45
  269. data/test/unit/core/http/retry_policy_test.rb +23 -23
  270. data/test/unit/database/serialization_test.rb +97 -95
  271. data/test/unit/database/sql_database_server_service_test.rb +288 -152
  272. data/test/unit/service/serialization_test.rb +501 -501
  273. data/test/unit/service/storage_service_test.rb +290 -290
  274. data/test/unit/storage_management/serialization_test.rb +232 -65
  275. data/test/unit/storage_management/storage_management_service_test.rb +233 -94
  276. data/test/unit/table/edmtype_test.rb +107 -107
  277. data/test/unit/virtual_machine_image_management/serialization_test.rb +34 -34
  278. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +60 -60
  279. data/test/unit/virtual_machine_management/serialization_test.rb +119 -116
  280. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +383 -386
  281. data/test/unit/vnet/serialization_test.rb +187 -187
  282. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
  283. metadata +55 -23
@@ -1,57 +1,41 @@
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
-
20
- def initialize
21
- yield self if block_given?
22
- end
23
-
24
- attr_accessor :cloud_service_name
25
- attr_accessor :status
26
- attr_accessor :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 :storage_account_name
35
- attr_accessor :password
36
- attr_accessor :vm_user
37
- attr_accessor :image
38
- attr_accessor :os_type
39
- attr_accessor :disk_name
40
- attr_accessor :virtual_network_name
41
- attr_accessor :virtual_network
42
-
43
- def cloud_service_name
44
- @cloud_service_name ||= (random_string(@vm_name+'-service-') if @vm_name)
45
- end
46
-
47
- def storage_account_name
48
- @storage_account_name ||= (random_string(@vm_name+'storage').gsub(/[^0-9a-z ]/i, '').downcase[0..23] if @vm_name)
49
- end
50
-
51
- def deployment_name
52
- @deployment_name ||= @cloud_service_name
53
- end
54
-
55
- end
56
- end
57
- end
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 :vm_user
34
+ attr_accessor :image
35
+ attr_accessor :os_type
36
+ attr_accessor :disk_name
37
+ attr_accessor :virtual_network_name
38
+ attr_accessor :availability_set_name
39
+ end
40
+ end
41
+ end
@@ -1,304 +1,317 @@
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
-
22
- def initialize
23
- super()
24
- end
25
-
26
- # Public: Get a lists of virtual machines available under the current subscription.
27
- #
28
- # Returns an list of Azure::VirtualMachineManagement::VirtualMachine instances.
29
- def list_virtual_machines
30
- roles = []
31
- cloud_service = Azure::CloudServiceManagementService.new
32
- cloud_services = cloud_service.list_cloud_services
33
- cloud_services.each do |cloud_service|
34
- request_path = "/services/hostedservices/#{cloud_service.name}/deploymentslots/production"
35
- request = ManagementHttpRequest.new(: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
-
41
- vnet_service = Azure::VirtualNetworkManagementService.new
42
- virtual_networks = vnet_service.list_virtual_networks
43
-
44
- roles.each do |role|
45
- next if role.nil?
46
- vnet = virtual_networks.select do |network|
47
- network.name == role.virtual_network_name
48
- end
49
-
50
- role.virtual_network = vnet.first unless vnet.nil? || vnet.empty?
51
- end
52
-
53
- roles.compact
54
- end
55
-
56
- # Public: Gets a virtual machine based on the provided name and cloud service name.
57
- #
58
- # ==== Attributes
59
- #
60
- # * +name+ - String. Virtual machine name.
61
- # * +cloud_service_name+ - String. Cloud service name.
62
- #
63
- # Returns an Azure::VirtualMachineManagement::VirtualMachine instance.
64
- def get_virtual_machine(name, cloud_service_name)
65
- server = list_virtual_machines.select {|x| x.vm_name == name && x.cloud_service_name == cloud_service_name}
66
- server.first
67
- end
68
-
69
- # Public: Provisions a virtual machine based on the supplied configuration.
70
- #
71
- # ==== Attributes
72
- #
73
- # * +params+ - Hash. parameters.
74
- # * +Options+ - Hash. Optional parameters.
75
- #
76
- # ==== Params
77
- #
78
- # Accepted key/value pairs are:
79
- # * +:vm_name+ - String. Name of virtual machine.
80
- # * +:vm_user+ - String. User name for the virtual machine instance.
81
- # * +:password+ - String. A description for the hosted service.
82
- # * +:image+ - String. Name of the disk image to use to create the virtual machine.
83
- # * +:location+ - String. The location where the virtual machine will be created.
84
- #
85
- # ==== Options
86
- #
87
- # Accepted key/value pairs are:
88
- # * +:storage_account_name+ - String. Name of storage account.
89
- # * +:cloud_service_name+ - String. Name of cloud service.
90
- # * +:deployment_name+ - String. A name for the deployment.
91
- # * +:tcp_endpoints+ - String. Specifies the internal port and external/public port separated by a colon.
92
- # You can map multiple internal and external ports by separating them with a comma.
93
- # * +:ssh_private_key_file+ - String. Path of private key file.
94
- # * +:ssh_certificate_file+ - String. Path of certificate file.
95
- # * +:ssh_port+ - Integer. Specifies the SSH port number.
96
- # * +:vm_size+ - String. Specifies the size of the virtual machine instance.
97
- # * +:winrm_transport+ - Array. Specifies WINRM transport protocol.
98
- #
99
- # Returns Azure::VirtualMachineManagement::VirtualMachine objects of newly created instance.
100
- def create_virtual_machine(params, options={})
101
- options[:os_type] = get_os_type(params[:image])
102
- validate_deployment_params(params, options)
103
- options[:cloud_service_name] = generate_cloud_service_name(params[:vm_name]) unless options[:cloud_service_name]
104
- options[:storage_account_name] = generate_storage_account_name(params[:vm_name]) unless options[:storage_account_name]
105
- optionals = {}
106
- if options[:virtual_network_name]
107
- virtual_network_service = Azure::VirtualNetworkManagementService.new
108
- virtual_networks = virtual_network_service.list_virtual_networks.select{|x| x.name == options[:virtual_network_name]}
109
- if virtual_networks.empty?
110
- Loggerx.error_with_exit "Virtual network #{options[:virtual_network_name]} doesn't exists"
111
- else
112
- optionals[:affinity_group_name] = virtual_networks.first.affinity_group
113
- end
114
- elsif options[:affinity_group_name]
115
- optionals[:affinity_group_name] = options[:affinity_group_name]
116
- else
117
- optionals[:location] = params[:location]
118
- end
119
- cloud_service = Azure::CloudServiceManagementService.new
120
- cloud_service.create_cloud_service(options[:cloud_service_name], optionals)
121
- cloud_service.upload_certificate(options[:cloud_service_name],params[:certificate]) unless params[:certificate].empty?
122
- Azure::StorageManagementService.new.create_storage_account(options[:storage_account_name], optionals)
123
-
124
- body = Serialization.deployment_to_xml(params,options)
125
- path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
126
- Loggerx.info "Deployment in progress..."
127
- request = ManagementHttpRequest.new(:post, path, body)
128
- request.call
129
- get_virtual_machine(params[:vm_name],options[:cloud_service_name])
130
- rescue Exception => e
131
- e.message
132
- end
133
-
134
- # Public: Deletes the deployment, cloud service and disk.
135
- #
136
- # ==== Attributes
137
- #
138
- # * +vm_name+ - String. Virtual machine name.
139
- # * +cloud_service_name+ - String. Cloud service name.
140
- #
141
- # See http://msdn.microsoft.com/en-us/library/windowsazure/gg441305.aspx
142
- # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157179.aspx
143
- #
144
- # Returns NONE
145
- def delete_virtual_machine(vm_name, cloud_service_name)
146
- vm = get_virtual_machine(vm_name,cloud_service_name)
147
- if vm
148
- cloud_service = Azure::CloudServiceManagementService.new
149
- cloud_service.delete_cloud_service_deployment(cloud_service_name)
150
- cloud_service.delete_cloud_service(cloud_service_name)
151
- Loggerx.info "Waiting for disk to be released.\n"
152
- sleep 60
153
- disk_management_service = VirtualMachineDiskManagementService.new
154
- disk_management_service.delete_virtual_machine_disk(vm.disk_name)
155
- else
156
- Loggerx.error "Cannot find virtual machine #{vm_name} under cloud service #{cloud_service_name}"
157
- end
158
- rescue
159
- end
160
-
161
- # Public: Shuts down the specified virtual machine.
162
- #
163
- # ==== Attributes
164
- #
165
- # * +name+ - String. Virtual machine name.
166
- # * +cloud_service_name+ - String. Cloud service name.
167
- #
168
- # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157195.aspx
169
- #
170
- # Returns NONE
171
- def shutdown_virtual_machine(vm_name, cloud_service_name)
172
- vm = get_virtual_machine(vm_name, cloud_service_name)
173
- if vm
174
- if ['StoppedVM','StoppedDeallocated'].include?(vm.status)
175
- Loggerx.error "Cannot perform the shutdown operation on a stopped virtual machine."
176
- elsif vm.deployment_status == 'Running'
177
- path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
178
- body = Serialization.shutdown_virtual_machine_to_xml
179
- Loggerx.info "Shutting down virtual machine \"#{vm.vm_name}\" ..."
180
- request = ManagementHttpRequest.new(:post, path, body)
181
- request.call
182
- else
183
- Loggerx.error "Cannot perform the shutdown operation on a stopped deployment."
184
- end
185
- else
186
- Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\". "
187
- end
188
- end
189
-
190
- # Public: Starts the specified virtual machine.
191
- #
192
- # ==== Attributes
193
- #
194
- # * +name+ - String. Virtual machine name.
195
- # * +cloud_service_name+ - String. Cloud service name.
196
- #
197
- # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157189.aspx
198
- #
199
- # Returns NONE
200
- def start_virtual_machine(vm_name, cloud_service_name)
201
- vm = get_virtual_machine(vm_name, cloud_service_name)
202
- if vm
203
- if vm.status == 'ReadyRole'
204
- Loggerx.error "Cannot perform the start operation on started virtual machine."
205
- else
206
- path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
207
- body = Serialization.start_virtual_machine_to_xml
208
- Loggerx.info "Starting virtual machine \"#{vm.vm_name}\" ..."
209
- request = ManagementHttpRequest.new(:post, path, body)
210
- request.call
211
- end
212
- else
213
- Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
214
- end
215
- end
216
-
217
- private
218
-
219
- # Private: Gets the operating system type of an image.
220
- #
221
- # Returns Linux or Windows
222
- def get_os_type(image_name)
223
- image_service = Azure::VirtualMachineImageManagementService.new
224
- image = image_service.list_virtual_machine_images.select{|x| x.name == image_name}.first
225
- Loggerx.error_with_exit "The virtual machine image source is not valid." unless image
226
- image.os_type
227
- end
228
-
229
- def generate_cloud_service_name(vm_name)
230
- random_string(vm_name+'-service-')
231
- end
232
-
233
- def generate_storage_account_name(vm_name)
234
- random_string(vm_name+'storage').gsub(/[^0-9a-z ]/i, '').downcase[0..23]
235
- end
236
-
237
- def validate_deployment_params(params, options)
238
- errors = []
239
- params_keys = ["vm_name", "image", "location", "vm_user"]
240
- if options[:os_type] == "Windows"
241
- params_keys += ["password"]
242
- end
243
- options_keys = []
244
- options_keys = ['private_key_file','certificate_file'] if certificate_required?(params, options)
245
-
246
- params_keys.each do |key|
247
- errors << key if params[key.to_sym].nil?
248
- end
249
-
250
- options_keys.each do |key|
251
- errors << key if options[key.to_sym].nil?
252
- end
253
- validate_role_size(options[:vm_size])
254
- validate_location(params[:location]) unless errors.include?("location")
255
- if errors.empty?
256
- params[:certificate]={}
257
- if certificate_required?(params, options)
258
- begin
259
- params[:certificate][:key] = OpenSSL::PKey.read File.read(options[:private_key_file])
260
- params[:certificate][:cert] = OpenSSL::X509::Certificate.new File.read(options[:certificate_file])
261
- params[:certificate][:fingerprint] = export_fingerprint(params[:certificate][:cert])
262
- rescue Exception =>e
263
- Loggerx.error_with_exit e.message
264
- end
265
- end
266
- else
267
- Loggerx.error_with_exit "You did not provide a valid '#{errors.uniq.join(", ")}' value."
268
- end
269
- end
270
-
271
- def certificate_required?(params, options)
272
- if options[:os_type] == 'Linux'
273
- (params[:password].nil? or (!options[:certificate_file].nil? && !options[:private_key_file].nil?))
274
- else
275
- winrm_with_https(options)
276
- end
277
- end
278
-
279
- def winrm_with_https(options)
280
- if options[:os_type] == 'Windows'
281
- options[:winrm_transport] && options[:winrm_transport].include?('https') && options[:certificate_file] && options[:private_key_file]
282
- end
283
- end
284
-
285
- def validate_role_size(vm_size)
286
- valid_role_sizes = ['ExtraSmall', 'Small', 'Medium', 'Large', 'ExtraLarge', 'A6', 'A7']
287
- if vm_size && !valid_role_sizes.include?(vm_size)
288
- Loggerx.error_with_exit "Value '#{vm_size}' specified for parameter 'vm_size' is invalid. Allowed values are 'ExtraSmall,Small,Medium,Large,ExtraLarge,A6,A7'"
289
- end
290
- end
291
-
292
- def validate_location(location_name)
293
- locations = Azure::BaseManagementService.new.list_locations
294
- location = locations.select{|loc| loc.name.downcase == location_name.downcase}.first
295
- if location.nil?
296
- Loggerx.error_with_exit "Value '#{location_name}' specified for parameter 'location' is invalid. Allowed values are #{locations.collect(&:name).join(',')}"
297
- elsif !location.available_services.include?("PersistentVMRole")
298
- Loggerx.error_with_exit "Persistentvmrole not enabled for \"#{location.name}\". Try different location"
299
- end
300
- end
301
-
302
- end
303
- end
304
- end
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
+
22
+ def initialize
23
+ super()
24
+ end
25
+
26
+ # Public: Get a lists of virtual machines available under the current subscription.
27
+ #
28
+ # Returns an list of Azure::VirtualMachineManagement::VirtualMachine instances.
29
+ def list_virtual_machines
30
+ roles = []
31
+ cloud_service = Azure::CloudServiceManagementService.new
32
+ cloud_services = cloud_service.list_cloud_services
33
+ cloud_services.each do |cloud_service|
34
+ request_path = "/services/hostedservices/#{cloud_service.name}/deploymentslots/production"
35
+ request = ManagementHttpRequest.new(: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.select {|x| x.vm_name == name && x.cloud_service_name == cloud_service_name}
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
+ # * +add_role+ - true/false. Optional Parameter. Default is false
63
+ #
64
+ # ==== Params
65
+ #
66
+ # Accepted key/value pairs are:
67
+ # * +:vm_name+ - String. Name of virtual machine.
68
+ # * +:vm_user+ - String. User name for the virtual machine instance.
69
+ # * +:password+ - String. A description for the hosted service.
70
+ # * +:image+ - String. Name of the disk image to use to create the virtual machine.
71
+ # * +:location+ - String. The location where the virtual machine will be created.
72
+ # * +:affinity_group_name - String. The affinity group name to be used
73
+ # for the cloud service and the storage account if these do not exist.
74
+ #
75
+ # ==== Options
76
+ #
77
+ # Accepted key/value pairs are:
78
+ # * +:storage_account_name+ - String. Name of storage account.
79
+ # * +:cloud_service_name+ - String. Name of cloud service.
80
+ # * +:deployment_name+ - String. A name for the deployment.
81
+ # * +:tcp_endpoints+ - String. Specifies the internal port and external/public port separated by a colon.
82
+ # You can map multiple internal and external ports by separating them with a comma.
83
+ # * +:ssh_private_key_file+ - String. Path of private key file.
84
+ # * +:ssh_certificate_file+ - String. Path of certificate file.
85
+ # * +:ssh_port+ - Integer. Specifies the SSH 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
+ #
90
+ # ==== add_role
91
+ #
92
+ # Accepted values are:
93
+ # * +false+ - Will add a new deployment in a cloud service.
94
+ # * +true+ - Will add a new role to a cloud service. Atleast one
95
+ # deployment should exist before you can add a role.
96
+ #
97
+ # Returns Azure::VirtualMachineManagement::VirtualMachine objects of newly created instance.
98
+ #
99
+ # See:
100
+ # http://msdn.microsoft.com/en-us/library/windowsazure/jj157194.aspx
101
+ # http://msdn.microsoft.com/en-us/library/windowsazure/jj157186.aspx
102
+ def create_virtual_machine(params, options = {}, add_role = false)
103
+ options[:os_type] = get_os_type(params[:image])
104
+ validate_deployment_params(params, options)
105
+ options[:deployment_name] ||= options[:cloud_service_name]
106
+
107
+ unless add_role
108
+ Loggerx.info "Creating deploymnent..."
109
+ options[:cloud_service_name] ||= generate_cloud_service_name(params[:vm_name])
110
+ options[:storage_account_name] ||= generate_storage_account_name(params[:vm_name])
111
+ optionals = {}
112
+ if options[:virtual_network_name]
113
+ virtual_network_service = Azure::VirtualNetworkManagementService.new
114
+ virtual_networks = virtual_network_service.list_virtual_networks.select{|x| x.name == options[:virtual_network_name]}
115
+ if virtual_networks.empty?
116
+ Loggerx.error_with_exit "Virtual network #{options[:virtual_network_name]} doesn't exists"
117
+ else
118
+ optionals[:affinity_group_name] = virtual_networks.first.affinity_group
119
+ end
120
+ elsif options[:affinity_group_name]
121
+ optionals[:affinity_group_name] = options[:affinity_group_name]
122
+ else
123
+ optionals[:location] = params[:location]
124
+ end
125
+ cloud_service = Azure::CloudServiceManagementService.new
126
+ cloud_service.create_cloud_service(options[:cloud_service_name], optionals)
127
+ cloud_service.upload_certificate(options[:cloud_service_name],params[:certificate]) unless params[:certificate].empty?
128
+ Azure::StorageManagementService.new.create_storage_account(options[:storage_account_name], optionals)
129
+ body = Serialization.deployment_to_xml(params,options)
130
+ path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments"
131
+ else
132
+
133
+ Loggerx.info "Deployment exists, adding role..."
134
+ body = Serialization.role_to_xml(params, options).to_xml
135
+ path = "/services/hostedservices/#{options[:cloud_service_name]}/deployments/#{options[:deployment_name]}/roles"
136
+ end
137
+ Loggerx.error 'Cloud service name is required for adding role.' unless options[:cloud_service_name]
138
+ Loggerx.error 'Storage account name is required for adding role.' unless options[:storage_account_name]
139
+ Loggerx.info "Deployment in progress..."
140
+ request = ManagementHttpRequest.new(:post, path, body)
141
+ request.call
142
+ get_virtual_machine(params[:vm_name], options[:cloud_service_name])
143
+ rescue Exception => e
144
+ e.message
145
+ end
146
+
147
+ # Public: Deletes the deployment, cloud service and disk.
148
+ #
149
+ # ==== Attributes
150
+ #
151
+ # * +vm_name+ - String. Virtual machine name.
152
+ # * +cloud_service_name+ - String. Cloud service name.
153
+ #
154
+ # See http://msdn.microsoft.com/en-us/library/windowsazure/gg441305.aspx
155
+ # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157179.aspx
156
+ #
157
+ # Returns NONE
158
+ def delete_virtual_machine(vm_name, cloud_service_name)
159
+ vm = get_virtual_machine(vm_name,cloud_service_name)
160
+ if vm
161
+ cloud_service = Azure::CloudServiceManagementService.new
162
+ cloud_service.delete_cloud_service_deployment(cloud_service_name)
163
+ cloud_service.delete_cloud_service(cloud_service_name)
164
+ Loggerx.info "Waiting for disk to be released.\n"
165
+ sleep 60
166
+ disk_management_service = VirtualMachineDiskManagementService.new
167
+ disk_management_service.delete_virtual_machine_disk(vm.disk_name)
168
+ else
169
+ Loggerx.error "Cannot find virtual machine #{vm_name} under cloud service #{cloud_service_name}"
170
+ end
171
+ rescue
172
+ end
173
+
174
+ # Public: Shuts down the specified virtual machine.
175
+ #
176
+ # ==== Attributes
177
+ #
178
+ # * +name+ - String. Virtual machine name.
179
+ # * +cloud_service_name+ - String. Cloud service name.
180
+ #
181
+ # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157195.aspx
182
+ #
183
+ # Returns NONE
184
+ def shutdown_virtual_machine(vm_name, cloud_service_name)
185
+ vm = get_virtual_machine(vm_name, cloud_service_name)
186
+ if vm
187
+ if ['StoppedVM','StoppedDeallocated'].include?(vm.status)
188
+ Loggerx.error "Cannot perform the shutdown operation on a stopped virtual machine."
189
+ elsif vm.deployment_status == 'Running'
190
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
191
+ body = Serialization.shutdown_virtual_machine_to_xml
192
+ Loggerx.info "Shutting down virtual machine \"#{vm.vm_name}\" ..."
193
+ request = ManagementHttpRequest.new(:post, path, body)
194
+ request.call
195
+ else
196
+ Loggerx.error "Cannot perform the shutdown operation on a stopped deployment."
197
+ end
198
+ else
199
+ Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\". "
200
+ end
201
+ end
202
+
203
+ # Public: Starts the specified virtual machine.
204
+ #
205
+ # ==== Attributes
206
+ #
207
+ # * +name+ - String. Virtual machine name.
208
+ # * +cloud_service_name+ - String. Cloud service name.
209
+ #
210
+ # See http://msdn.microsoft.com/en-us/library/windowsazure/jj157189.aspx
211
+ #
212
+ # Returns NONE
213
+ def start_virtual_machine(vm_name, cloud_service_name)
214
+ vm = get_virtual_machine(vm_name, cloud_service_name)
215
+ if vm
216
+ if vm.status == 'ReadyRole'
217
+ Loggerx.error "Cannot perform the start operation on started virtual machine."
218
+ else
219
+ path = "/services/hostedservices/#{vm.cloud_service_name}/deployments/#{vm.deployment_name}/roleinstances/#{vm.vm_name}/Operations"
220
+ body = Serialization.start_virtual_machine_to_xml
221
+ Loggerx.info "Starting virtual machine \"#{vm.vm_name}\" ..."
222
+ request = ManagementHttpRequest.new(:post, path, body)
223
+ request.call
224
+ end
225
+ else
226
+ Loggerx.error "Cannot find virtual machine \"#{vm_name}\" under cloud service \"#{cloud_service_name}\"."
227
+ end
228
+ end
229
+
230
+ private
231
+
232
+ # Private: Gets the operating system type of an image.
233
+ #
234
+ # Returns Linux or Windows
235
+ def get_os_type(image_name)
236
+ image_service = Azure::VirtualMachineImageManagementService.new
237
+ image = image_service.list_virtual_machine_images.select{|x| x.name == image_name}.first
238
+ Loggerx.error_with_exit "The virtual machine image source is not valid." unless image
239
+ image.os_type
240
+ end
241
+
242
+ def generate_cloud_service_name(vm_name)
243
+ random_string(vm_name+'-service-')
244
+ end
245
+
246
+ def generate_storage_account_name(vm_name)
247
+ random_string(vm_name+'storage').gsub(/[^0-9a-z ]/i, '').downcase[0..23]
248
+ end
249
+
250
+ def validate_deployment_params(params, options)
251
+ errors = []
252
+ params_keys = ["vm_name", "image", "location", "vm_user"]
253
+ if options[:os_type] == "Windows"
254
+ params_keys += ["password"]
255
+ end
256
+ options_keys = []
257
+ options_keys = ['private_key_file','certificate_file'] if certificate_required?(params, options)
258
+
259
+ params_keys.each do |key|
260
+ errors << key if params[key.to_sym].nil?
261
+ end
262
+
263
+ options_keys.each do |key|
264
+ errors << key if options[key.to_sym].nil?
265
+ end
266
+ validate_role_size(options[:vm_size])
267
+ validate_location(params[:location]) unless errors.include?("location")
268
+ if errors.empty?
269
+ params[:certificate]={}
270
+ if certificate_required?(params, options)
271
+ begin
272
+ params[:certificate][:key] = OpenSSL::PKey.read File.read(options[:private_key_file])
273
+ params[:certificate][:cert] = OpenSSL::X509::Certificate.new File.read(options[:certificate_file])
274
+ params[:certificate][:fingerprint] = export_fingerprint(params[:certificate][:cert])
275
+ rescue Exception =>e
276
+ Loggerx.error_with_exit e.message
277
+ end
278
+ end
279
+ else
280
+ Loggerx.error_with_exit "You did not provide a valid '#{errors.uniq.join(", ")}' value."
281
+ end
282
+ end
283
+
284
+ def certificate_required?(params, options)
285
+ if options[:os_type] == 'Linux'
286
+ (params[:password].nil? or (!options[:certificate_file].nil? && !options[:private_key_file].nil?))
287
+ else
288
+ winrm_with_https(options)
289
+ end
290
+ end
291
+
292
+ def winrm_with_https(options)
293
+ if options[:os_type] == 'Windows'
294
+ options[:winrm_transport] && options[:winrm_transport].include?('https') && options[:certificate_file] && options[:private_key_file]
295
+ end
296
+ end
297
+
298
+ def validate_role_size(vm_size)
299
+ valid_role_sizes = ['ExtraSmall', 'Small', 'Medium', 'Large', 'ExtraLarge', 'A6', 'A7']
300
+ if vm_size && !valid_role_sizes.include?(vm_size)
301
+ Loggerx.error_with_exit "Value '#{vm_size}' specified for parameter 'vm_size' is invalid. Allowed values are 'ExtraSmall,Small,Medium,Large,ExtraLarge,A6,A7'"
302
+ end
303
+ end
304
+
305
+ def validate_location(location_name)
306
+ locations = Azure::BaseManagementService.new.list_locations
307
+ location = locations.select{|loc| loc.name.downcase == location_name.downcase}.first
308
+ if location.nil?
309
+ Loggerx.error_with_exit "Value '#{location_name}' specified for parameter 'location' is invalid. Allowed values are #{locations.collect(&:name).join(',')}"
310
+ elsif !location.available_services.include?("PersistentVMRole")
311
+ Loggerx.error_with_exit "Persistentvmrole not enabled for \"#{location.name}\". Try different location"
312
+ end
313
+ end
314
+
315
+ end
316
+ end
317
+ end