azure-fix 0.7.0.pre3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. checksums.yaml +7 -0
  2. data/.env_sample +13 -0
  3. data/.gitignore +30 -0
  4. data/.travis.yml +13 -0
  5. data/ChangeLog.txt +56 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +702 -0
  9. data/Rakefile +121 -0
  10. data/azure.gemspec +51 -0
  11. data/bin/pfxer +35 -0
  12. data/lib/azure.rb +147 -0
  13. data/lib/azure/base_management/affinity_group.rb +32 -0
  14. data/lib/azure/base_management/base_management_service.rb +220 -0
  15. data/lib/azure/base_management/location.rb +27 -0
  16. data/lib/azure/base_management/management_http_request.rb +172 -0
  17. data/lib/azure/base_management/serialization.rb +135 -0
  18. data/lib/azure/base_management/sql_management_http_request.rb +35 -0
  19. data/lib/azure/blob/auth/shared_access_signature.rb +147 -0
  20. data/lib/azure/blob/blob.rb +32 -0
  21. data/lib/azure/blob/blob_service.rb +1452 -0
  22. data/lib/azure/blob/block.rb +31 -0
  23. data/lib/azure/blob/container.rb +32 -0
  24. data/lib/azure/blob/serialization.rb +285 -0
  25. data/lib/azure/client.rb +31 -0
  26. data/lib/azure/client_services.rb +98 -0
  27. data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
  28. data/lib/azure/cloud_service_management/cloud_service_management_service.rb +135 -0
  29. data/lib/azure/cloud_service_management/serialization.rb +118 -0
  30. data/lib/azure/configurable.rb +290 -0
  31. data/lib/azure/core/auth/authorizer.rb +36 -0
  32. data/lib/azure/core/auth/shared_key.rb +118 -0
  33. data/lib/azure/core/auth/shared_key_lite.rb +48 -0
  34. data/lib/azure/core/auth/signer.rb +51 -0
  35. data/lib/azure/core/error.rb +21 -0
  36. data/lib/azure/core/filtered_service.rb +45 -0
  37. data/lib/azure/core/http/debug_filter.rb +36 -0
  38. data/lib/azure/core/http/http_error.rb +86 -0
  39. data/lib/azure/core/http/http_filter.rb +53 -0
  40. data/lib/azure/core/http/http_request.rb +173 -0
  41. data/lib/azure/core/http/http_response.rb +96 -0
  42. data/lib/azure/core/http/retry_policy.rb +74 -0
  43. data/lib/azure/core/http/signer_filter.rb +33 -0
  44. data/lib/azure/core/service.rb +46 -0
  45. data/lib/azure/core/signed_service.rb +45 -0
  46. data/lib/azure/core/utility.rb +244 -0
  47. data/lib/azure/default.rb +126 -0
  48. data/lib/azure/http_client.rb +85 -0
  49. data/lib/azure/queue/message.rb +30 -0
  50. data/lib/azure/queue/queue.rb +28 -0
  51. data/lib/azure/queue/queue_service.rb +570 -0
  52. data/lib/azure/queue/serialization.rb +105 -0
  53. data/lib/azure/service/access_policy.rb +26 -0
  54. data/lib/azure/service/cors.rb +11 -0
  55. data/lib/azure/service/cors_rule.rb +15 -0
  56. data/lib/azure/service/enumeration_results.rb +21 -0
  57. data/lib/azure/service/logging.rb +32 -0
  58. data/lib/azure/service/metrics.rb +31 -0
  59. data/lib/azure/service/retention_policy.rb +25 -0
  60. data/lib/azure/service/serialization.rb +299 -0
  61. data/lib/azure/service/signed_identifier.rb +30 -0
  62. data/lib/azure/service/storage_service.rb +86 -0
  63. data/lib/azure/service/storage_service_properties.rb +37 -0
  64. data/lib/azure/service_bus/action.rb +21 -0
  65. data/lib/azure/service_bus/auth/shared_access_signer.rb +44 -0
  66. data/lib/azure/service_bus/auth/wrap_service.rb +90 -0
  67. data/lib/azure/service_bus/auth/wrap_signer.rb +77 -0
  68. data/lib/azure/service_bus/brokered_message.rb +124 -0
  69. data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
  70. data/lib/azure/service_bus/correlation_filter.rb +45 -0
  71. data/lib/azure/service_bus/empty_rule_action.rb +30 -0
  72. data/lib/azure/service_bus/false_filter.rb +38 -0
  73. data/lib/azure/service_bus/filter.rb +21 -0
  74. data/lib/azure/service_bus/interval.rb +104 -0
  75. data/lib/azure/service_bus/queue.rb +230 -0
  76. data/lib/azure/service_bus/relay.rb +88 -0
  77. data/lib/azure/service_bus/resource.rb +109 -0
  78. data/lib/azure/service_bus/rule.rb +98 -0
  79. data/lib/azure/service_bus/rule_aspect.rb +34 -0
  80. data/lib/azure/service_bus/serialization.rb +161 -0
  81. data/lib/azure/service_bus/service_bus_service.rb +899 -0
  82. data/lib/azure/service_bus/sql_filter.rb +50 -0
  83. data/lib/azure/service_bus/sql_rule_action.rb +50 -0
  84. data/lib/azure/service_bus/subscription.rb +184 -0
  85. data/lib/azure/service_bus/topic.rb +187 -0
  86. data/lib/azure/service_bus/true_filter.rb +38 -0
  87. data/lib/azure/sql_database_management/errors.rb +11 -0
  88. data/lib/azure/sql_database_management/firewall_rule.rb +30 -0
  89. data/lib/azure/sql_database_management/serialization.rb +99 -0
  90. data/lib/azure/sql_database_management/sql_database_management_service.rb +211 -0
  91. data/lib/azure/sql_database_management/sql_server.rb +32 -0
  92. data/lib/azure/storage_management/serialization.rb +204 -0
  93. data/lib/azure/storage_management/storage_account.rb +48 -0
  94. data/lib/azure/storage_management/storage_management_service.rb +207 -0
  95. data/lib/azure/table/auth/shared_key.rb +59 -0
  96. data/lib/azure/table/auth/shared_key_lite.rb +44 -0
  97. data/lib/azure/table/batch.rb +330 -0
  98. data/lib/azure/table/batch_response.rb +118 -0
  99. data/lib/azure/table/edmtype.rb +127 -0
  100. data/lib/azure/table/entity.rb +31 -0
  101. data/lib/azure/table/guid.rb +24 -0
  102. data/lib/azure/table/query.rb +112 -0
  103. data/lib/azure/table/serialization.rb +108 -0
  104. data/lib/azure/table/table_service.rb +563 -0
  105. data/lib/azure/version.rb +31 -0
  106. data/lib/azure/virtual_machine_image_management/serialization.rb +70 -0
  107. data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
  108. data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
  109. data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +83 -0
  110. data/lib/azure/virtual_machine_management/serialization.rb +459 -0
  111. data/lib/azure/virtual_machine_management/virtual_machine.rb +44 -0
  112. data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +552 -0
  113. data/lib/azure/virtual_network_management/serialization.rb +193 -0
  114. data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
  115. data/lib/azure/virtual_network_management/virtual_network_management_service.rb +108 -0
  116. data/test/fixtures/32px-fulls-black.jpg +0 -0
  117. data/test/fixtures/affinity_group.xml +33 -0
  118. data/test/fixtures/all_containers.xml +20 -0
  119. data/test/fixtures/all_tables.xml +22 -0
  120. data/test/fixtures/container_acl.xml +11 -0
  121. data/test/fixtures/create_sql_database_server.xml +2 -0
  122. data/test/fixtures/create_storage_desc_error.xml +5 -0
  123. data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
  124. data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
  125. data/test/fixtures/create_storage_full_error.xml +6 -0
  126. data/test/fixtures/create_storage_label_error.xml +5 -0
  127. data/test/fixtures/create_storage_location_error.xml +5 -0
  128. data/test/fixtures/create_storage_name_error.xml +6 -0
  129. data/test/fixtures/create_table_response_entry.xml +15 -0
  130. data/test/fixtures/delete_storage_container_error.xml +5 -0
  131. data/test/fixtures/delete_storage_error.xml +5 -0
  132. data/test/fixtures/deployment_error.xml +5 -0
  133. data/test/fixtures/empty_xml_file +0 -0
  134. data/test/fixtures/get_storage_account_error.xml +5 -0
  135. data/test/fixtures/get_storage_account_properties.xml +34 -0
  136. data/test/fixtures/get_storage_account_properties_new.xml +32 -0
  137. data/test/fixtures/http_error.xml +5 -0
  138. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  139. data/test/fixtures/list_affinity_groups.xml +22 -0
  140. data/test/fixtures/list_blobs.xml +121 -0
  141. data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
  142. data/test/fixtures/list_blocks_all.xml +23 -0
  143. data/test/fixtures/list_blocks_committed.xml +13 -0
  144. data/test/fixtures/list_cloud_services.xml +39 -0
  145. data/test/fixtures/list_containers.xml +38 -0
  146. data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
  147. data/test/fixtures/list_locations.xml +212 -0
  148. data/test/fixtures/list_os_images.xml +110 -0
  149. data/test/fixtures/list_page_ranges.xml +11 -0
  150. data/test/fixtures/list_sql_database.xml +24 -0
  151. data/test/fixtures/list_sql_server_firewall.xml +23 -0
  152. data/test/fixtures/list_storage_account_single.xml +25 -0
  153. data/test/fixtures/list_storage_accounts.xml +48 -0
  154. data/test/fixtures/list_virtual_networks.xml +92 -0
  155. data/test/fixtures/list_vm_images.xml +21 -0
  156. data/test/fixtures/logging.xml +11 -0
  157. data/test/fixtures/management_certificate.pfx +0 -0
  158. data/test/fixtures/messages.xml +12 -0
  159. data/test/fixtures/metrics.xml +10 -0
  160. data/test/fixtures/privatekey.key +28 -0
  161. data/test/fixtures/query_entities_empty_response.xml +7 -0
  162. data/test/fixtures/query_entities_response.xml +45 -0
  163. data/test/fixtures/queue_service_properties.xml +22 -0
  164. data/test/fixtures/queue_service_properties_original.xml +19 -0
  165. data/test/fixtures/queues.xml +16 -0
  166. data/test/fixtures/retention_policy.xml +5 -0
  167. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  168. data/test/fixtures/sb_default_create_relay_response.xml +15 -0
  169. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  170. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  171. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  172. data/test/fixtures/storage_service_keys.xml +8 -0
  173. data/test/fixtures/storage_service_properties.xml +55 -0
  174. data/test/fixtures/update_storage_account.xml +16 -0
  175. data/test/fixtures/update_storage_error.xml +5 -0
  176. data/test/fixtures/updated_storage_accounts.xml +55 -0
  177. data/test/fixtures/virtual_machine.xml +116 -0
  178. data/test/fixtures/windows_virtual_machine.xml +106 -0
  179. data/test/integration/affinity_group/Affinity_test.rb +55 -0
  180. data/test/integration/affinity_group/Create_Affinity_test.rb +64 -0
  181. data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
  182. data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
  183. data/test/integration/affinity_group/Update_Affinity_test.rb +87 -0
  184. data/test/integration/blob/blob_gb18030_test.rb +199 -0
  185. data/test/integration/blob/blob_metadata_test.rb +75 -0
  186. data/test/integration/blob/blob_pages_test.rb +119 -0
  187. data/test/integration/blob/blob_properties_test.rb +77 -0
  188. data/test/integration/blob/block_blob_test.rb +254 -0
  189. data/test/integration/blob/container/container_acl_test.rb +69 -0
  190. data/test/integration/blob/container/container_metadata_test.rb +50 -0
  191. data/test/integration/blob/container/create_container_test.rb +60 -0
  192. data/test/integration/blob/container/delete_container_test.rb +39 -0
  193. data/test/integration/blob/container/get_container_properties_test.rb +48 -0
  194. data/test/integration/blob/container/list_containers_test.rb +79 -0
  195. data/test/integration/blob/container/root_container_test.rb +55 -0
  196. data/test/integration/blob/copy_blob_test.rb +113 -0
  197. data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
  198. data/test/integration/blob/create_page_blob_test.rb +83 -0
  199. data/test/integration/blob/delete_blob_test.rb +159 -0
  200. data/test/integration/blob/get_blob_test.rb +65 -0
  201. data/test/integration/blob/informative_errors_test.rb +39 -0
  202. data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
  203. data/test/integration/blob/lease/break_lease_test.rb +40 -0
  204. data/test/integration/blob/lease/release_lease_test.rb +40 -0
  205. data/test/integration/blob/lease/renew_lease_test.rb +42 -0
  206. data/test/integration/blob/list_blobs_test.rb +113 -0
  207. data/test/integration/cloud_service/Cloud_Create_test.rb +45 -0
  208. data/test/integration/cloud_service/Cloud_Delete_test.rb +45 -0
  209. data/test/integration/database/create_sql_server_firewall_test.rb +81 -0
  210. data/test/integration/database/create_sql_server_test.rb +53 -0
  211. data/test/integration/database/delete_sql_server_firewall_test.rb +64 -0
  212. data/test/integration/database/delete_sql_server_test.rb +45 -0
  213. data/test/integration/database/list_sql_server_firewall_test.rb +44 -0
  214. data/test/integration/database/list_sql_servers_test.rb +44 -0
  215. data/test/integration/database/reset_password_sql_server_test.rb +53 -0
  216. data/test/integration/location/Location_List_test.rb +39 -0
  217. data/test/integration/location/RoleSize_List_test.rb +35 -0
  218. data/test/integration/queue/clear_messages_test.rb +42 -0
  219. data/test/integration/queue/create_message_test.rb +75 -0
  220. data/test/integration/queue/create_queue_test.rb +50 -0
  221. data/test/integration/queue/delete_message_test.rb +67 -0
  222. data/test/integration/queue/delete_queue_test.rb +45 -0
  223. data/test/integration/queue/informative_errors_test.rb +42 -0
  224. data/test/integration/queue/list_messages_encoded_test.rb +79 -0
  225. data/test/integration/queue/list_messages_test.rb +79 -0
  226. data/test/integration/queue/list_queues_test.rb +43 -0
  227. data/test/integration/queue/peek_messages_test.rb +59 -0
  228. data/test/integration/queue/queue_gb18030_test.rb +131 -0
  229. data/test/integration/queue/queue_metadata_test.rb +40 -0
  230. data/test/integration/queue/update_message_test.rb +74 -0
  231. data/test/integration/service_bus/informative_errors_test.rb +37 -0
  232. data/test/integration/service_bus/queues_scenario_test.rb +200 -0
  233. data/test/integration/service_bus/queues_test.rb +266 -0
  234. data/test/integration/service_bus/relay_test.rb +132 -0
  235. data/test/integration/service_bus/rules_test.rb +145 -0
  236. data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
  237. data/test/integration/service_bus/scenario_test.rb +101 -0
  238. data/test/integration/service_bus/subscriptions_test.rb +211 -0
  239. data/test/integration/service_bus/topics_scenario_test.rb +406 -0
  240. data/test/integration/service_bus/topics_test.rb +129 -0
  241. data/test/integration/storage_management/storage_management_test.rb +185 -0
  242. data/test/integration/table/create_table_test.rb +36 -0
  243. data/test/integration/table/delete_entity_batch_test.rb +107 -0
  244. data/test/integration/table/delete_entity_test.rb +94 -0
  245. data/test/integration/table/delete_table_test.rb +40 -0
  246. data/test/integration/table/get_table_test.rb +37 -0
  247. data/test/integration/table/informative_errors_test.rb +39 -0
  248. data/test/integration/table/insert_entity_batch_test.rb +100 -0
  249. data/test/integration/table/insert_entity_test.rb +88 -0
  250. data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
  251. data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
  252. data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
  253. data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
  254. data/test/integration/table/merge_entity_batch_test.rb +128 -0
  255. data/test/integration/table/merge_entity_test.rb +113 -0
  256. data/test/integration/table/query_entities_test.rb +196 -0
  257. data/test/integration/table/query_tables_test.rb +43 -0
  258. data/test/integration/table/query_test.rb +251 -0
  259. data/test/integration/table/table_acl_test.rb +52 -0
  260. data/test/integration/table/table_gb18030_test.rb +355 -0
  261. data/test/integration/table/update_entity_batch_test.rb +149 -0
  262. data/test/integration/table/update_entity_test.rb +131 -0
  263. data/test/integration/test_helper.rb +40 -0
  264. data/test/integration/vm/VM_Create_test.rb +262 -0
  265. data/test/integration/vm/VM_Delete_test.rb +53 -0
  266. data/test/integration/vm/VM_Operations_test.rb +172 -0
  267. data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
  268. data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
  269. data/test/integration/vnet/Virtual_Network_Create_test.rb +116 -0
  270. data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
  271. data/test/support/env.rb +19 -0
  272. data/test/support/fixtures.rb +36 -0
  273. data/test/support/name_generator.rb +168 -0
  274. data/test/support/stubs.rb +42 -0
  275. data/test/support/virtual_machine_name_generator.rb +102 -0
  276. data/test/support/virtual_network_helper.rb +73 -0
  277. data/test/test_helper.rb +47 -0
  278. data/test/unit/affinity_group/affinity_group_test.rb +189 -0
  279. data/test/unit/affinity_group/serialization_test.rb +87 -0
  280. data/test/unit/base_management/base_management_service_test.rb +19 -0
  281. data/test/unit/base_management/location_test.rb +56 -0
  282. data/test/unit/base_management/role_size_test.rb +50 -0
  283. data/test/unit/blob/auth/shared_access_signature_test.rb +71 -0
  284. data/test/unit/blob/blob_service_test.rb +1970 -0
  285. data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -0
  286. data/test/unit/cloud_service_management/serialization_test.rb +169 -0
  287. data/test/unit/config/azure_test.rb +112 -0
  288. data/test/unit/config/client_test.rb +37 -0
  289. data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
  290. data/test/unit/core/auth/shared_key_test.rb +58 -0
  291. data/test/unit/core/auth/signer_test.rb +30 -0
  292. data/test/unit/core/http/http_error_test.rb +61 -0
  293. data/test/unit/core/http/http_request_test.rb +138 -0
  294. data/test/unit/core/http/http_response_test.rb +20 -0
  295. data/test/unit/core/http/retry_policy_test.rb +23 -0
  296. data/test/unit/core/utility_test.rb +122 -0
  297. data/test/unit/database/serialization_test.rb +94 -0
  298. data/test/unit/database/sql_database_server_service_test.rb +341 -0
  299. data/test/unit/http_client_test.rb +74 -0
  300. data/test/unit/service/serialization_test.rb +533 -0
  301. data/test/unit/service/storage_service_test.rb +297 -0
  302. data/test/unit/storage_management/serialization_test.rb +244 -0
  303. data/test/unit/storage_management/storage_management_service_test.rb +247 -0
  304. data/test/unit/table/edmtype_test.rb +108 -0
  305. data/test/unit/virtual_machine_image_management/serialization_test.rb +50 -0
  306. data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +114 -0
  307. data/test/unit/virtual_machine_management/serialization_test.rb +316 -0
  308. data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +480 -0
  309. data/test/unit/vnet/serialization_test.rb +187 -0
  310. data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
  311. metadata +579 -0
@@ -0,0 +1,38 @@
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 'azure/service_bus/sql_filter'
16
+
17
+ module Azure
18
+ module ServiceBus
19
+ class TrueFilter < SqlFilter
20
+ # Public: Initialize the SQL True Filter.
21
+ #
22
+ # ==== Attributes
23
+ #
24
+ # * +hash+ - The resource options Hash
25
+ #
26
+ # ==== Options
27
+ #
28
+ # Accepted key/value pairs in options parameter are:
29
+ # * +:sql_expression+ - The SQL expression.
30
+ #
31
+ def initialize(hash=nil)
32
+ hash = {} unless hash
33
+ hash[:sql_expression] = "1 = 1" unless hash[:sql_expression]
34
+ super(hash)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+
2
+ module Azure
3
+ module SqlDatabaseManagement
4
+ # Generic error for SQL Management activities
5
+ class Error < Azure::Core::Error;end
6
+ # Server does not exist error for SQL Management activities
7
+ class ServerDoesNotExist < Azure::Core::Error;end
8
+ # Firewall Rule does not exist error for SQL Management activities
9
+ class RuleDoesNotExist < Azure::Core::Error;end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2015 Microsoft Open Technologies, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ module Azure
16
+ module SqlDatabaseManagement
17
+ class FirewallRule
18
+
19
+ def initialize
20
+ yield self if block_given?
21
+ end
22
+
23
+ attr_accessor :name
24
+ attr_accessor :type
25
+ attr_accessor :start_ip_address
26
+ attr_accessor :end_ip_address
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,99 @@
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/sql_database_management/sql_server'
16
+ require 'azure/sql_database_management/firewall_rule'
17
+
18
+ module Azure
19
+ module SqlDatabaseManagement
20
+ module Serialization
21
+ extend Azure::Core::Utility
22
+
23
+ def self.server_to_xml(login, password, location, version = 12.0)
24
+ builder = Nokogiri::XML::Builder.new do |xml|
25
+ xml.Server('xmlns' => 'http://schemas.microsoft.com/sqlazure/2010/12/') {
26
+ xml.AdministratorLogin login
27
+ xml.AdministratorLoginPassword password
28
+ xml.Location location
29
+ xml.Version version
30
+ }
31
+ end
32
+ builder.doc.to_xml
33
+ end
34
+
35
+ def self.servers_from_xml(wrapper_XML)
36
+ servers_XML = wrapper_XML.css('Servers Server')
37
+ servers_XML.map do |server_xml|
38
+ server = SqlServer.new
39
+ server.name = xml_content(server_xml, 'Name')
40
+ server.administrator_login = xml_content(server_xml, 'AdministratorLogin')
41
+ server.location = xml_content(server_xml, 'Location')
42
+ server.version = xml_content(server_xml, 'Version')
43
+ server.state = xml_content(server_xml, 'State')
44
+ server.fully_qualified_domain_name = xml_content(server_xml, 'FullyQualifiedDomainName')
45
+ server
46
+ end
47
+ end
48
+
49
+ def self.server_name_from_xml(response_xml, login, location, version)
50
+ server_name = xml_content(response_xml, 'ServerName')
51
+ SqlServer.new do |db|
52
+ db.name = server_name
53
+ db.location = location
54
+ db.administrator_login = login
55
+ db.version = version
56
+ db.fully_qualified_domain_name = response_xml.css('ServerName').first['FullyQualifiedDomainName']
57
+ end
58
+ end
59
+
60
+ def self.reset_password_to_xml(password)
61
+ builder = Nokogiri::XML::Builder.new do |xml|
62
+ xml.AdministratorLoginPassword(password, {'xmlns' => 'http://schemas.microsoft.com/sqlazure/2010/12/'})
63
+ end
64
+ builder.doc.to_xml
65
+ end
66
+
67
+ # Serialize a firewall rule to xml
68
+ # @param rule [Azure::SqlDatabaseManagement::FirewallRule] The firewall rule to serialize
69
+ # @return [String] xml document contain the firewall rule
70
+ def self.firewall_rule_to_xml(rule)
71
+ builder = Nokogiri::XML::Builder.new do |xml|
72
+ xml.ServiceResource('xmlns' => 'http://schemas.microsoft.com/windowsazure') {
73
+ xml.Name rule.name
74
+ xml.StartIPAddress rule.start_ip_address
75
+ xml.EndIPAddress rule.end_ip_address
76
+ }
77
+ end
78
+ builder.doc.to_xml
79
+ end
80
+
81
+ # Create a list of firewall hashes from xml
82
+ # @param response_xml The xml containing the list of ServiceResources (firewall rules)
83
+ # @return [Array<Azure::SqlDatabaseManagement::FirewallRule>]
84
+ def self.database_firewall_from_xml(response_xml)
85
+ service_resources = response_xml.css(
86
+ 'ServiceResources ServiceResource'
87
+ )
88
+ service_resources.map do |resource|
89
+ FirewallRule.new do |rule|
90
+ rule.name = xml_content(resource, 'Name')
91
+ rule.type = xml_content(resource, 'Type')
92
+ rule.start_ip_address = xml_content(resource, 'StartIPAddress')
93
+ rule.end_ip_address = xml_content(resource, 'EndIPAddress')
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,211 @@
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
+ require 'socket'
17
+ require 'azure/sql_database_management/sql_server'
18
+ require 'azure/sql_database_management/firewall_rule'
19
+ require 'azure/sql_database_management/serialization'
20
+ require 'azure/sql_database_management/errors'
21
+
22
+ module Azure
23
+ module SqlDatabaseManagement
24
+ # Service for managing SQL Azure servers and databases
25
+ class SqlDatabaseManagementService < BaseManagement::BaseManagementService
26
+
27
+ # Gets a list of database servers available under the current subscription.
28
+ #
29
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715269.aspx
30
+ #
31
+ # @return Array<Azure::SqlDatabaseManagement::SqlServer>
32
+ def list_servers
33
+ response = client.sql_management_request(:get, servers_path).call
34
+ Serialization.servers_from_xml(response)
35
+ end
36
+
37
+ # Create a new sql server in Microsoft Azure.
38
+ #
39
+ # @param login [String] The administrator login name.
40
+ # @param password [String] The administrator login password.
41
+ # @param location [String] The location where the database server will be created.
42
+ # @param version [String|Integer] The version of the SQL server (default 12.0)
43
+ #
44
+ # @see https://msdn.microsoft.com/en-us/library/azure/dn505699.aspx
45
+ #
46
+ # @return [Azure::SqlDatabaseManagement::SqlServer]
47
+ def create_server(login, password, location, version = 12.0)
48
+ body = Serialization.server_to_xml(login, password, location, version)
49
+ server_names = list_servers.map(&:name)
50
+ created_server = nil
51
+
52
+ begin
53
+ response = client.sql_management_request(:post, servers_path, body: body, warn: true).call
54
+ created_server = Serialization.server_name_from_xml(response, login, location, version)
55
+ rescue RuntimeError => ex
56
+ if ex.message =~ /Please retry the request/
57
+ created_server = list_servers.reject{|server| server_names.include?(server.name)}.first
58
+ # sometimes the service returns 500, but it doesn't really mean it.
59
+ #
60
+ # If the operation returns success, the operation is complete and the server is created immediately. If the
61
+ # operation fails because of a user error, a server is not created. If there is a communication error or
62
+ # internal server error, you should check the status of the operation using List Servers.
63
+ #
64
+ raise unless created_server
65
+ else
66
+ raise
67
+ end
68
+ end
69
+ Azure::Loggerx.info "SQL database server #{created_server.name} is created." if created_server
70
+ created_server
71
+ end
72
+
73
+ # Deletes the specified database server of given subscription id from Microsoft Azure.
74
+ #
75
+ # @param name [String] SqlServer name.
76
+ #
77
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715285.aspx
78
+ #
79
+ # @return [void]
80
+ def delete_server(name)
81
+ ensure_server_exists!(name)
82
+ client.sql_management_request(:delete, servers_path(name)).call
83
+ Azure::Loggerx.info "Deleted database server #{name}."
84
+ end
85
+
86
+ # Sets the administrative password of a SQL Database server for a subscription. Will raise
87
+ # Azure::SqlManagement::Error if server does not exist.
88
+ #
89
+ # @param name [String] SqlServer name.
90
+ # @param password [String] SqlServer new password.
91
+ #
92
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715272.aspx
93
+ #
94
+ # @return [void]
95
+ def reset_password(name, password)
96
+ ensure_server_exists!(name)
97
+ body = Serialization.reset_password_to_xml(password)
98
+ request_path = servers_path + "#{name}?op=ResetPassword"
99
+ request = client.sql_management_request(:post, request_path, body)
100
+ request.call
101
+ Azure::Loggerx.info "Password for server #{name} changed successfully."
102
+ end
103
+
104
+ # Adds a new server-level firewall or updates an existing server-level firewall rule for a SQL Database server.
105
+ #
106
+ # @param server_name [String] SqlServer server name.
107
+ # @param rule_name [String] Firewall rule name.
108
+ # @param start_ip [String] The lowest IP address in the range of the server-level firewall setting.
109
+ # IP addresses equal to or greater than this can attempt to connect to the server.
110
+ # The lowest possible IP address is 0.0.0.0. (default: first local public ip)
111
+ # @param end_ip [String] The highest IP address in the range of the server-level firewall setting. IP
112
+ # addresses equal to or less than this can attempt to connect to the server. The
113
+ # highest possible IP address is 255.255.255.255. (default: first local public ip)
114
+ #
115
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715280.aspx
116
+ #
117
+ # @return [void]
118
+ def set_sql_server_firewall_rule(server_name, rule_name, start_ip = public_ipv4, end_ip = public_ipv4)
119
+
120
+ if [server_name, rule_name, start_ip, end_ip].any? { |arg| arg.nil? || arg.empty? || !arg.kind_of?(String) }
121
+ raise ArgumentError.new('Missing or empty parameter server_name, rule_name, start_ip or end_ip')
122
+ end
123
+
124
+ fw_rule = FirewallRule.new do |rule|
125
+ rule.name = rule_name
126
+ rule.start_ip_address = start_ip
127
+ rule.end_ip_address = end_ip
128
+ end
129
+
130
+ body = Serialization.firewall_rule_to_xml(fw_rule)
131
+ method = if list_sql_server_firewall_rules(server_name).any? { |rule| rule.name == rule_name }
132
+ # the rule exists, so we need to update the rule
133
+ :put
134
+ else
135
+ # the rule doesn't exist, so we need to create the rule
136
+ :post
137
+ end
138
+ request_path = servers_path "#{server_name}/firewallrules/#{method == :put ? rule_name : ''}"
139
+ client.sql_management_request(method, request_path, body).call
140
+ Azure::Loggerx.info "Modified server-level firewall rule #{rule_name}."
141
+ end
142
+
143
+ # Gets a list of server-level firewall rules set for SQL database servers. Will raise
144
+ # Azure::SqlManagement::Error if server does not exist.
145
+ #
146
+ # @param server_name [String] Database server name.
147
+ #
148
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715278.aspx
149
+ #
150
+ # @return [Array<Azure::SqlDatabaseManagement::FirewallRule>]
151
+ def list_sql_server_firewall_rules(server_name)
152
+ ensure_server_exists!(server_name)
153
+ response = client.sql_management_request(:get, servers_path("#{server_name}/firewallrules")).call
154
+ Serialization.database_firewall_from_xml(response)
155
+ end
156
+
157
+ # Deletes a server-level firewall rule from a SQL Database server. Will raise
158
+ # Azure::SqlManagement::Error if server does not exist.
159
+ #
160
+ # @param server_name [String] SQL database server name.
161
+ # @param rule_name [String] SQL database server firewall rule name.
162
+ #
163
+ # @see http://msdn.microsoft.com/en-us/library/azure/gg715277.aspx
164
+ #
165
+ # @return [void]
166
+ def delete_sql_server_firewall_rule(server_name, rule_name)
167
+ ensure_server_exists!(server_name)
168
+ if list_sql_server_firewall_rules(server_name).any? { |rule| rule.name == rule_name }
169
+ request_path = servers_path "#{server_name}/firewallrules/#{rule_name}"
170
+ client.sql_management_request(:delete, request_path).call
171
+ Azure::Loggerx.info "Deleted server-level firewall rule #{rule_name}."
172
+ else
173
+ raise RuleDoesNotExist.new("Firewall rule named #{rule_name} does not exist for server named #{server_name}")
174
+ end
175
+ end
176
+
177
+ private
178
+
179
+ def servers_path(end_path = '')
180
+ '/servers' + if end_path.start_with?('/')
181
+ end_path
182
+ elsif end_path.empty?
183
+ ''
184
+ else
185
+ "/#{end_path}"
186
+ end
187
+ end
188
+
189
+ # Ensures the a database server of a given name exists and raises Azure::SqlManagement::ServerDoesNotExist if it
190
+ # does not exist
191
+ #
192
+ # @param server_name [String] The name of the Azure SQL Server
193
+ # @return [void] Returns true if the server exists
194
+ def ensure_server_exists!(server_name)
195
+ raise ServerDoesNotExist.new("Server named #{server_name} does not exist.") unless server_exists?(server_name)
196
+ end
197
+
198
+ def server_exists?(server_name)
199
+ ArgumentError.new('Servername cannot be empty or null.') if server_name.empty?
200
+ list_servers.any? { |server| server.name == server_name }
201
+ end
202
+
203
+ def public_ipv4
204
+ @public_ip ||= `curl -s whatismyip.akamai.com`
205
+ end
206
+
207
+ end
208
+ end
209
+ end
210
+
211
+ Azure::SqlDatabaseManagementService = Azure::SqlDatabaseManagement::SqlDatabaseManagementService
@@ -0,0 +1,32 @@
1
+ #-------------------------------------------------------------------------
2
+ # Copyright 2013 Microsoft Open Technologies, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ #--------------------------------------------------------------------------
15
+ module Azure
16
+ module SqlDatabaseManagement
17
+ class SqlServer
18
+
19
+ def initialize
20
+ yield self if block_given?
21
+ end
22
+
23
+ attr_accessor :name
24
+ attr_accessor :administrator_login
25
+ attr_accessor :location
26
+ attr_accessor :fully_qualified_domain_name
27
+ attr_accessor :version
28
+ attr_accessor :state
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,204 @@
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 'base64'
16
+ require 'azure/storage_management/storage_account'
17
+
18
+ module Azure
19
+ module StorageManagement
20
+ # Storage management serialization module is responsible for converting
21
+ # the objects to XML and vice versa.
22
+ module Serialization
23
+ extend Azure::Core::Utility
24
+ def self.storage_services_to_xml(name, options = {})
25
+ builder = Nokogiri::XML::Builder.new do |xml|
26
+ xml.CreateStorageServiceInput(
27
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure'
28
+ ) do
29
+ xml.ServiceName(name)
30
+ label = options[:label] || name
31
+ xml.Label(Base64.encode64(label))
32
+ xml.Description options[:description]\
33
+ || 'Explicitly created storage service'
34
+ unless options[:affinity_group_name].nil?
35
+ xml.AffinityGroup options[:affinity_group_name]
36
+ else
37
+ xml.Location options[:location]
38
+ end
39
+ add_options_to_xml(xml, options)
40
+ end
41
+ end
42
+ builder.doc.to_xml
43
+ end
44
+
45
+ def self.storage_services_from_xml(storage_xml)
46
+ storage_accounts = []
47
+ storage_services_xml = storage_xml.css('StorageService')
48
+ storage_services_xml.each do |storage_service_xml|
49
+ storage_account = StorageAccount.new
50
+
51
+ storage_account.url = xml_content(storage_service_xml, 'Url')
52
+ storage_account.name = xml_content(
53
+ storage_service_xml, 'ServiceName'
54
+ )
55
+ storage_service_properties = storage_service_xml.css(
56
+ 'StorageServiceProperties'
57
+ )
58
+ storage_account.description = xml_content(
59
+ storage_service_properties, 'Description'
60
+ )
61
+ storage_account.affinity_group = xml_content(
62
+ storage_service_properties, 'AffinityGroup'
63
+ )
64
+ storage_account.location = xml_content(
65
+ storage_service_properties, 'Location'
66
+ )
67
+ storage_account.label = Base64.decode64(
68
+ xml_content(storage_service_properties, 'Label')
69
+ )
70
+ storage_account.status = xml_content(
71
+ storage_service_properties, 'Status'
72
+ )
73
+ storage_account.endpoints = storage_service_properties.css(
74
+ 'Endpoints Endpoint'
75
+ ).map { |endpoint| endpoint.content }
76
+ storage_account.geo_replication_enabled = xml_content(
77
+ storage_service_properties, 'GeoReplicationEnabled'
78
+ )
79
+ storage_account.account_type = xml_content(
80
+ storage_service_properties, 'AccountType'
81
+ )
82
+ storage_account.geo_primary_region = xml_content(
83
+ storage_service_properties, 'GeoPrimaryRegion'
84
+ )
85
+ storage_account.status_of_primary = xml_content(
86
+ storage_service_properties, 'StatusOfPrimary'
87
+ )
88
+ storage_account.last_geo_failover_time = xml_content(
89
+ storage_service_properties, 'LastGeoFailoverTime'
90
+ )
91
+ storage_account.geo_secondary_region = xml_content(
92
+ storage_service_properties, 'GeoSecondaryRegion'
93
+ )
94
+ storage_account.status_of_secondary = xml_content(
95
+ storage_service_properties, 'StatusOfSecondary'
96
+ )
97
+ storage_account.creation_time = xml_content(
98
+ storage_service_properties, 'CreationTime'
99
+ )
100
+ storage_account.extended_properties = storage_service_xml.css(
101
+ 'ExtendedProperties ExtendedProperty'
102
+ ).map do |prop|
103
+ {
104
+ name: xml_content(prop, 'Name'),
105
+ value: xml_content(prop, 'Value')
106
+ }
107
+ end
108
+
109
+ storage_accounts << storage_account
110
+ end
111
+
112
+ storage_accounts.compact
113
+ end
114
+
115
+ def self.storage_update_to_xml(options)
116
+ # Cannot update if options is nil or empty
117
+ fail 'No options specified' if options.empty?
118
+
119
+ # Either one of Label, or Description is required.
120
+ if (options[:label].nil? || options[:label].empty?) &&
121
+ (options[:description].nil? || options[:description].empty?)
122
+ fail 'Either one of Label or Description'\
123
+ ' has to be provided. Both cannot be empty'
124
+ end
125
+
126
+ # The input param may not be nil or empty, but the values inside may
127
+ # be. Check if atleast one value exists before proceeding.
128
+ is_empty = true
129
+ options.each do |option, value|
130
+ case option
131
+ when :description, :label
132
+ is_empty = value.nil? || value.empty?
133
+ when :geo_replication_enabled
134
+ is_empty = !(value.is_a?(TrueClass) || value.is_a?(FalseClass))
135
+ when :extended_properties
136
+ value.each do |p, v|
137
+ is_empty = ((p.nil? || p.empty?) || (v.nil? || v.empty?))
138
+ break unless is_empty
139
+ end
140
+ end
141
+ break unless is_empty
142
+ end
143
+
144
+ # Raise a RuntimeError if no options were provided
145
+ fail 'No Options Specified' if is_empty
146
+
147
+ builder = Nokogiri::XML::Builder.new do |xml|
148
+ xml.UpdateStorageServiceInput(
149
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure'
150
+ ) do
151
+ # Check if label is nil. Use description only if label is nil
152
+ if options[:label].nil? || options[:label].empty?
153
+ desc = options[:description]
154
+ xml.Description(desc) unless desc.nil? || desc.empty?
155
+ else
156
+ label = Base64.encode64(options[:label])
157
+ xml.Label(label) unless label.nil? || label.empty?
158
+ end
159
+ add_options_to_xml(xml, options)
160
+ end
161
+ end
162
+ builder.to_xml
163
+ end
164
+
165
+ def self.add_options_to_xml(xml, options = {})
166
+ gre = options[:geo_replication_enabled]
167
+ xml.GeoReplicationEnabled(
168
+ gre
169
+ ) unless gre.nil? || !(gre.is_a?(TrueClass) || gre.is_a?(FalseClass))
170
+ xml.ExtendedProperties do
171
+ options[:extended_properties].each do |name, value|
172
+ xml.ExtendedProperty do
173
+ xml.Name name
174
+ xml.Value value
175
+ end unless (name.to_s.empty?) || (value.to_s.empty?)
176
+ end
177
+ end unless options[:extended_properties].to_s.empty?
178
+ xml.AccountType options[:account_type] if options[:account_type]
179
+ end
180
+
181
+ def self.storage_account_keys_from_xml(storage_xml)
182
+ storage_xml.css('StorageService')
183
+ storage_service_xml = storage_xml.css('StorageService').first
184
+ service_key_xml = storage_service_xml.css('StorageServiceKeys').first
185
+ storage_account_keys = StorageAccountKeys.new
186
+ storage_account_keys.url = xml_content(storage_service_xml, 'Url')
187
+ storage_account_keys.primary_key = xml_content(service_key_xml, 'Primary')
188
+ storage_account_keys.secondary_key = xml_content(service_key_xml, 'Secondary')
189
+ storage_account_keys
190
+ end
191
+
192
+ def self.regenerate_storage_account_keys_to_xml(key_type)
193
+ builder = Nokogiri::XML::Builder.new do |xml|
194
+ xml.RegenerateKeys(
195
+ 'xmlns' => 'http://schemas.microsoft.com/windowsazure'
196
+ ) do
197
+ xml.KeyType(key_type)
198
+ end
199
+ end
200
+ builder.doc.to_xml
201
+ end
202
+ end
203
+ end
204
+ end