azure-plus 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 (298) 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 +590 -0
  7. data/Rakefile +129 -0
  8. data/azure.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 +184 -0
  88. data/lib/azure/storage_management/storage_account.rb +40 -0
  89. data/lib/azure/storage_management/storage_management_service.rb +166 -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 +51 -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 +436 -0
  106. data/lib/azure/virtual_machine_management/virtual_machine.rb +42 -0
  107. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +549 -0
  108. data/lib/azure/virtual_network_management/serialization.rb +186 -0
  109. data/lib/azure/virtual_network_management/virtual_network.rb +36 -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_properties.xml +23 -0
  170. data/test/fixtures/update_storage_account.xml +16 -0
  171. data/test/fixtures/update_storage_error.xml +5 -0
  172. data/test/fixtures/updated_storage_accounts.xml +53 -0
  173. data/test/fixtures/virtual_machine.xml +113 -0
  174. data/test/fixtures/windows_virtual_machine.xml +106 -0
  175. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  176. data/test/integration/affinity_group/Create_Affinity_test.rb +63 -0
  177. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  178. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  179. data/test/integration/affinity_group/Update_Affinity_test.rb +82 -0
  180. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  181. data/test/integration/blob/blob_metadata_test.rb +75 -0
  182. data/test/integration/blob/blob_pages_test.rb +119 -0
  183. data/test/integration/blob/blob_properties_test.rb +77 -0
  184. data/test/integration/blob/block_blob_test.rb +254 -0
  185. data/test/integration/blob/container/container_acl_test.rb +69 -0
  186. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  187. data/test/integration/blob/container/create_container_test.rb +60 -0
  188. data/test/integration/blob/container/delete_container_test.rb +39 -0
  189. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  190. data/test/integration/blob/container/list_containers_test.rb +79 -0
  191. data/test/integration/blob/container/root_container_test.rb +54 -0
  192. data/test/integration/blob/copy_blob_test.rb +113 -0
  193. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  194. data/test/integration/blob/create_page_blob_test.rb +83 -0
  195. data/test/integration/blob/delete_blob_test.rb +159 -0
  196. data/test/integration/blob/get_blob_test.rb +65 -0
  197. data/test/integration/blob/informative_errors_test.rb +39 -0
  198. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  199. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  200. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  201. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  202. data/test/integration/blob/list_blobs_test.rb +113 -0
  203. data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
  204. data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
  205. data/test/integration/database/create_sql_server_firewall_test.rb +86 -0
  206. data/test/integration/database/create_sql_server_test.rb +53 -0
  207. data/test/integration/database/delete_sql_server_firewall_test.rb +70 -0
  208. data/test/integration/database/delete_sql_server_test.rb +58 -0
  209. data/test/integration/database/list_sql_server_firewall_test.rb +45 -0
  210. data/test/integration/database/list_sql_servers_test.rb +44 -0
  211. data/test/integration/database/reset_password_sql_server_test.rb +55 -0
  212. data/test/integration/location/Location_List_test.rb +39 -0
  213. data/test/integration/queue/clear_messages_test.rb +42 -0
  214. data/test/integration/queue/create_message_test.rb +75 -0
  215. data/test/integration/queue/create_queue_test.rb +50 -0
  216. data/test/integration/queue/delete_message_test.rb +67 -0
  217. data/test/integration/queue/delete_queue_test.rb +45 -0
  218. data/test/integration/queue/informative_errors_test.rb +42 -0
  219. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  220. data/test/integration/queue/list_messages_test.rb +79 -0
  221. data/test/integration/queue/list_queues_test.rb +44 -0
  222. data/test/integration/queue/peek_messages_test.rb +59 -0
  223. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  224. data/test/integration/queue/queue_metadata_test.rb +40 -0
  225. data/test/integration/queue/update_message_test.rb +74 -0
  226. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  227. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  228. data/test/integration/service_bus/queues_test.rb +266 -0
  229. data/test/integration/service_bus/rules_test.rb +145 -0
  230. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  231. data/test/integration/service_bus/scenario_test.rb +101 -0
  232. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  233. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  234. data/test/integration/service_bus/topics_test.rb +129 -0
  235. data/test/integration/storage_management/storage_management_test.rb +160 -0
  236. data/test/integration/table/create_table_test.rb +36 -0
  237. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  238. data/test/integration/table/delete_entity_test.rb +94 -0
  239. data/test/integration/table/delete_table_test.rb +40 -0
  240. data/test/integration/table/get_table_test.rb +37 -0
  241. data/test/integration/table/informative_errors_test.rb +39 -0
  242. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  243. data/test/integration/table/insert_entity_test.rb +88 -0
  244. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  245. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  246. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  247. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  248. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  249. data/test/integration/table/merge_entity_test.rb +113 -0
  250. data/test/integration/table/query_entities_test.rb +195 -0
  251. data/test/integration/table/query_tables_test.rb +43 -0
  252. data/test/integration/table/query_test.rb +251 -0
  253. data/test/integration/table/table_acl_test.rb +52 -0
  254. data/test/integration/table/table_gb18030_test.rb +355 -0
  255. data/test/integration/table/update_entity_batch_test.rb +149 -0
  256. data/test/integration/table/update_entity_test.rb +131 -0
  257. data/test/integration/test_helper.rb +42 -0
  258. data/test/integration/vm/VM_Create_test.rb +260 -0
  259. data/test/integration/vm/VM_Delete_test.rb +55 -0
  260. data/test/integration/vm/VM_Operations_test.rb +173 -0
  261. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  262. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  263. data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -0
  264. data/test/integration/vnet/Virtual_Network_list_test.rb +53 -0
  265. data/test/support/env.rb +19 -0
  266. data/test/support/fixtures.rb +36 -0
  267. data/test/support/name_generator.rb +160 -0
  268. data/test/support/stubs.rb +42 -0
  269. data/test/support/virtual_machine_name_generator.rb +102 -0
  270. data/test/support/virtual_network_helper.rb +73 -0
  271. data/test/test_helper.rb +53 -0
  272. data/test/unit/affinity_group/affinity_group_test.rb +192 -0
  273. data/test/unit/affinity_group/serialization_test.rb +88 -0
  274. data/test/unit/base_management/location_test.rb +57 -0
  275. data/test/unit/blob/blob_service_test.rb +1947 -0
  276. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +276 -0
  277. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  278. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  279. data/test/unit/core/auth/shared_key_test.rb +58 -0
  280. data/test/unit/core/auth/signer_test.rb +30 -0
  281. data/test/unit/core/http/http_error_test.rb +57 -0
  282. data/test/unit/core/http/http_request_test.rb +66 -0
  283. data/test/unit/core/http/http_response_test.rb +45 -0
  284. data/test/unit/core/http/retry_policy_test.rb +23 -0
  285. data/test/unit/database/serialization_test.rb +97 -0
  286. data/test/unit/database/sql_database_server_service_test.rb +288 -0
  287. data/test/unit/service/serialization_test.rb +502 -0
  288. data/test/unit/service/storage_service_test.rb +291 -0
  289. data/test/unit/storage_management/serialization_test.rb +232 -0
  290. data/test/unit/storage_management/storage_management_service_test.rb +261 -0
  291. data/test/unit/table/edmtype_test.rb +108 -0
  292. data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -0
  293. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -0
  294. data/test/unit/virtual_machine_management/serialization_test.rb +247 -0
  295. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -0
  296. data/test/unit/vnet/serialization_test.rb +187 -0
  297. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  298. metadata +470 -0
@@ -0,0 +1,276 @@
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
+ require 'securerandom'
17
+
18
+ describe Azure::CloudServiceManagementService do
19
+
20
+ subject { Azure::CloudServiceManagementService.new }
21
+ let(:request_path) { '/services/hostedservices' }
22
+ let(:cloud_services_xml) { Fixtures['list_cloud_services'] }
23
+ let(:method) { :get }
24
+ let(:mock_request) { mock }
25
+ let(:response) do
26
+ response = mock
27
+ response.stubs(:body).returns(cloud_services_xml)
28
+ response
29
+ end
30
+ let(:response_body) { Nokogiri::XML response.body }
31
+ let(:slot) { "Staging" }
32
+ let(:cloud_service_name) { "testservice" }
33
+ let(:get_deployment_request_path) { "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}" }
34
+ let(:deployment_xml) { Fixtures['get_deployment'] }
35
+ let(:deployment_response) do
36
+ response = mock
37
+ response.stubs(:body).returns(deployment_xml)
38
+ response
39
+ end
40
+ let(:deployment_response_body) { Nokogiri::XML deployment_response.body }
41
+
42
+ before do
43
+ Loggerx.expects(:puts).returns(nil).at_least(0)
44
+ end
45
+
46
+ describe '#list_cloud_services' do
47
+ before do
48
+ ManagementHttpRequest.stubs(:new).with(method, request_path, nil).returns(mock_request)
49
+ mock_request.expects(:call).returns(response_body)
50
+ end
51
+
52
+ it 'assembles a URI for the request' do
53
+ subject.list_cloud_services
54
+ end
55
+
56
+ it 'sets the properties of the CloudService instance' do
57
+ cloud_service = subject.list_cloud_services.first
58
+ cloud_service.name.must_equal 'cloud-service-1'
59
+ end
60
+
61
+ it 'returns a list of cloud services for the subscription' do
62
+ results = subject.list_cloud_services
63
+ results.must_be_kind_of Array
64
+ results.length.must_equal 2
65
+ results.first.must_be_kind_of Azure::CloudServiceManagement::CloudService
66
+ end
67
+ end
68
+
69
+ describe '#get_cloud_service' do
70
+ before do
71
+ ManagementHttpRequest.stubs(:new).with(method, request_path, nil).returns(mock_request)
72
+ mock_request.expects(:call).returns(response_body)
73
+ end
74
+
75
+ it 'assembles a URI for the request' do
76
+ subject.get_cloud_service 'cloud-service-1'
77
+ end
78
+
79
+ it 'returns true if found cloud service with given name' do
80
+ result = subject.get_cloud_service 'cloud-service-1'
81
+ result.must_equal true
82
+ end
83
+
84
+ it "returns false if cloud service with given name doesn't exists" do
85
+ result = subject.get_cloud_service 'cloud-service-3'
86
+ result.must_equal false
87
+ end
88
+ end
89
+
90
+ describe '#create_cloud_service' do
91
+
92
+ it 'Create cloud service return message if cloud service exists of given name.' do
93
+ ManagementHttpRequest.any_instance.expects(:call).returns response_body
94
+ msg = subject.create_cloud_service 'cloud-service-1'
95
+ assert_match(/^Cloud service cloud-service-1 already exists*/, msg)
96
+ end
97
+
98
+ it "Create cloud service if cloud service doesn't exists of given name." do
99
+ Azure::CloudServiceManagementService.any_instance.stubs(:get_cloud_service).with('cloud-service-3').returns(false)
100
+ ManagementHttpRequest.any_instance.expects(:call).returns nil
101
+ subject.create_cloud_service 'cloud-service-3'
102
+ end
103
+
104
+ end
105
+
106
+ describe '#get_deployment' do
107
+ before do
108
+ ManagementHttpRequest.stubs(:new).with(method, get_deployment_request_path, nil).returns(mock_request)
109
+ mock_request.expects(:call).returns(deployment_response_body)
110
+ end
111
+
112
+ it 'Return a Deployment object with all its statuses and details if the it exists for the specific cloud service and slot.' do
113
+ deployment = subject.get_deployment(cloud_service_name, {:slot => slot})
114
+ deployment.must_be_kind_of Azure::CloudServiceManagement::Deployment
115
+ deployment.deployment_slot.must_equal slot
116
+ deployment.role_instances.size.must_equal 1
117
+ deployment.role_instances[0].instance_endpoints.size.must_equal 3
118
+ deployment.roles.size.must_equal 1
119
+ deployment.roles[0].configuration_sets.size.must_equal 1
120
+ deployment.virtual_ips.size.must_equal 1
121
+ end
122
+ end
123
+
124
+ let(:slot) { "Staging" }
125
+ let(:cloud_service_name) { "testservice" }
126
+ let(:get_deployment_request_path) { "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}" }
127
+ let(:existing_deployment_xml) { Fixtures['get_deployment_existing'] }
128
+ let(:existing_deployment_response) do
129
+ deployment = mock
130
+ deployment.stubs(:body).returns(existing_deployment_xml)
131
+ deployment.stubs(:code).returns(200)
132
+ deployment
133
+ end
134
+
135
+ let(:missing_deployment_xml) { Fixtures['get_deployment_missing'] }
136
+ let(:missing_deployment_response) do
137
+ deployment = mock
138
+ deployment.stubs(:body).returns(missing_deployment_xml)
139
+ deployment.stubs(:code).returns(500)
140
+ deployment
141
+ end
142
+
143
+ describe '#get_deployment' do
144
+
145
+ it 'Returns a Deployment object with all its statuses and details if the it exists for the specific slot of the cloud service.' do
146
+ Net::HTTP.any_instance.stubs(:request).returns(existing_deployment_response)
147
+
148
+ deployment = subject.get_deployment(cloud_service_name, {:slot => slot})
149
+ deployment.must_be_kind_of Azure::CloudServiceManagement::Deployment
150
+ deployment.exists?.must_equal true
151
+ deployment.deployment_slot.must_equal slot
152
+ deployment.role_instances.size.must_equal 1
153
+ deployment.role_instances[0].instance_endpoints.size.must_equal 3
154
+ deployment.roles.size.must_equal 1
155
+ deployment.roles[0].configuration_sets.size.must_equal 1
156
+ deployment.virtual_ips.size.must_equal 1
157
+ end
158
+
159
+ it 'Returns a Deployment object that says that no deployment exists when we explicitely
160
+ disable failure for deployment that does not exist for the specific slot of the cloud service.' do
161
+ Net::HTTP.any_instance.stubs(:request).returns(missing_deployment_response)
162
+
163
+ deployment = subject.get_deployment(cloud_service_name, {:slot => slot, :no_exit_on_failure => true})
164
+ deployment.must_be_kind_of Azure::CloudServiceManagement::Deployment
165
+ deployment.exists?.must_equal false
166
+ end
167
+
168
+ it 'Fails and throw an error when no deployment exists for the specific slot of the cloud service.' do
169
+ Net::HTTP.any_instance.stubs(:request).returns(missing_deployment_response)
170
+
171
+ exception = assert_raises(RuntimeError) do
172
+ deployment = subject.get_deployment(cloud_service_name, {:slot => slot })
173
+ end
174
+ assert_match(/ResourceNotFound : No deployments were found*/, exception.message)
175
+ end
176
+ end
177
+
178
+ let(:package_url) { "https://my_storage.blob.core.windows.net/my_container/my_pkg.cspkg" }
179
+ let(:service_config) { "fewcqfewqfeqc43" }
180
+ let(:deployment_name) { "deployment_test" }
181
+ let(:no_deployment) do
182
+ deployment = mock
183
+ deployment.stubs(:exists?).returns(false)
184
+ deployment
185
+ end
186
+ let(:transitioning_deployment) do
187
+ deployment = mock
188
+ deployment.stubs(:exists?).returns(true)
189
+ deployment.stubs(:is_transitioning?).returns(true)
190
+ deployment
191
+ end
192
+ let(:existing_deployment) do
193
+ deployment = mock
194
+ deployment.stubs(:exists?).returns(true)
195
+ deployment.stubs(:is_transitioning?).returns(false)
196
+ deployment.stubs(:name).returns("existing_deployment")
197
+ deployment
198
+ end
199
+
200
+ describe '#upgrade_deployment' do
201
+
202
+ it 'Fails and throw an error if the deployment does not exist yet.' do
203
+ subject.stubs(:get_deployment).returns(no_deployment)
204
+
205
+ exception = assert_raises(RuntimeError) do
206
+ subject.upgrade_deployment(cloud_service_name, package_url, service_config, {:slot => slot })
207
+ end
208
+ assert_match(/.*does not exist, and therefore cannot be upgraded/, exception.message)
209
+ end
210
+
211
+ it 'Fails and throw an error if the deployment is in a current transitioning state.' do
212
+ subject.stubs(:get_deployment).returns(transitioning_deployment)
213
+
214
+ exception = assert_raises(RuntimeError) do
215
+ subject.upgrade_deployment(cloud_service_name, package_url, service_config, {:slot => slot })
216
+ end
217
+ assert_match(/.*is currently transitioning.*/, exception.message)
218
+ end
219
+
220
+ it 'Starts the upgrade asynchronously when the deployment does exist.' do
221
+ subject.stubs(:get_deployment).returns(existing_deployment)
222
+ ManagementHttpRequest.any_instance.expects(:call).returns nil
223
+ subject.upgrade_deployment(cloud_service_name, package_url, service_config, {:slot => slot })
224
+ end
225
+ end
226
+
227
+ describe '#swap_deployment' do
228
+
229
+ it 'Fails and throw an error if both the staging and production deployment do not exist yet.' do
230
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "staging", :no_exit_on_failure => true})
231
+ .returns(no_deployment)
232
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "production", :no_exit_on_failure => true})
233
+ .returns(no_deployment)
234
+
235
+ exception = assert_raises(RuntimeError) do
236
+ subject.swap_deployment(cloud_service_name)
237
+ end
238
+ assert_match(/.*There are no deployments on cloud service #{cloud_service_name}.*/, exception.message)
239
+ end
240
+
241
+ it 'Fails and throw an error if the staging deployment is currently transitioning.' do
242
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "staging", :no_exit_on_failure => true})
243
+ .returns(transitioning_deployment)
244
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "production", :no_exit_on_failure => true})
245
+ .returns(existing_deployment)
246
+
247
+ exception = assert_raises(RuntimeError) do
248
+ subject.swap_deployment(cloud_service_name)
249
+ end
250
+ assert_match(/.*Staging deployment on cloud service #{cloud_service_name} is transitioning.*/, exception.message)
251
+ end
252
+
253
+ it 'Fails and throw an error if the production deployment is currently transitioning.' do
254
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "staging", :no_exit_on_failure => true})
255
+ .returns(existing_deployment)
256
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "production", :no_exit_on_failure => true})
257
+ .returns(transitioning_deployment)
258
+
259
+ exception = assert_raises(RuntimeError) do
260
+ subject.swap_deployment(cloud_service_name)
261
+ end
262
+ assert_match(/.*Production deployment on cloud service #{cloud_service_name} is transitioning.*/, exception.message)
263
+ end
264
+
265
+ it "Swaps the production and staging deployment for the specified cloud service." do
266
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "staging", :no_exit_on_failure => true})
267
+ .returns(existing_deployment)
268
+ subject.stubs(:get_deployment).with(cloud_service_name, {:slot => "production", :no_exit_on_failure => true})
269
+ .returns(existing_deployment)
270
+
271
+ ManagementHttpRequest.any_instance.expects(:call).returns nil
272
+
273
+ subject.swap_deployment(cloud_service_name)
274
+ end
275
+ end
276
+ end
@@ -0,0 +1,169 @@
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::CloudServiceManagement::Serialization do
18
+ subject { Azure::CloudServiceManagement::Serialization }
19
+
20
+ let(:cloud_services_from_xml) { Fixtures['list_cloud_services'] }
21
+
22
+ describe '#cloud_services_from_xml' do
23
+ let (:cloud_services_xml) { Nokogiri::XML(cloud_services_from_xml) }
24
+ it 'accepts an XML string' do
25
+ subject.cloud_services_from_xml Nokogiri::XML(cloud_services_from_xml)
26
+ end
27
+
28
+ it 'returns an Array of CloudService instances' do
29
+ results = subject.cloud_services_from_xml(cloud_services_xml)
30
+ results.must_be_kind_of Array
31
+ results[0].must_be_kind_of(Azure::CloudServiceManagement::CloudService)
32
+ results.count.must_equal 2
33
+ end
34
+
35
+ it 'populates all properties for a cloud service' do
36
+ results = subject.cloud_services_from_xml(cloud_services_xml)
37
+ cloud = results.first
38
+ cloud_xml = cloud_services_xml.css('HostedServices HostedService').first
39
+ cloud.url.must_equal(cloud_xml.css('Url').text)
40
+ cloud.name.must_equal(cloud_xml.css('ServiceName').text)
41
+ cloud.description.must_equal(cloud_xml.css('Description').text)
42
+ cloud.location.must_equal(cloud_xml.css('Location').text)
43
+ cloud.label.must_equal(Base64.decode64(cloud_xml.css('Label').text))
44
+ cloud.status.must_equal(cloud_xml.css('Status').text)
45
+ cloud.date_created.must_equal(cloud_xml.css('DateCreated').text)
46
+ cloud.date_modified.must_equal(cloud_xml.css('DateLastModified').text)
47
+ cloud.extended_properties.size.must_equal(
48
+ cloud_xml.css('ExtendedProperties ExtendedProperty').size
49
+ )
50
+ cloud_xml.css('ExtendedProperties ExtendedProperty').each do |p|
51
+ cloud.extended_properties[p.css('Name').text].must_equal(
52
+ p.css('Value').text
53
+ )
54
+ end
55
+ cloud.default_winrm_certificate_thumbprint.must_equal(
56
+ cloud_xml.css('DefaultWinRMCertificateThumbprint').text
57
+ )
58
+ end
59
+ end
60
+
61
+ describe '#cloud_services_to_xml' do
62
+ let(:cloud_service_name) { 'cloud-service' }
63
+
64
+ it 'accepts an name and options hash' do
65
+ subject.cloud_services_to_xml cloud_service_name
66
+ end
67
+
68
+ it 'uses name for label if label not provided' do
69
+ results = subject.cloud_services_to_xml(
70
+ cloud_service_name,
71
+
72
+ location: 'East Asia'
73
+
74
+ )
75
+
76
+ doc = Nokogiri::XML(results)
77
+ Base64.decode64(doc.css('Label').text).must_equal(cloud_service_name)
78
+ end
79
+
80
+ it 'uses label when label is provided' do
81
+ results = subject.cloud_services_to_xml(
82
+ cloud_service_name,
83
+
84
+ location: 'East Asia',
85
+ label: 'My Label'
86
+
87
+ )
88
+
89
+ doc = Nokogiri::XML(results)
90
+ Base64.decode64(doc.css('Label').text).must_equal('My Label')
91
+ end
92
+
93
+ it 'serializes the argument to xml' do
94
+ results = subject.cloud_services_to_xml(
95
+ cloud_service_name, location: 'West US'
96
+ )
97
+ results.must_be_kind_of String
98
+ doc = Nokogiri::XML results
99
+ doc.css('ServiceName').text.must_equal cloud_service_name
100
+ doc.css('Location').text.must_equal 'West US'
101
+ end
102
+
103
+ it 'uses affinity_group if provided and ignores location' do
104
+ results = subject.cloud_services_to_xml(
105
+ cloud_service_name,
106
+
107
+ affinity_group_name: 'my-affinity-group',
108
+ location: 'West US'
109
+
110
+ )
111
+ results.must_be_kind_of String
112
+ doc = Nokogiri::XML results
113
+ doc.css('ServiceName').text.must_equal(cloud_service_name)
114
+ doc.css('AffinityGroup').wont_be_empty
115
+ doc.css('AffinityGroup').text.must_equal('my-affinity-group')
116
+ doc.css('Location').must_be_empty
117
+ end
118
+
119
+ it 'uses location when affinity group not provided' do
120
+ results = subject.cloud_services_to_xml(
121
+ cloud_service_name,
122
+
123
+ location: 'East Asia'
124
+
125
+ )
126
+
127
+ doc = Nokogiri::XML(results)
128
+ doc.css('AffinityGroup').must_be_empty
129
+ doc.css('Location').wont_be_empty
130
+ doc.css('Location').text.must_equal('East Asia')
131
+ end
132
+
133
+ it 'serializes extended properties when provided' do
134
+ xtended_props = {
135
+ prop_1_name: 'prop_1_value',
136
+ prop_2_name: 'prop_2_value'
137
+ }
138
+ results = subject.cloud_services_to_xml(
139
+ cloud_service_name,
140
+
141
+ extended_properties: xtended_props
142
+
143
+ )
144
+
145
+ doc = Nokogiri::XML(results)
146
+ props_xml = doc.css('ExtendedProperties ExtendedProperty')
147
+ props_xml.wont_be_empty
148
+ props_xml.size.must_equal(2)
149
+ props_xml.css('Name').first.text.must_equal('prop_1_name')
150
+ props_xml.css('Value').first.text.must_equal(
151
+ xtended_props[:"#{props_xml.css('Name').first.text}"]
152
+ )
153
+ props_xml.css('Name').last.text.must_equal('prop_2_name')
154
+ props_xml.css('Value').last.text.must_equal(
155
+ xtended_props[:"#{props_xml.css('Name').last.text}"]
156
+ )
157
+ end
158
+
159
+ it 'serializes the options hash to xml' do
160
+ results = subject.cloud_services_to_xml(
161
+ cloud_service_name,
162
+ location: 'East US'
163
+ )
164
+ doc = Nokogiri::XML results
165
+ doc.css('Location').text.must_equal 'East US'
166
+ results.must_be_kind_of String
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,51 @@
1
+ #-------------------------------------------------------------------------
2
+ # # Copyright (c) Microsoft and contributors. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ require "test_helper"
16
+ require "azure/core/auth/shared_key_lite"
17
+
18
+ describe Azure::Core::Auth::SharedKeyLite do
19
+ subject { Azure::Core::Auth::SharedKeyLite.new "account-name", "YWNjZXNzLWtleQ==" }
20
+
21
+ let(:method) { "POST" }
22
+ let(:uri) { URI.parse "http://dummy.uri/resource" }
23
+ let(:headers) do
24
+ {
25
+ "Content-MD5"=> "foo",
26
+ "Content-Type"=> "foo",
27
+ "Date"=> "foo"
28
+ }
29
+ end
30
+ let(:headers_without_date) {
31
+ headers_without_date = headers.clone
32
+ headers_without_date.delete "Date"
33
+ headers_without_date
34
+ }
35
+
36
+ describe "sign" do
37
+ it "creates a signature from the provided HTTP method, uri, and reduced set of standard headers" do
38
+ subject.sign(method, uri, headers).must_equal "account-name:vVFnj/+27JFABZgpt5H8g/JVU2HuWFnjv5aeUIxQvBE="
39
+ end
40
+
41
+ it "ignores standard headers other than Content-MD5, Content-Type, and Date" do
42
+ subject.sign(method, uri, headers.merge({"Content-Encoding"=> "foo"})).must_equal "account-name:vVFnj/+27JFABZgpt5H8g/JVU2HuWFnjv5aeUIxQvBE="
43
+ end
44
+
45
+ it "throws IndexError when there is no Date header" do
46
+ assert_raises IndexError do
47
+ subject.sign(method, uri, headers_without_date)
48
+ end
49
+ end
50
+ end
51
+ end