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,563 @@
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/storage_service'
16
+
17
+ require 'azure/table/auth/shared_key'
18
+ require 'azure/table/serialization'
19
+ require 'azure/table/entity'
20
+
21
+ module Azure
22
+ module Table
23
+ class TableService < Azure::Service::StorageService
24
+
25
+ def initialize(options = {})
26
+ client_config = options[:client] || Azure
27
+ signer = options[:signer] || Auth::SharedKey.new(client_config.storage_account_name, client_config.storage_access_key)
28
+ super(signer, client_config.storage_account_name, options)
29
+ @host = client.storage_table_host
30
+ end
31
+
32
+ # Public: Creates new table in the storage account
33
+ #
34
+ # ==== Attributes
35
+ #
36
+ # * +table_name+ - String. The table name
37
+ # * +options+ - Hash. Optional parameters.
38
+ #
39
+ # ==== Options
40
+ #
41
+ # Accepted key/value pairs in options parameter are:
42
+ #
43
+ # * +:timeout+ - Integer. A timeout in seconds.
44
+ #
45
+ # See http://msdn.microsoft.com/en-us/library/azure/dd135729
46
+ #
47
+ # @return [nil] on success
48
+ def create_table(table_name, options={})
49
+ query = { }
50
+ query['timeout'] = options[:timeout].to_s if options[:timeout]
51
+
52
+ body = Azure::Table::Serialization.hash_to_entry_xml({"TableName" => table_name}).to_xml
53
+ call(:post, collection_uri(query), body)
54
+ nil
55
+ end
56
+
57
+ # Public: Deletes the specified table and any data it contains.
58
+ #
59
+ # ==== Attributes
60
+ #
61
+ # * +table_name+ - String. The table name
62
+ # * +options+ - Hash. Optional parameters.
63
+ #
64
+ # ==== Options
65
+ #
66
+ # Accepted key/value pairs in options parameter are:
67
+ # * +:timeout+ - Integer. A timeout in seconds.
68
+ #
69
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179387
70
+ #
71
+ # Returns nil on success
72
+ def delete_table(table_name, options={})
73
+ query = { }
74
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
75
+
76
+ call(:delete, table_uri(table_name, query))
77
+ nil
78
+ end
79
+
80
+ # Public: Gets the table.
81
+ #
82
+ # ==== Attributes
83
+ #
84
+ # * +table_name+ - String. The table name
85
+ # * +options+ - Hash. Optional parameters.
86
+ #
87
+ # ==== Options
88
+ #
89
+ # Accepted key/value pairs in options parameter are:
90
+ # * +:timeout+ - Integer. A timeout in seconds.
91
+ #
92
+ # Returns the last updated time for the table
93
+ def get_table(table_name, options={})
94
+ query = { }
95
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
96
+
97
+ response = call(:get, table_uri(table_name, query))
98
+ results = Azure::Table::Serialization.hash_from_entry_xml(response.body)
99
+ results[:updated]
100
+ end
101
+
102
+ # Public: Gets a list of all tables on the account.
103
+ #
104
+ # ==== Attributes
105
+ #
106
+ # * +options+ - Hash. Optional parameters.
107
+ #
108
+ # ==== Options
109
+ #
110
+ # Accepted key/value pairs in options parameter are:
111
+ # * +:next_table_token+ - String. A token used to enumerate the next page of results, when the list of tables is
112
+ # larger than a single operation can return at once. (optional)
113
+ # * +:timeout+ - Integer. A timeout in seconds.
114
+ #
115
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179405
116
+ #
117
+ # Returns an array with an extra continuation_token property on success
118
+ def query_tables(options={})
119
+ query = { }
120
+ query["NextTable"] = options[:next_table_token] if options[:next_table_token]
121
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
122
+
123
+ uri = collection_uri(query)
124
+
125
+ response = call(:get, uri)
126
+ entries = Azure::Table::Serialization.entries_from_feed_xml(response.body) || []
127
+
128
+ values = Azure::Service::EnumerationResults.new(entries)
129
+ values.continuation_token = response.headers["x-ms-continuation-NextTableName"]
130
+ values
131
+ end
132
+
133
+ # Public: Gets the access control list (ACL) for the table.
134
+ #
135
+ # ==== Attributes
136
+ #
137
+ # * +table_name+ - String. The table name
138
+ # * +options+ - Hash. Optional parameters.
139
+ #
140
+ # ==== Options
141
+ #
142
+ # Accepted key/value pairs in options parameter are:
143
+ # * +:timeout+ - Integer. A timeout in seconds.
144
+ #
145
+ # See http://msdn.microsoft.com/en-us/library/azure/jj159100
146
+ #
147
+ # Returns a list of Azure::Entity::SignedIdentifier instances
148
+ def get_table_acl(table_name, options={})
149
+ query = { 'comp' => 'acl'}
150
+ query['timeout'] = options[:timeout].to_s if options[:timeout]
151
+
152
+ response = call(:get, generate_uri(table_name, query), nil, {'x-ms-version' => '2012-02-12'})
153
+
154
+ signed_identifiers = []
155
+ signed_identifiers = Azure::Table::Serialization.signed_identifiers_from_xml response.body unless response.body == nil or response.body.length < 1
156
+ signed_identifiers
157
+ end
158
+
159
+ # Public: Sets the access control list (ACL) for the table.
160
+ #
161
+ # ==== Attributes
162
+ #
163
+ # * +table_name+ - String. The table name
164
+ # * +options+ - Hash. Optional parameters.
165
+ #
166
+ # ==== Options
167
+ #
168
+ # Accepted key/value pairs in options parameter are:
169
+ # * +:signed_identifiers+ - Array. A list of Azure::Entity::SignedIdentifier instances
170
+ # * +:timeout+ - Integer. A timeout in seconds.
171
+ #
172
+ # See http://msdn.microsoft.com/en-us/library/azure/jj159102
173
+ #
174
+ # Returns nil on success
175
+ def set_table_acl(table_name, options={})
176
+ query = { 'comp' => 'acl'}
177
+ query['timeout'] = options[:timeout].to_s if options[:timeout]
178
+
179
+ uri = generate_uri(table_name, query)
180
+ body = nil
181
+ body = Azure::Table::Serialization.signed_identifiers_to_xml options[:signed_identifiers] if options[:signed_identifiers] && options[:signed_identifiers].length > 0
182
+
183
+ call(:put, uri, body, {'x-ms-version' => '2012-02-12'})
184
+ nil
185
+ end
186
+
187
+ # Public: Inserts new entity to the table.
188
+ #
189
+ #
190
+ # ==== Attributes
191
+ #
192
+ # * +table_name+ - String. The table name
193
+ # * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
194
+ # * +options+ - Hash. Optional parameters.
195
+ #
196
+ # ==== Options
197
+ #
198
+ # Accepted key/value pairs in options parameter are:
199
+ # * +:timeout+ - Integer. A timeout in seconds.
200
+ #
201
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179433
202
+ #
203
+ # Returns a Azure::Entity::Table::Entity
204
+ def insert_entity(table_name, entity_values, options={})
205
+ body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
206
+
207
+ query = { }
208
+ query['timeout'] = options[:timeout].to_s if options[:timeout]
209
+
210
+ response = call(:post, entities_uri(table_name, nil, nil, query), body)
211
+
212
+ result = Azure::Table::Serialization.hash_from_entry_xml(response.body)
213
+
214
+ Entity.new do |entity|
215
+ entity.table = table_name
216
+ entity.updated = result[:updated]
217
+ entity.etag = response.headers['etag'] || result[:etag]
218
+ entity.properties = result[:properties]
219
+ end
220
+ end
221
+
222
+ # Public: Queries entities for the given table name
223
+ #
224
+ # ==== Attributes
225
+ #
226
+ # * +table_name+ - String. The table name
227
+ # * +options+ - Hash. Optional parameters.
228
+ #
229
+ # ==== Options
230
+ #
231
+ # Accepted key/value pairs in options parameter are:
232
+ # * +:partition_key+ - String. The partition key (optional)
233
+ # * +:row_key+ - String. The row key (optional)
234
+ # * +:select+ - Array. An array of property names to return (optional)
235
+ # * +:filter+ - String. A filter expression (optional)
236
+ # * +:top+ - Integer. A limit for the number of results returned (optional)
237
+ # * +:continuation_token+ - Hash. The continuation token.
238
+ # * +:timeout+ - Integer. A timeout in seconds.
239
+ #
240
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179421
241
+ #
242
+ # Returns an array with an extra continuation_token property on success
243
+ def query_entities(table_name, options={})
244
+ query ={}
245
+ query["$select"] = options[:select].join ',' if options[:select]
246
+ query["$filter"] = options[:filter] if options[:filter]
247
+ query["$top"] = options[:top].to_s if options[:top] unless options[:partition_key] and options[:row_key]
248
+ query["NextPartitionKey"] = options[:continuation_token][:next_partition_key] if options[:continuation_token] and options[:continuation_token][:next_partition_key]
249
+ query["NextRowKey"] = options[:continuation_token][:next_row_key] if options[:continuation_token] and options[:continuation_token][:next_row_key]
250
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
251
+
252
+ uri = entities_uri(table_name, options[:partition_key], options[:row_key], query)
253
+ response = call(:get, uri, nil, { "DataServiceVersion" => "2.0;NetFx"})
254
+
255
+ entities = Azure::Service::EnumerationResults.new
256
+
257
+ results = (options[:partition_key] and options[:row_key]) ? [Azure::Table::Serialization.hash_from_entry_xml(response.body)] : Azure::Table::Serialization.entries_from_feed_xml(response.body)
258
+
259
+ results.each do |result|
260
+ entity = Entity.new do |e|
261
+ e.table = table_name
262
+ e.updated = result[:updated]
263
+ e.etag = response.headers["etag"] || result[:etag]
264
+ e.properties = result[:properties]
265
+ end
266
+ entities.push entity
267
+ end if results
268
+
269
+ entities.continuation_token = nil
270
+ entities.continuation_token = {
271
+ :next_partition_key=> response.headers["x-ms-continuation-NextPartitionKey"],
272
+ :next_row_key => response.headers["x-ms-continuation-NextRowKey"]
273
+ } if response.headers["x-ms-continuation-NextPartitionKey"]
274
+
275
+ entities
276
+ end
277
+
278
+ # Public: Updates an existing entity in a table. The Update Entity operation replaces
279
+ # the entire entity and can be used to remove properties.
280
+ #
281
+ # ==== Attributes
282
+ #
283
+ # * +table_name+ - String. The table name
284
+ # * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
285
+ # * +options+ - Hash. Optional parameters.
286
+ #
287
+ # ==== Options
288
+ #
289
+ # Accepted key/value pairs in options parameter are:
290
+ # * +:if_match+ - String. A matching condition which is required for update (optional, Default="*")
291
+ # * +:create_if_not_exists+ - Boolean. If true, and partition_key and row_key do not reference and existing entity,
292
+ # that entity will be inserted. If false, the operation will fail. (optional, Default=false)
293
+ # * +:timeout+ - Integer. A timeout in seconds.
294
+ #
295
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179427
296
+ #
297
+ # Returns the ETag for the entity on success
298
+ def update_entity(table_name, entity_values, options={})
299
+ if_match = "*"
300
+ if_match = options[:if_match] if options[:if_match]
301
+
302
+ query = { }
303
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
304
+
305
+ uri = entities_uri(table_name, entity_values["PartitionKey"], entity_values["RowKey"], query)
306
+
307
+ headers = {}
308
+ headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]
309
+
310
+ body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
311
+
312
+ response = call(:put, uri, body, headers)
313
+ response.headers["etag"]
314
+ end
315
+
316
+ # Public: Updates an existing entity by updating the entity's properties. This operation
317
+ # does not replace the existing entity, as the update_entity operation does.
318
+ #
319
+ # ==== Attributes
320
+ #
321
+ # * +table_name+ - String. The table name
322
+ # * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
323
+ # * +options+ - Hash. Optional parameters.
324
+ #
325
+ # ==== Options
326
+ #
327
+ # Accepted key/value pairs in options parameter are:
328
+ # * +:if_match+ - String. A matching condition which is required for update (optional, Default="*")
329
+ # * +:create_if_not_exists+ - Boolean. If true, and partition_key and row_key do not reference and existing entity,
330
+ # that entity will be inserted. If false, the operation will fail. (optional, Default=false)
331
+ # * +:timeout+ - Integer. A timeout in seconds.
332
+ #
333
+ # See http://msdn.microsoft.com/en-us/library/azure/dd179392
334
+ #
335
+ # Returns the ETag for the entity on success
336
+ def merge_entity(table_name, entity_values, options={})
337
+ if_match = "*"
338
+ if_match = options[:if_match] if options[:if_match]
339
+
340
+ query = { }
341
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
342
+
343
+ uri = entities_uri(table_name, entity_values["PartitionKey"], entity_values["RowKey"], query)
344
+
345
+ headers = { "X-HTTP-Method"=> "MERGE" }
346
+ headers["If-Match"] = if_match || "*" unless options[:create_if_not_exists]
347
+
348
+ body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
349
+
350
+ response = call(:post, uri, body, headers)
351
+ response.headers["etag"]
352
+ end
353
+
354
+ # Public: Inserts or updates an existing entity within a table by merging new property values into the entity.
355
+ #
356
+ # ==== Attributes
357
+ #
358
+ # * +table_name+ - String. The table name
359
+ # * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
360
+ # * +options+ - Hash. Optional parameters.
361
+ #
362
+ # ==== Options
363
+ #
364
+ # Accepted key/value pairs in options parameter are:
365
+ # * +:timeout+ - Integer. A timeout in seconds.
366
+ #
367
+ # See http://msdn.microsoft.com/en-us/library/azure/hh452241
368
+ #
369
+ # Returns the ETag for the entity on success
370
+ def insert_or_merge_entity(table_name, entity_values, options={})
371
+ options[:create_if_not_exists] = true
372
+ merge_entity(table_name, entity_values, options)
373
+ end
374
+
375
+ # Public: Inserts or updates a new entity into a table.
376
+ #
377
+ # ==== Attributes
378
+ #
379
+ # * +table_name+ - String. The table name
380
+ # * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
381
+ # * +options+ - Hash. Optional parameters.
382
+ #
383
+ # ==== Options
384
+ #
385
+ # Accepted key/value pairs in options parameter are:
386
+ # * +:timeout+ - Integer. A timeout in seconds.
387
+ #
388
+ # See http://msdn.microsoft.com/en-us/library/azure/hh452242
389
+ #
390
+ # Returns the ETag for the entity on success
391
+ def insert_or_replace_entity(table_name, entity_values, options={})
392
+ options[:create_if_not_exists] = true
393
+ update_entity(table_name, entity_values, options)
394
+ end
395
+
396
+ # Public: Deletes an existing entity in the table.
397
+ #
398
+ # ==== Attributes
399
+ #
400
+ # * +table_name+ - String. The table name
401
+ # * +partition_key+ - String. The partition key
402
+ # * +row_key+ - String. The row key
403
+ # * +options+ - Hash. Optional parameters.
404
+ #
405
+ # ==== Options
406
+ #
407
+ # Accepted key/value pairs in options parameter are:
408
+ # * +:if_match+ - String. A matching condition which is required for update (optional, Default="*")
409
+ # * +:timeout+ - Integer. A timeout in seconds.
410
+ #
411
+ # See http://msdn.microsoft.com/en-us/library/azure/dd135727
412
+ #
413
+ # Returns nil on success
414
+ def delete_entity(table_name, partition_key, row_key, options={})
415
+ if_match = "*"
416
+ if_match = options[:if_match] if options[:if_match]
417
+
418
+ query = { }
419
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
420
+
421
+ call(:delete, entities_uri(table_name, partition_key, row_key, query), nil, { "If-Match"=> if_match })
422
+ nil
423
+ end
424
+
425
+ # Public: Executes a batch of operations.
426
+ #
427
+ # ==== Attributes
428
+ #
429
+ # * +batch+ - The Azure::Table::Batch instance to execute.
430
+ # * +options+ - Hash. Optional parameters.
431
+ #
432
+ # ==== Options
433
+ #
434
+ # Accepted key/value pairs in options parameter are:
435
+ # * +:timeout+ - Integer. A timeout in seconds.
436
+ #
437
+ # See http://msdn.microsoft.com/en-us/library/azure/dd894038
438
+ #
439
+ # Returns an array of results, one for each operation in the batch
440
+ def execute_batch(batch, options={})
441
+ headers = {
442
+ 'Content-Type' => "multipart/mixed; boundary=#{batch.batch_id}",
443
+ 'Accept' => 'application/atom+xml,application/xml',
444
+ 'Accept-Charset'=> 'UTF-8'
445
+ }
446
+
447
+ query = { }
448
+ query["timeout"] = options[:timeout].to_s if options[:timeout]
449
+
450
+ body = batch.to_body
451
+ response = call(:post, generate_uri('/$batch', query), body, headers)
452
+ batch.parse_response(response)
453
+ end
454
+
455
+ # Public: Gets an existing entity in the table.
456
+ #
457
+ # ==== Attributes
458
+ #
459
+ # * +table_name+ - String. The table name
460
+ # * +partition_key+ - String. The partition key
461
+ # * +row_key+ - String. The row key
462
+ # * +options+ - Hash. Optional parameters.
463
+ #
464
+ # ==== Options
465
+ #
466
+ # Accepted key/value pairs in options parameter are:
467
+ # * +:timeout+ - Integer. A timeout in seconds.
468
+ #
469
+ # Returns an Azure::Table::Entity instance on success
470
+ def get_entity(table_name, partition_key, row_key, options={})
471
+ options[:partition_key] = partition_key
472
+ options[:row_key] = row_key
473
+ results = query_entities(table_name, options)
474
+ results.length > 0 ? results[0] : nil
475
+ end
476
+
477
+ # Protected: Generate the URI for the collection of tables.
478
+ #
479
+ # Returns a URI
480
+ protected
481
+ def collection_uri(query={})
482
+ generate_uri("Tables", query)
483
+ end
484
+
485
+ # Public: Generate the URI for a specific table.
486
+ #
487
+ # ==== Attributes
488
+ #
489
+ # * +name+ - The table name. If this is a URI, we just return this
490
+ #
491
+ # Returns a URI
492
+ public
493
+ def table_uri(name, query={})
494
+ return name if name.kind_of? ::URI
495
+ generate_uri("Tables('#{name}')", query)
496
+ end
497
+
498
+ # Public: Generate the URI for an entity or group of entities in a table.
499
+ # If both the 'partition_key' and 'row_key' are specified, then the URI
500
+ # will match the entity under those specific keys.
501
+ #
502
+ # ==== Attributes
503
+ #
504
+ # * +table_name+ - The table name
505
+ # * +partition_key+ - The desired partition key (optional)
506
+ # * +row_key+ - The desired row key (optional)
507
+ #
508
+ # Returns a URI
509
+ public
510
+ def entities_uri(table_name, partition_key=nil, row_key=nil, query={})
511
+ return table_name if table_name.kind_of? ::URI
512
+
513
+ path = if partition_key && row_key
514
+ "%s(PartitionKey='%s',RowKey='%s')" % [
515
+ table_name.encode("UTF-8"), encodeODataUriValue(partition_key.encode("UTF-8")), encodeODataUriValue(row_key.encode("UTF-8"))
516
+ ]
517
+ else
518
+ "%s()" % table_name.encode("UTF-8")
519
+ end
520
+
521
+ uri = generate_uri(path)
522
+ qs = []
523
+ if query
524
+ query.each do | key, val |
525
+ key = key.encode("UTF-8")
526
+ val = val.encode("UTF-8")
527
+
528
+ if key[0] == "$"
529
+ qs.push "#{key}#{::URI.encode_www_form(""=>val)}"
530
+ else
531
+ qs.push ::URI.encode_www_form(key=>val)
532
+ end
533
+ end
534
+ end
535
+ uri.query = qs.join '&' if qs.length > 0
536
+ uri
537
+ end
538
+
539
+ protected
540
+ def encodeODataUriValues(values)
541
+ new_values = []
542
+ values.each do |value|
543
+ new_values.push encodeODataUriValue(value)
544
+ end
545
+ new_values
546
+ end
547
+
548
+ protected
549
+ def encodeODataUriValue(value)
550
+ # Replace each single quote (') with double single quotes ('') not double
551
+ # quotes (")
552
+ value = value.gsub("'", "''")
553
+
554
+ # Encode the special URL characters
555
+ value = URI.escape(value)
556
+
557
+ value
558
+ end
559
+ end
560
+ end
561
+ end
562
+
563
+ Azure::TableService = Azure::Table::TableService