azurex 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +11 -0
  4. data/ChangeLog.txt +40 -0
  5. data/Gemfile +16 -0
  6. data/README.md +606 -0
  7. data/Rakefile +125 -0
  8. data/azurex.gemspec +47 -0
  9. data/lib/azure.rb +52 -0
  10. data/lib/azure/base_management/affinity_group.rb +32 -0
  11. data/lib/azure/base_management/base_management_service.rb +238 -0
  12. data/lib/azure/base_management/location.rb +27 -0
  13. data/lib/azure/base_management/management_http_request.rb +244 -0
  14. data/lib/azure/base_management/serialization.rb +129 -0
  15. data/lib/azure/base_management/sql_management_http_request.rb +45 -0
  16. data/lib/azure/blob/blob.rb +32 -0
  17. data/lib/azure/blob/blob_service.rb +1424 -0
  18. data/lib/azure/blob/block.rb +31 -0
  19. data/lib/azure/blob/container.rb +32 -0
  20. data/lib/azure/blob/serialization.rb +285 -0
  21. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  22. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +361 -0
  23. data/lib/azure/cloud_service_management/configuration_set.rb +28 -0
  24. data/lib/azure/cloud_service_management/deployment.rb +64 -0
  25. data/lib/azure/cloud_service_management/input_endpoint.rb +29 -0
  26. data/lib/azure/cloud_service_management/instance_endpoint.rb +31 -0
  27. data/lib/azure/cloud_service_management/persistent_vm_downtime.rb +29 -0
  28. data/lib/azure/cloud_service_management/role.rb +30 -0
  29. data/lib/azure/cloud_service_management/role_instance.rb +40 -0
  30. data/lib/azure/cloud_service_management/serialization.rb +329 -0
  31. data/lib/azure/cloud_service_management/virtual_ip.rb +29 -0
  32. data/lib/azure/core.rb +39 -0
  33. data/lib/azure/core/auth/authorizer.rb +36 -0
  34. data/lib/azure/core/auth/shared_key.rb +110 -0
  35. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  36. data/lib/azure/core/auth/signer.rb +48 -0
  37. data/lib/azure/core/configuration.rb +211 -0
  38. data/lib/azure/core/error.rb +22 -0
  39. data/lib/azure/core/filtered_service.rb +44 -0
  40. data/lib/azure/core/http/debug_filter.rb +36 -0
  41. data/lib/azure/core/http/http_error.rb +88 -0
  42. data/lib/azure/core/http/http_filter.rb +53 -0
  43. data/lib/azure/core/http/http_request.rb +159 -0
  44. data/lib/azure/core/http/http_response.rb +140 -0
  45. data/lib/azure/core/http/retry_policy.rb +74 -0
  46. data/lib/azure/core/http/signer_filter.rb +34 -0
  47. data/lib/azure/core/service.rb +63 -0
  48. data/lib/azure/core/signed_service.rb +43 -0
  49. data/lib/azure/core/utility.rb +190 -0
  50. data/lib/azure/queue/message.rb +30 -0
  51. data/lib/azure/queue/queue.rb +29 -0
  52. data/lib/azure/queue/queue_service.rb +568 -0
  53. data/lib/azure/queue/serialization.rb +106 -0
  54. data/lib/azure/service/access_policy.rb +26 -0
  55. data/lib/azure/service/enumeration_results.rb +21 -0
  56. data/lib/azure/service/logging.rb +32 -0
  57. data/lib/azure/service/metrics.rb +31 -0
  58. data/lib/azure/service/retention_policy.rb +25 -0
  59. data/lib/azure/service/serialization.rb +240 -0
  60. data/lib/azure/service/signed_identifier.rb +30 -0
  61. data/lib/azure/service/storage_service.rb +79 -0
  62. data/lib/azure/service/storage_service_properties.rb +32 -0
  63. data/lib/azure/service_bus/action.rb +21 -0
  64. data/lib/azure/service_bus/auth/wrap_service.rb +89 -0
  65. data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
  66. data/lib/azure/service_bus/brokered_message.rb +124 -0
  67. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  68. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  69. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  70. data/lib/azure/service_bus/false_filter.rb +38 -0
  71. data/lib/azure/service_bus/filter.rb +21 -0
  72. data/lib/azure/service_bus/interval.rb +104 -0
  73. data/lib/azure/service_bus/queue.rb +230 -0
  74. data/lib/azure/service_bus/resource.rb +109 -0
  75. data/lib/azure/service_bus/rule.rb +98 -0
  76. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  77. data/lib/azure/service_bus/serialization.rb +160 -0
  78. data/lib/azure/service_bus/service_bus_service.rb +829 -0
  79. data/lib/azure/service_bus/sql_filter.rb +50 -0
  80. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  81. data/lib/azure/service_bus/subscription.rb +184 -0
  82. data/lib/azure/service_bus/topic.rb +187 -0
  83. data/lib/azure/service_bus/true_filter.rb +38 -0
  84. data/lib/azure/sql_database_management/serialization.rb +111 -0
  85. data/lib/azure/sql_database_management/sql_database.rb +31 -0
  86. data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -0
  87. data/lib/azure/storage_management/serialization.rb +206 -0
  88. data/lib/azure/storage_management/storage_account.rb +47 -0
  89. data/lib/azure/storage_management/storage_management_service.rb +211 -0
  90. data/lib/azure/table/auth/shared_key.rb +92 -0
  91. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  92. data/lib/azure/table/batch.rb +330 -0
  93. data/lib/azure/table/batch_response.rb +118 -0
  94. data/lib/azure/table/edmtype.rb +127 -0
  95. data/lib/azure/table/entity.rb +31 -0
  96. data/lib/azure/table/guid.rb +24 -0
  97. data/lib/azure/table/query.rb +112 -0
  98. data/lib/azure/table/serialization.rb +108 -0
  99. data/lib/azure/table/table_service.rb +560 -0
  100. data/lib/azure/version.rb +31 -0
  101. data/lib/azure/virtual_machine_image_management/serialization.rb +52 -0
  102. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  103. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  104. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -0
  105. data/lib/azure/virtual_machine_management/serialization.rb +450 -0
  106. data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -0
  107. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +562 -0
  108. data/lib/azure/virtual_network_management/serialization.rb +192 -0
  109. data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
  110. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -0
  111. data/test/fixtures/32px-fulls-black.jpg +0 -0
  112. data/test/fixtures/affinity_group.xml +33 -0
  113. data/test/fixtures/all_containers.xml +20 -0
  114. data/test/fixtures/all_tables.xml +22 -0
  115. data/test/fixtures/certificate.pem +21 -0
  116. data/test/fixtures/container_acl.xml +11 -0
  117. data/test/fixtures/create_sql_database_server.xml +2 -0
  118. data/test/fixtures/create_storage_desc_error.xml +5 -0
  119. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  120. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  121. data/test/fixtures/create_storage_full_error.xml +6 -0
  122. data/test/fixtures/create_storage_label_error.xml +5 -0
  123. data/test/fixtures/create_storage_location_error.xml +5 -0
  124. data/test/fixtures/create_storage_name_error.xml +6 -0
  125. data/test/fixtures/create_table_response_entry.xml +15 -0
  126. data/test/fixtures/delete_storage_container_error.xml +5 -0
  127. data/test/fixtures/delete_storage_error.xml +5 -0
  128. data/test/fixtures/deployment_error.xml +5 -0
  129. data/test/fixtures/empty_xml_file +0 -0
  130. data/test/fixtures/get_deployment.xml +94 -0
  131. data/test/fixtures/get_deployment_existing.xml +94 -0
  132. data/test/fixtures/get_deployment_missing.xml +5 -0
  133. data/test/fixtures/get_storage_account_error.xml +5 -0
  134. data/test/fixtures/get_storage_account_properties.xml +32 -0
  135. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  136. data/test/fixtures/http_error.xml +5 -0
  137. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  138. data/test/fixtures/list_affinity_groups.xml +22 -0
  139. data/test/fixtures/list_blobs.xml +121 -0
  140. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  141. data/test/fixtures/list_blocks_all.xml +23 -0
  142. data/test/fixtures/list_blocks_committed.xml +13 -0
  143. data/test/fixtures/list_cloud_services.xml +39 -0
  144. data/test/fixtures/list_containers.xml +38 -0
  145. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  146. data/test/fixtures/list_images.xml +110 -0
  147. data/test/fixtures/list_locations.xml +62 -0
  148. data/test/fixtures/list_page_ranges.xml +11 -0
  149. data/test/fixtures/list_sql_database.xml +36 -0
  150. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  151. data/test/fixtures/list_storage_account_single.xml +25 -0
  152. data/test/fixtures/list_storage_accounts.xml +46 -0
  153. data/test/fixtures/list_virtual_networks.xml +92 -0
  154. data/test/fixtures/logging.xml +11 -0
  155. data/test/fixtures/management_certificate.pem +55 -0
  156. data/test/fixtures/messages.xml +12 -0
  157. data/test/fixtures/metrics.xml +10 -0
  158. data/test/fixtures/privatekey.key +28 -0
  159. data/test/fixtures/query_entities_empty_response.xml +7 -0
  160. data/test/fixtures/query_entities_response.xml +45 -0
  161. data/test/fixtures/queue_service_properties.xml +22 -0
  162. data/test/fixtures/queue_service_properties_original.xml +19 -0
  163. data/test/fixtures/queues.xml +16 -0
  164. data/test/fixtures/retention_policy.xml +5 -0
  165. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  166. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  167. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  168. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  169. data/test/fixtures/storage_service_keys.xml +8 -0
  170. data/test/fixtures/storage_service_properties.xml +23 -0
  171. data/test/fixtures/update_storage_account.xml +16 -0
  172. data/test/fixtures/update_storage_error.xml +5 -0
  173. data/test/fixtures/updated_storage_accounts.xml +53 -0
  174. data/test/fixtures/virtual_machine.xml +115 -0
  175. data/test/fixtures/windows_virtual_machine.xml +106 -0
  176. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  177. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -0
  178. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  179. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  180. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -0
  181. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  182. data/test/integration/blob/blob_metadata_test.rb +75 -0
  183. data/test/integration/blob/blob_pages_test.rb +119 -0
  184. data/test/integration/blob/blob_properties_test.rb +77 -0
  185. data/test/integration/blob/block_blob_test.rb +254 -0
  186. data/test/integration/blob/container/container_acl_test.rb +69 -0
  187. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  188. data/test/integration/blob/container/create_container_test.rb +60 -0
  189. data/test/integration/blob/container/delete_container_test.rb +39 -0
  190. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  191. data/test/integration/blob/container/list_containers_test.rb +79 -0
  192. data/test/integration/blob/container/root_container_test.rb +54 -0
  193. data/test/integration/blob/copy_blob_test.rb +113 -0
  194. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  195. data/test/integration/blob/create_page_blob_test.rb +83 -0
  196. data/test/integration/blob/delete_blob_test.rb +159 -0
  197. data/test/integration/blob/get_blob_test.rb +65 -0
  198. data/test/integration/blob/informative_errors_test.rb +39 -0
  199. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  200. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  201. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  202. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  203. data/test/integration/blob/list_blobs_test.rb +113 -0
  204. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
  205. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
  206. data/test/integration/database/create_sql_server_firewall_test.rb +86 -0
  207. data/test/integration/database/create_sql_server_test.rb +53 -0
  208. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -0
  209. data/test/integration/database/delete_sql_server_test.rb +58 -0
  210. data/test/integration/database/list_sql_server_firewall_test.rb +45 -0
  211. data/test/integration/database/list_sql_servers_test.rb +44 -0
  212. data/test/integration/database/reset_password_sql_server_test.rb +55 -0
  213. data/test/integration/location/Location_List_test.rb +39 -0
  214. data/test/integration/queue/clear_messages_test.rb +42 -0
  215. data/test/integration/queue/create_message_test.rb +75 -0
  216. data/test/integration/queue/create_queue_test.rb +50 -0
  217. data/test/integration/queue/delete_message_test.rb +67 -0
  218. data/test/integration/queue/delete_queue_test.rb +45 -0
  219. data/test/integration/queue/informative_errors_test.rb +42 -0
  220. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  221. data/test/integration/queue/list_messages_test.rb +79 -0
  222. data/test/integration/queue/list_queues_test.rb +44 -0
  223. data/test/integration/queue/peek_messages_test.rb +59 -0
  224. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  225. data/test/integration/queue/queue_metadata_test.rb +40 -0
  226. data/test/integration/queue/update_message_test.rb +74 -0
  227. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  228. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  229. data/test/integration/service_bus/queues_test.rb +266 -0
  230. data/test/integration/service_bus/rules_test.rb +145 -0
  231. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  232. data/test/integration/service_bus/scenario_test.rb +101 -0
  233. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  234. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  235. data/test/integration/service_bus/topics_test.rb +129 -0
  236. data/test/integration/storage_management/storage_management_test.rb +177 -0
  237. data/test/integration/table/create_table_test.rb +36 -0
  238. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  239. data/test/integration/table/delete_entity_test.rb +94 -0
  240. data/test/integration/table/delete_table_test.rb +40 -0
  241. data/test/integration/table/get_table_test.rb +37 -0
  242. data/test/integration/table/informative_errors_test.rb +39 -0
  243. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  244. data/test/integration/table/insert_entity_test.rb +88 -0
  245. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  246. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  247. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  248. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  249. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  250. data/test/integration/table/merge_entity_test.rb +113 -0
  251. data/test/integration/table/query_entities_test.rb +195 -0
  252. data/test/integration/table/query_tables_test.rb +43 -0
  253. data/test/integration/table/query_test.rb +251 -0
  254. data/test/integration/table/table_acl_test.rb +52 -0
  255. data/test/integration/table/table_gb18030_test.rb +355 -0
  256. data/test/integration/table/update_entity_batch_test.rb +149 -0
  257. data/test/integration/table/update_entity_test.rb +131 -0
  258. data/test/integration/test_helper.rb +42 -0
  259. data/test/integration/vm/VM_Create_test.rb +260 -0
  260. data/test/integration/vm/VM_Delete_test.rb +53 -0
  261. data/test/integration/vm/VM_Operations_test.rb +172 -0
  262. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  263. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  264. data/test/integration/vnet/Virtual_Network_Create_test.rb +116 -0
  265. data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
  266. data/test/support/env.rb +19 -0
  267. data/test/support/fixtures.rb +36 -0
  268. data/test/support/name_generator.rb +160 -0
  269. data/test/support/stubs.rb +42 -0
  270. data/test/support/virtual_machine_name_generator.rb +102 -0
  271. data/test/support/virtual_network_helper.rb +73 -0
  272. data/test/test_helper.rb +53 -0
  273. data/test/unit/affinity_group/affinity_group_test.rb +192 -0
  274. data/test/unit/affinity_group/serialization_test.rb +88 -0
  275. data/test/unit/base_management/location_test.rb +57 -0
  276. data/test/unit/blob/blob_service_test.rb +1947 -0
  277. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +248 -0
  278. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  279. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  280. data/test/unit/core/auth/shared_key_test.rb +58 -0
  281. data/test/unit/core/auth/signer_test.rb +30 -0
  282. data/test/unit/core/http/http_error_test.rb +57 -0
  283. data/test/unit/core/http/http_request_test.rb +66 -0
  284. data/test/unit/core/http/http_response_test.rb +45 -0
  285. data/test/unit/core/http/retry_policy_test.rb +23 -0
  286. data/test/unit/database/serialization_test.rb +97 -0
  287. data/test/unit/database/sql_database_server_service_test.rb +288 -0
  288. data/test/unit/service/serialization_test.rb +502 -0
  289. data/test/unit/service/storage_service_test.rb +291 -0
  290. data/test/unit/storage_management/serialization_test.rb +245 -0
  291. data/test/unit/storage_management/storage_management_service_test.rb +261 -0
  292. data/test/unit/table/edmtype_test.rb +108 -0
  293. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -0
  294. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -0
  295. data/test/unit/virtual_machine_management/serialization_test.rb +256 -0
  296. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +442 -0
  297. data/test/unit/vnet/serialization_test.rb +187 -0
  298. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  299. metadata +471 -0
@@ -0,0 +1,256 @@
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 'test_helper'
16
+
17
+ describe Azure::VirtualMachineManagement::Serialization do
18
+ subject { Azure::VirtualMachineManagement::Serialization }
19
+
20
+ let(:vm_xml) { Nokogiri::XML(Fixtures['virtual_machine']) }
21
+ let(:csn) { 'cloud-service-1' }
22
+
23
+ describe '#virtual_machines_from_xml' do
24
+
25
+ it 'accepts an XML string' do
26
+ subject.virtual_machines_from_xml(vm_xml, csn)
27
+ end
28
+
29
+ it 'returns an Array of VirtualMachine instances' do
30
+ result = subject.virtual_machines_from_xml(vm_xml, csn).first
31
+ result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine
32
+ end
33
+
34
+ it "returns a virtual_machine, with it's attribute populated" do
35
+ virtual_machine = subject.virtual_machines_from_xml(vm_xml, csn).first
36
+ virtual_machine.vm_name.must_equal 'instance-name'
37
+ virtual_machine.role_size.must_equal 'Small'
38
+ virtual_machine.hostname.must_equal 'host-name'
39
+ virtual_machine.cloud_service_name.must_equal 'cloud-service-1'
40
+ virtual_machine.deployment_name.must_equal 'deployment-name'
41
+ virtual_machine.ipaddress.must_equal '137.116.17.187'
42
+ virtual_machine.private_ipaddress.must_equal '100.65.164.123'
43
+ virtual_machine.virtual_network_subnet_name.must_equal 'Test-Subnet'
44
+ virtual_machine.availability_set_name.must_equal 'vm-availability'
45
+ end
46
+
47
+ it "returns a virtual_machine, with it's tcp_endpoints attribute" do
48
+ virtual_machine = subject.virtual_machines_from_xml(vm_xml, csn).first
49
+ virtual_machine.tcp_endpoints.must_be_kind_of Array
50
+ virtual_machine.tcp_endpoints.must_include(
51
+ name: 'SSH',
52
+ vip: '137.116.17.187',
53
+ public_port: '22',
54
+ local_port: '22',
55
+ protocol: 'tcp'
56
+ )
57
+ virtual_machine.tcp_endpoints.must_include(
58
+ name: 'tcp-port-80',
59
+ vip: '137.117.17.187',
60
+ public_port: '80',
61
+ local_port: '80',
62
+ protocol: 'tcp'
63
+ )
64
+ virtual_machine.tcp_endpoints.must_include(
65
+ name: 'tcp-port-3889',
66
+ vip: '137.116.17.187',
67
+ public_port: '3889',
68
+ local_port: '3889',
69
+ protocol: 'tcp'
70
+ )
71
+ end
72
+
73
+ end
74
+
75
+ describe '#shutdown_virtual_machine_to_xml' do
76
+
77
+ it 'returns an xml for virtual machine shutdown' do
78
+ result = subject.shutdown_virtual_machine_to_xml
79
+ result.must_be_kind_of String
80
+ doc = Nokogiri::XML(result)
81
+ doc.css('OperationType').text.must_equal 'ShutdownRoleOperation'
82
+ doc.css('PostShutdownAction').text.must_equal 'StoppedDeallocated'
83
+ end
84
+
85
+ end
86
+
87
+ describe '#start_virtual_machine_to_xml' do
88
+
89
+ it 'returns an xml for start virtual machine' do
90
+ result = subject.start_virtual_machine_to_xml
91
+ result.must_be_kind_of String
92
+ doc = Nokogiri::XML(result)
93
+ doc.css('OperationType').text.must_equal 'StartRoleOperation'
94
+ end
95
+
96
+ end
97
+
98
+ describe '#restart_virtual_machine_to_xml' do
99
+
100
+ it 'returns an xml for restart virtual machine' do
101
+ result = subject.restart_virtual_machine_to_xml
102
+ result.must_be_kind_of String
103
+ doc = Nokogiri::XML(result)
104
+ doc.css('OperationType').text.must_equal 'RestartRoleOperation'
105
+ end
106
+
107
+ end
108
+
109
+ describe '#deployment_to_xml' do
110
+ let(:params) do
111
+ {
112
+ vm_name: 'virtual-machine-name',
113
+ vm_user: 'username',
114
+ image: 'linux_image',
115
+ password: 'password',
116
+ location: 'West US'
117
+ }
118
+ end
119
+
120
+ let(:options) do
121
+ {
122
+ storage_account_name: 'storageaccountname',
123
+ cloud_service_name: 'cloud-service-name',
124
+ tcp_endpoints: '80,3389:3390,85:85',
125
+ availability_set_name: 'aval-set',
126
+ winrm_https_port: '5988',
127
+ winrm_transport: ['http','https']
128
+ }
129
+ end
130
+
131
+ let(:image) do
132
+ Azure::VirtualMachineImageManagement::VirtualMachineImage.new do |i|
133
+ i.name = 'windows-instance'
134
+ i.os_type = 'Linux'
135
+ end
136
+ end
137
+
138
+ it 'returns an VirtualMachine object with correct tcp endpoints' do
139
+ params[:certificate] = {fingerprint: 'CFB8C256D2986559C630547F2D0'}
140
+ options[:os_type] = 'Windows'
141
+ options[:existing_ports] = ['5985']
142
+ result = subject.deployment_to_xml params, image, options
143
+ doc = Nokogiri::XML(result)
144
+ endpoints = doc.css('Deployment RoleList ConfigurationSet InputEndpoints InputEndpoint')
145
+ tcp_endpoints = []
146
+ endpoints.each do |endpoint|
147
+ ep = {}
148
+ ep[:name] = xml_content(endpoint, 'Name')
149
+ ep[:public_port] = xml_content(endpoint, 'Port')
150
+ ep[:local_port] = xml_content(endpoint, 'LocalPort')
151
+ tcp_endpoints << ep
152
+ end
153
+ doc.css('Deployment RoleList AvailabilitySetName').text.must_equal 'aval-set'
154
+ result.must_be_kind_of String
155
+ tcp_endpoints.must_include(
156
+ name: 'TCP-PORT-80',
157
+ public_port: '80',
158
+ local_port: '80'
159
+ )
160
+ tcp_endpoints.must_include(
161
+ name: 'TCP-PORT-3390',
162
+ public_port: '3390',
163
+ local_port: '3389'
164
+ )
165
+ tcp_endpoints.must_include(
166
+ name: 'TCP-PORT-85',
167
+ public_port: '85',
168
+ local_port: '85'
169
+ )
170
+ tcp_endpoints.must_include(
171
+ name: 'PowerShell',
172
+ public_port: '5988',
173
+ local_port: '5986'
174
+ )
175
+ end
176
+ end
177
+
178
+ describe '#add_data_disk_to_xml' do
179
+
180
+ let(:options) do
181
+ {
182
+ disk_size: 100,
183
+ }
184
+ end
185
+ let(:media_link) { 'https://sta.blob.managment.core.net/vhds/1234.vhd' }
186
+
187
+ before do
188
+ Loggerx.expects(:puts).returns(nil).at_least(0)
189
+ @vm = Azure::VirtualMachineManagement::VirtualMachine.new
190
+ @vm.data_disks = []
191
+ @vm.media_link = media_link
192
+ end
193
+
194
+ it 'returns an xml for newly created data disk' do
195
+ result = subject.add_data_disk_to_xml(@vm, options)
196
+ doc = Nokogiri::XML(result)
197
+ disk_size = doc.css('DataVirtualHardDisk LogicalDiskSizeInGB').text
198
+ media_link = doc.css('DataVirtualHardDisk MediaLink').text
199
+ disk_name = doc.css('DataVirtualHardDisk DiskName').text
200
+ result.must_be_kind_of String
201
+ disk_size.must_equal options[:disk_size].to_s
202
+ media_link.wont_be_empty
203
+ disk_name.must_be_empty
204
+ end
205
+
206
+ it 'returns an xml for existing data disk' do
207
+ options[:import] = true
208
+ options[:disk_name] = 'disk_name'
209
+ result = subject.add_data_disk_to_xml(@vm, options)
210
+ doc = Nokogiri::XML(result)
211
+ media_link = doc.css('DataVirtualHardDisk MediaLink').text
212
+ disk_name = doc.css('DataVirtualHardDisk DiskName').text
213
+ result.must_be_kind_of String
214
+ media_link.must_be_empty
215
+ disk_name.wont_be_empty
216
+ end
217
+
218
+ it 'raise error when disk name is empty' do
219
+ options[:import] = true
220
+ exception = assert_raises(RuntimeError) do
221
+ subject.add_data_disk_to_xml(@vm, options)
222
+ end
223
+ assert_match(/The data disk name is not valid/i, exception.message)
224
+ end
225
+ end
226
+
227
+ describe '#assign_random_port' do
228
+ let(:preferred_port) { '22' }
229
+ before do
230
+ subject.class.send(:public, *subject.class.private_instance_methods)
231
+ Loggerx.expects(:puts).returns(nil).at_least(0)
232
+ end
233
+
234
+ it 'returns random port number when preferred port is in use' do
235
+ result = subject.assign_random_port(preferred_port, [preferred_port])
236
+ assert_operator result.to_i, :>=, 10000
237
+ assert_operator result.to_i, :<=, 65535
238
+ end
239
+
240
+ it 'returns preferred port number when used ports is nil' do
241
+ result = subject.assign_random_port(preferred_port, nil)
242
+ result.must_equal preferred_port
243
+ end
244
+
245
+ it 'returns preferred port number when used ports is empty' do
246
+ result = subject.assign_random_port(preferred_port, [])
247
+ result.must_equal preferred_port
248
+ end
249
+
250
+ it 'returns random port number when preferred port is in use' do
251
+ result = subject.assign_random_port(preferred_port, ['1', preferred_port])
252
+ assert_operator result.to_i, :>=, 10000
253
+ assert_operator result.to_i, :<=, 65535
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,442 @@
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 'test_helper'
16
+
17
+ describe Azure::VirtualMachineManagementService do
18
+ VirtualMachine = Azure::VirtualMachineManagement::VirtualMachine
19
+
20
+ subject do
21
+ Azure::VirtualMachineManagementService.new
22
+ end
23
+
24
+ let(:params) do
25
+ {
26
+ vm_name: 'instance1',
27
+ vm_user: 'root',
28
+ image: '5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-63APR20130415',
29
+ password: 'root',
30
+ location: 'West US'
31
+ }
32
+ end
33
+
34
+ let(:windows_params) do
35
+ {
36
+ vm_name: 'instance1',
37
+ vm_user: 'administrator',
38
+ image: 'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-Datacenter-201304.01-en.us-127GB.vhd',
39
+ password: 'Admin123',
40
+ location: 'West US'
41
+ }
42
+ end
43
+
44
+ let(:location_request_path) { '/locations' }
45
+ let(:locations_xml) { Fixtures['list_locations'] }
46
+ let(:location_response) do
47
+ response = mock
48
+ response.stubs(:body).returns(locations_xml)
49
+ response
50
+ end
51
+ let(:location_response_body) { Nokogiri::XML location_response.body }
52
+ let(:mock_virtual_machine_request) { mock }
53
+ let(:windows_images_xml) { Fixtures['list_images'] }
54
+ let(:images_request_path) { '/services/images' }
55
+ let(:mock_request) { mock }
56
+ let(:os_response_body) do
57
+ response = mock
58
+ response.stubs(:body).returns(windows_images_xml)
59
+ Nokogiri::XML response.body
60
+ end
61
+
62
+ before do
63
+ Loggerx.stubs(:info).returns(nil)
64
+ Loggerx.expects(:puts).returns(nil).at_least(0)
65
+ ManagementHttpRequest.stubs(:new).with(
66
+ :get,
67
+ images_request_path,
68
+ nil
69
+ ).returns(mock_request)
70
+ mock_request.expects(:call).returns(os_response_body).at_least(0)
71
+ end
72
+
73
+ describe '#list_virtual_machines' do
74
+ let(:request_path) { '/services/hostedservices' }
75
+ let(:cloud_services_xml) { Fixtures['list_cloud_services'] }
76
+ let(:virtual_machine_xml) { Fixtures['virtual_machine'] }
77
+ let(:deployment_error_xml) { Fixtures['deployment_error'] }
78
+ let(:method) { :get }
79
+ let(:mock_cloud_service_request) { mock }
80
+ let(:cloud_service_response) do
81
+ cloud_service_response = mock
82
+ cloud_service_response.stubs(:body).returns(cloud_services_xml)
83
+ cloud_service_response
84
+ end
85
+ let(:virtual_machine_response) do
86
+ virtual_machine_response = mock
87
+ virtual_machine_response.stubs(:body).returns(virtual_machine_xml)
88
+ virtual_machine_response
89
+ end
90
+ let(:deployment_error_response) do
91
+ http_error_response = mock
92
+ http_error_response.stubs(:body).returns(deployment_error_xml)
93
+ http_error_response
94
+ end
95
+ let(:cloud_service_response_body) { Nokogiri::XML cloud_service_response.body }
96
+ let(:virtual_machine_response_body) { Nokogiri::XML virtual_machine_response.body }
97
+
98
+ before do
99
+ ManagementHttpRequest.stubs(:new).with(method, request_path, nil).returns(mock_cloud_service_request)
100
+ mock_cloud_service_request.expects(:call).returns(cloud_service_response_body)
101
+ ManagementHttpRequest.stubs(:new).with(method, anything).returns(mock_virtual_machine_request)
102
+ mock_virtual_machine_request.stubs(:warn=).returns(true).twice
103
+ mock_virtual_machine_request.expects(:call).twice.returns(virtual_machine_response_body).returns(Nokogiri::XML deployment_error_response.body)
104
+ end
105
+
106
+ it 'assembles a URI for the request' do
107
+ subject.list_virtual_machines
108
+ end
109
+
110
+ it "returns a virtual_machine, with it's attribute populated" do
111
+ virtual_machine = subject.list_virtual_machines.first
112
+ virtual_machine.vm_name.must_equal 'instance-name'
113
+ virtual_machine.role_size.must_equal 'Small'
114
+ virtual_machine.hostname.must_equal 'host-name'
115
+ virtual_machine.cloud_service_name.must_equal 'cloud-service-1'
116
+ virtual_machine.deployment_name.must_equal 'deployment-name'
117
+ virtual_machine.ipaddress.must_equal '137.116.17.187'
118
+ virtual_machine.private_ipaddress.must_equal '100.65.164.123'
119
+ virtual_machine.virtual_network_name.must_equal 'test-virtual-network'
120
+ virtual_machine.virtual_network_subnet_name.must_equal 'Test-Subnet'
121
+ end
122
+
123
+ it 'returns a list of virtual machines for the subscription' do
124
+ results = subject.list_virtual_machines
125
+ results.must_be_kind_of Array
126
+ results.length.must_equal 1
127
+ results.first.must_be_kind_of VirtualMachine
128
+ end
129
+
130
+ it "returns a virtual_machine, with it's tcp_endpoints attribute" do
131
+ virtual_machine = subject.list_virtual_machines.first
132
+ virtual_machine.tcp_endpoints.must_be_kind_of Array
133
+ virtual_machine.tcp_endpoints.must_include(
134
+ name: 'SSH',
135
+ vip: '137.116.17.187',
136
+ public_port: '22',
137
+ local_port: '22',
138
+ protocol: 'tcp'
139
+ )
140
+ virtual_machine.tcp_endpoints.must_include(
141
+ name: 'tcp-port-80',
142
+ vip: '137.117.17.187',
143
+ public_port: '80',
144
+ local_port: '80',
145
+ protocol: 'tcp'
146
+ )
147
+ virtual_machine.tcp_endpoints.must_include(
148
+ name: 'tcp-port-3889',
149
+ vip: '137.116.17.187',
150
+ public_port: '3889',
151
+ local_port: '3889',
152
+ protocol: 'tcp'
153
+ )
154
+ end
155
+ end
156
+
157
+ describe '#get_virtual_machine' do
158
+
159
+ before do
160
+ virtual_machine = VirtualMachine.new do |vm|
161
+ vm.vm_name = 'instance-name'
162
+ vm.cloud_service_name = 'cloud-service-1'
163
+ end
164
+ Azure::VirtualMachineManagementService.any_instance.stubs(
165
+ :list_virtual_machines
166
+ ).returns([virtual_machine])
167
+ end
168
+
169
+ it 'return nil if virtual machine and cloud server does not exist ' do
170
+ virtual_machine = subject.get_virtual_machine 'name', 'cloud-service'
171
+ virtual_machine.must_equal nil
172
+ end
173
+
174
+ it 'return nil if virtual machine or cloud server does not exist ' do
175
+ vm = subject.get_virtual_machine 'name', 'cloud-service-1'
176
+ vm.must_equal nil
177
+ vm = subject.get_virtual_machine 'name2', 'cloud_service_name'
178
+ vm.must_equal nil
179
+ end
180
+
181
+ it 'return virtual machine instance if virtual machine name and cloud server name are valid ' do
182
+ vm = subject.get_virtual_machine 'instance-name', 'cloud-service-1'
183
+ vm.must_be_kind_of VirtualMachine
184
+ end
185
+ end
186
+
187
+ describe '#create_virtual_machine' do
188
+ let(:method) { :get }
189
+
190
+ before do
191
+ mock_request = mock
192
+ ManagementHttpRequest.stubs(:new).with(
193
+ method,
194
+ location_request_path,
195
+ nil
196
+ ).returns(mock_request)
197
+ mock_request.expects(:call).returns(location_response_body).at_least(0)
198
+ Azure::CloudServiceManagementService.any_instance.stubs(:create_cloud_service)
199
+ Azure::CloudServiceManagementService.any_instance.stubs(:upload_certificate)
200
+ Azure::StorageManagementService.any_instance.stubs(:create_storage_account)
201
+ mock_request = mock
202
+ ManagementHttpRequest.expects(:new).with(
203
+ :post,
204
+ anything,
205
+ anything
206
+ ).returns(mock_request)
207
+ mock_request.expects(:call).returns(nil)
208
+ virtual_machine = VirtualMachine.new do |vm|
209
+ vm.vm_name = 'instance-name'
210
+ vm.ipaddress = '192.168.1.1'
211
+ end
212
+ Azure::VirtualMachineManagementService.stubs(
213
+ :get_virtual_machine
214
+ ).returns(virtual_machine)
215
+ end
216
+
217
+ it 'should set options hash with valid cloud_service_name, deployment_name, storage_account_name.' do
218
+ options = {}
219
+ subject.create_virtual_machine(params, options)
220
+ csn = options[:cloud_service_name]
221
+ csn.wont_be_nil
222
+ options[:storage_account_name].wont_be_nil
223
+ options[:deployment_name].wont_be_nil
224
+ options[:os_type].must_equal 'Linux'
225
+ assert_match(/^#{params[:vm_name] + '-service'}*/, csn)
226
+ end
227
+
228
+ it 'should set options hash with valid cloud service name.' do
229
+ options = {
230
+ storage_account_name: 'storage_account_name',
231
+ deployment_name: 'unique_deployment_name',
232
+ tcp_endpoints: '80,3889:3889'
233
+ }
234
+ subject.create_virtual_machine(params, options)
235
+ csn = options[:cloud_service_name]
236
+ csn.wont_be_nil
237
+ assert_match(/^#{params[:vm_name] + '-service-'}*/, csn)
238
+ options[:os_type].must_equal 'Linux'
239
+ end
240
+
241
+ end
242
+
243
+ describe '#create_virtual_machine with invalid parameters for windows machine' do
244
+ let(:virtual_machine_xml) { Fixtures['virtual_machine'] }
245
+ let(:method) { :get }
246
+
247
+ before do
248
+ mock_request = mock
249
+ ManagementHttpRequest.stubs(:new).with(
250
+ method,
251
+ location_request_path,
252
+ nil
253
+ ).returns(mock_request)
254
+ mock_request.expects(:call).returns(location_response_body).at_least(0)
255
+ Azure::CloudServiceManagementService.any_instance.stubs(:create_cloud_service)
256
+ Azure::CloudServiceManagementService.any_instance.stubs(:upload_certificate)
257
+ Azure::StorageManagementService.any_instance.stubs(:create_storage_account)
258
+ mock_request = mock
259
+ ManagementHttpRequest.expects(:new).with(
260
+ :post,
261
+ anything,
262
+ anything
263
+ ).returns(mock_request).at_least(0)
264
+ mock_request.expects(:call).returns(nil).at_least(0)
265
+ virtual_machine_obj = VirtualMachine.new do |virtual_machine|
266
+ virtual_machine.vm_name = 'windows-instance'
267
+ virtual_machine.ipaddress = '192.168.1.1'
268
+ end
269
+ Azure::VirtualMachineManagementService.any_instance.stubs(
270
+ :get_virtual_machine
271
+ ).returns(virtual_machine_obj)
272
+ end
273
+
274
+ it 'should set options os_type with windows.' do
275
+ options = {}
276
+ subject.create_virtual_machine(windows_params, options)
277
+ csn = options[:cloud_service_name]
278
+ csn.wont_be_nil
279
+ options[:storage_account_name].wont_be_nil
280
+ options[:deployment_name].wont_be_nil
281
+ options[:os_type].must_equal 'Windows'
282
+ assert_match(/^#{params[:vm_name] + '-service'}*/, csn)
283
+ end
284
+
285
+ it 'throws error when vm_user is not given' do
286
+ windows_params.delete(:vm_user)
287
+ options = {}
288
+ virtual_machine = subject.create_virtual_machine(windows_params, options)
289
+ assert_match(/You did not provide a valid 'vm_user' value*/, virtual_machine)
290
+ end
291
+
292
+ it 'self-signed certificate is generated by vm and used for the virtual machine when certificate path is not given.' do
293
+ options = { winrm_transport: %w(https http) }
294
+ virtual_machine = subject.create_virtual_machine(windows_params, options)
295
+ virtual_machine.wont_be_nil
296
+ end
297
+
298
+ it 'throws error when certificate path is not invalid.' do
299
+ options = {
300
+ winrm_transport: %w(https http),
301
+ private_key_file: 'f:/invalid_path/private_key' ,
302
+ certificate_file: 'f:/invalid_path/certificate.pem'
303
+ }
304
+ virtual_machine = subject.create_virtual_machine(windows_params, options)
305
+ assert_match(/No such file or directory -*/, virtual_machine)
306
+ end
307
+
308
+ it 'should not throws certificate error when wirnm_transport is http' do
309
+ options = {
310
+ winrm_transport: ['http'],
311
+ private_key_file: 'f:/invalid_path/private_key' ,
312
+ certificate_file: 'f:/invalid_path/certificate.pem'
313
+ }
314
+ virtual_machine = subject.create_virtual_machine(windows_params, options)
315
+ virtual_machine.must_be_kind_of VirtualMachine
316
+ virtual_machine.wont_be_nil
317
+ end
318
+
319
+ it 'throws error when location is not given' do
320
+ params.delete(:location)
321
+ virtual_machine = subject.create_virtual_machine(params)
322
+ error_msg = "You did not provide a valid 'location' value"
323
+ assert_match(/#{error_msg}*/, virtual_machine)
324
+ end
325
+
326
+ it 'throws error when wrong location is given' do
327
+ params.merge!(location: 'wrong location')
328
+ virtual_machine = subject.create_virtual_machine(params)
329
+ assert_match(/Value 'wrong location' specified for parameter 'location' is invalid.*/, virtual_machine)
330
+ end
331
+
332
+ it 'throws error when empty location is given' do
333
+ params.merge!(location: nil)
334
+ virtual_machine = subject.create_virtual_machine(params)
335
+ assert_match(/You did not provide a valid 'location' value*/, virtual_machine)
336
+ end
337
+
338
+ it 'location should be case insensitive' do
339
+ params.merge!(location: 'west us')
340
+ subject.create_virtual_machine(params)
341
+ end
342
+
343
+ it 'throw error when available_services has not persistentvmrole for given location' do
344
+ params.merge!(location: 'West Europe')
345
+ msg = subject.create_virtual_machine(params)
346
+ assert_match(/Persistentvmrole not enabled for "West Europe"*/, msg)
347
+ end
348
+
349
+ it 'vm_size should be case sensitive' do
350
+ options = {
351
+ vm_size: 'extralarge'
352
+ }
353
+ msg = subject.create_virtual_machine(params, options)
354
+ assert_match(/Value 'extralarge' specified for parameter 'vm_size' is invalid/, msg)
355
+ end
356
+
357
+ it 'throws error when wrong role size is given' do
358
+ options = {
359
+ vm_size: 'wrong size'
360
+ }
361
+ virtual_machine = subject.create_virtual_machine(params, options)
362
+ error_msg = "'wrong size' specified for parameter 'vm_size' is invalid."
363
+ assert_match(/#{error_msg}*/, virtual_machine)
364
+ end
365
+
366
+ it 'should not throw any error if role size is empty' do
367
+ options = {
368
+ vm_size: ''
369
+ }
370
+ subject.create_virtual_machine(params, options)
371
+ end
372
+ end
373
+
374
+ describe '#get_image' do
375
+
376
+ before do
377
+ subject.class.send(:public, *subject.class.private_instance_methods)
378
+ end
379
+
380
+ it 'returns os type of given virtual machine image' do
381
+ result = subject.get_image 'RightImage-CentOS-6.2-x64-v5.8.8.1'
382
+ result.os_type.must_equal 'Linux'
383
+ end
384
+
385
+ it 'errors if the virtual machine image does not exist' do
386
+ exception = assert_raises(RuntimeError) do
387
+ subject.get_image 'invalid-image-name'
388
+ end
389
+ error_msg = 'The virtual machine image source is not valid'
390
+ assert_match(/#{error_msg}/i, exception.message)
391
+ end
392
+ end
393
+
394
+ describe '#add_role' do
395
+
396
+ before do
397
+ windows_params[:cloud_service_name] = 'cloud-service-1'
398
+ end
399
+
400
+ it 'should throws error when cloud service name is empty' do
401
+ windows_params.delete(:cloud_service_name)
402
+ exception = assert_raises(RuntimeError) do
403
+ subject.add_role(params)
404
+ end
405
+ error_msg = 'You did not provide a valid \'cloud_service_name\' value'
406
+ assert_match(/#{error_msg}/i, exception.message)
407
+ end
408
+
409
+ it 'throws error when vm_user is not given' do
410
+ windows_params.delete(:vm_user)
411
+ exception = assert_raises(RuntimeError) do
412
+ subject.add_role(windows_params)
413
+ end
414
+ error_msg = 'You did not provide a valid \'vm_user\' value'
415
+ assert_match(/#{error_msg}/i, exception.message)
416
+ end
417
+
418
+ it 'throws error when certificate path is not invalid.' do
419
+ options = {
420
+ winrm_transport: %w(https http),
421
+ private_key_file: 'f:/invalid_path/private_key' ,
422
+ certificate_file: 'f:/invalid_path/certificate.pem'
423
+ }
424
+ exception = assert_raises(RuntimeError) do
425
+ subject.add_role(windows_params, options)
426
+ end
427
+ error_msg = 'No such file or directory'
428
+ assert_match(/#{error_msg}/i, exception.message)
429
+ end
430
+
431
+ it 'throws error when wrong role size is given' do
432
+ options = { vm_size: 'wrong size' }
433
+ exception = assert_raises(RuntimeError) do
434
+ subject.add_role(windows_params, options)
435
+ end
436
+ error_msg = "wrong size' specified for parameter 'vm_size' is invalid."
437
+ assert_match(/#{error_msg}*/, exception.message)
438
+ end
439
+
440
+ end
441
+
442
+ end