azure 0.0.0 → 0.1.0

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 (212) hide show
  1. data/Gemfile +3 -0
  2. data/Gemfile.lock +36 -0
  3. data/README.md +3 -0
  4. data/Rakefile +81 -0
  5. data/azure.gemspec +20 -9
  6. data/lib/azure.rb +4 -0
  7. data/lib/azure/atom.rb +170 -0
  8. data/lib/azure/auth.rb +29 -0
  9. data/lib/azure/blobs.rb +620 -0
  10. data/lib/azure/blobs/blob.rb +360 -0
  11. data/lib/azure/blobs/container.rb +209 -0
  12. data/lib/azure/blobs/service.rb +396 -0
  13. data/lib/azure/blobs/shared_access_signature.rb +84 -0
  14. data/lib/azure/blobs/uri.rb +60 -0
  15. data/lib/azure/configuration.rb +121 -0
  16. data/lib/azure/core/auth/shared_key.rb +95 -0
  17. data/lib/azure/core/auth/shared_key_lite.rb +34 -0
  18. data/lib/azure/core/collection.rb +118 -0
  19. data/lib/azure/core/service.rb +43 -0
  20. data/lib/azure/core/signer.rb +32 -0
  21. data/lib/azure/core/utils/interval.rb +97 -0
  22. data/lib/azure/core/utils/queryable.rb +74 -0
  23. data/lib/azure/core/utils/storage_service_properties.rb +83 -0
  24. data/lib/azure/core/utils/string.rb +59 -0
  25. data/lib/azure/error.rb +72 -0
  26. data/lib/azure/queues.rb +272 -0
  27. data/lib/azure/queues/message.rb +174 -0
  28. data/lib/azure/queues/queue.rb +187 -0
  29. data/lib/azure/queues/service.rb +263 -0
  30. data/lib/azure/queues/service_properties.rb +152 -0
  31. data/lib/azure/queues/uri.rb +78 -0
  32. data/lib/azure/request.rb +102 -0
  33. data/lib/azure/response.rb +93 -0
  34. data/lib/azure/service_bus.rb +4 -0
  35. data/lib/azure/service_bus/auth/authorizer.rb +22 -0
  36. data/lib/azure/service_bus/auth/uri.rb +52 -0
  37. data/lib/azure/service_bus/auth/wrap.rb +37 -0
  38. data/lib/azure/service_bus/auth/wrap_service.rb +76 -0
  39. data/lib/azure/service_bus/auth/wrap_token.rb +45 -0
  40. data/lib/azure/service_bus/auth/wrap_token_manager.rb +46 -0
  41. data/lib/azure/service_bus/brokered_message.rb +139 -0
  42. data/lib/azure/service_bus/brokered_message_serializer.rb +113 -0
  43. data/lib/azure/service_bus/queues.rb +194 -0
  44. data/lib/azure/service_bus/queues/queue.rb +100 -0
  45. data/lib/azure/service_bus/queues/queue_serializer.rb +51 -0
  46. data/lib/azure/service_bus/queues/service.rb +154 -0
  47. data/lib/azure/service_bus/queues/uri.rb +80 -0
  48. data/lib/azure/service_bus/rules.rb +110 -0
  49. data/lib/azure/service_bus/rules/rule.rb +97 -0
  50. data/lib/azure/service_bus/rules/service.rb +122 -0
  51. data/lib/azure/service_bus/rules/uri.rb +39 -0
  52. data/lib/azure/service_bus/service_bus_service.rb +22 -0
  53. data/lib/azure/service_bus/subscriptions.rb +170 -0
  54. data/lib/azure/service_bus/subscriptions/service.rb +133 -0
  55. data/lib/azure/service_bus/subscriptions/subscription.rb +164 -0
  56. data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +74 -0
  57. data/lib/azure/service_bus/subscriptions/uri.rb +71 -0
  58. data/lib/azure/service_bus/topics.rb +120 -0
  59. data/lib/azure/service_bus/topics/service.rb +98 -0
  60. data/lib/azure/service_bus/topics/topic.rb +122 -0
  61. data/lib/azure/service_bus/topics/topic_serializer.rb +44 -0
  62. data/lib/azure/service_bus/topics/uri.rb +58 -0
  63. data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +21 -0
  64. data/lib/azure/service_runtime/client/goal_state_protocol.rb +18 -0
  65. data/lib/azure/service_runtime/client/runtime_client.rb +135 -0
  66. data/lib/azure/service_runtime/deployment.rb +24 -0
  67. data/lib/azure/service_runtime/local_resource.rb +15 -0
  68. data/lib/azure/service_runtime/role.rb +17 -0
  69. data/lib/azure/service_runtime/role_environment.rb +206 -0
  70. data/lib/azure/service_runtime/role_environment_change.rb +32 -0
  71. data/lib/azure/service_runtime/role_instance.rb +35 -0
  72. data/lib/azure/service_runtime/role_instance_endpoint.rb +14 -0
  73. data/lib/azure/tables.rb +215 -0
  74. data/lib/azure/tables/auth/shared_key.rb +71 -0
  75. data/lib/azure/tables/auth/shared_key_lite.rb +30 -0
  76. data/lib/azure/tables/entities_collection.rb +66 -0
  77. data/lib/azure/tables/entity.rb +127 -0
  78. data/lib/azure/tables/service.rb +211 -0
  79. data/lib/azure/tables/table.rb +129 -0
  80. data/lib/azure/tables/tables_collection.rb +62 -0
  81. data/lib/azure/tables/types.rb +65 -0
  82. data/lib/azure/tables/uri.rb +62 -0
  83. data/test/fixtures/32px-fulls-black.jpg +0 -0
  84. data/test/fixtures/all_containers.xml +20 -0
  85. data/test/fixtures/all_tables.xml +22 -0
  86. data/test/fixtures/create_table_response_entry.xml +15 -0
  87. data/test/fixtures/error.xml +5 -0
  88. data/test/fixtures/insert_entity_response_entry.xml +25 -0
  89. data/test/fixtures/messages.xml +12 -0
  90. data/test/fixtures/query_entities_empty_response.xml +7 -0
  91. data/test/fixtures/query_entities_response.xml +45 -0
  92. data/test/fixtures/queue_service_properties.xml +22 -0
  93. data/test/fixtures/queue_service_properties_original.xml +19 -0
  94. data/test/fixtures/queues.xml +16 -0
  95. data/test/fixtures/sb_default_create_queue_response.xml +23 -0
  96. data/test/fixtures/sb_default_create_topic_response.xml +18 -0
  97. data/test/fixtures/sb_get_access_token_response.txt +1 -0
  98. data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
  99. data/test/integration/blobs/auth_test.rb +19 -0
  100. data/test/integration/blobs/blob_test.rb +61 -0
  101. data/test/integration/blobs/clear_page_range_test.rb +19 -0
  102. data/test/integration/blobs/copy_test.rb +33 -0
  103. data/test/integration/blobs/create_blobs_test.rb +51 -0
  104. data/test/integration/blobs/create_container_test.rb +13 -0
  105. data/test/integration/blobs/create_snapshot_test.rb +17 -0
  106. data/test/integration/blobs/delete_blob_snapshots_test.rb +19 -0
  107. data/test/integration/blobs/delete_blobs_test.rb +25 -0
  108. data/test/integration/blobs/delete_container_test.rb +24 -0
  109. data/test/integration/blobs/delete_snapshot_test.rb +17 -0
  110. data/test/integration/blobs/get_blob_snapshot_test.rb +18 -0
  111. data/test/integration/blobs/get_blobs_test.rb +31 -0
  112. data/test/integration/blobs/get_page_range_test.rb +19 -0
  113. data/test/integration/blobs/list_blobs_test.rb +39 -0
  114. data/test/integration/blobs/list_containers_test.rb +28 -0
  115. data/test/integration/blobs/manage_blob_leases_test.rb +45 -0
  116. data/test/integration/blobs/manage_blob_metadata_test.rb +51 -0
  117. data/test/integration/blobs/manage_blob_properties_test.rb +25 -0
  118. data/test/integration/blobs/manage_blob_service_properties_test.rb +38 -0
  119. data/test/integration/blobs/manage_container_metadata_test.rb +46 -0
  120. data/test/integration/blobs/manage_container_permissions_test.rb +17 -0
  121. data/test/integration/blobs/update_page_range_test.rb +20 -0
  122. data/test/integration/queues/clear_messages_test.rb +22 -0
  123. data/test/integration/queues/create_queue_test.rb +13 -0
  124. data/test/integration/queues/delete_message_test.rb +42 -0
  125. data/test/integration/queues/delete_queue_test.rb +24 -0
  126. data/test/integration/queues/get_messages_test.rb +39 -0
  127. data/test/integration/queues/list_queues_test.rb +43 -0
  128. data/test/integration/queues/manage_queue_metadata_test.rb +45 -0
  129. data/test/integration/queues/manage_queue_service_properties_test.rb +27 -0
  130. data/test/integration/queues/peek_messages_test.rb +55 -0
  131. data/test/integration/queues/put_message_test.rb +31 -0
  132. data/test/integration/queues/update_message_test.rb +46 -0
  133. data/test/integration/service_bus/auth_test.rb +18 -0
  134. data/test/integration/service_bus/queues/create_queue_test.rb +25 -0
  135. data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +29 -0
  136. data/test/integration/service_bus/queues/delete_queue_test.rb +25 -0
  137. data/test/integration/service_bus/queues/get_queue_test.rb +23 -0
  138. data/test/integration/service_bus/queues/list_queues_test.rb +39 -0
  139. data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +34 -0
  140. data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +31 -0
  141. data/test/integration/service_bus/queues/send_message_to_queue_test.rb +22 -0
  142. data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +36 -0
  143. data/test/integration/service_bus/rules/create_rule_test.rb +19 -0
  144. data/test/integration/service_bus/rules/delete_rule_test.rb +17 -0
  145. data/test/integration/service_bus/rules/get_rule_test.rb +21 -0
  146. data/test/integration/service_bus/rules/list_rules_test.rb +24 -0
  147. data/test/integration/service_bus/rules/rule_test.rb +16 -0
  148. data/test/integration/service_bus/subscriptions/create_subscription_test.rb +25 -0
  149. data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +31 -0
  150. data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +30 -0
  151. data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +28 -0
  152. data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +23 -0
  153. data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +42 -0
  154. data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +36 -0
  155. data/test/integration/service_bus/subscriptions/subscription_test.rb +31 -0
  156. data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +43 -0
  157. data/test/integration/service_bus/topics/create_topic_test.rb +25 -0
  158. data/test/integration/service_bus/topics/delete_topic_test.rb +25 -0
  159. data/test/integration/service_bus/topics/get_topic_test.rb +23 -0
  160. data/test/integration/service_bus/topics/list_topics_test.rb +39 -0
  161. data/test/integration/service_bus/topics/send_message_to_topic_test.rb +23 -0
  162. data/test/integration/tables/auth_test.rb +29 -0
  163. data/test/integration/tables/creating_tables_test.rb +16 -0
  164. data/test/integration/tables/delete_entity_test.rb +39 -0
  165. data/test/integration/tables/deleting_table_test.rb +22 -0
  166. data/test/integration/tables/insert_entity_test.rb +23 -0
  167. data/test/integration/tables/merge_entity_test.rb +28 -0
  168. data/test/integration/tables/query_entities_test.rb +131 -0
  169. data/test/integration/tables/query_tables_test.rb +63 -0
  170. data/test/integration/tables/update_entity_test.rb +54 -0
  171. data/test/integration/test_helper.rb +14 -0
  172. data/test/support/blobs.rb +12 -0
  173. data/test/support/env.rb +5 -0
  174. data/test/support/fixtures.rb +22 -0
  175. data/test/support/stubs.rb +28 -0
  176. data/test/support/table_names.rb +44 -0
  177. data/test/test_helper.rb +10 -0
  178. data/test/unit/atom_test.rb +58 -0
  179. data/test/unit/auth_test.rb +24 -0
  180. data/test/unit/blobs/blob_test.rb +5 -0
  181. data/test/unit/blobs/container_test.rb +67 -0
  182. data/test/unit/blobs/service_test.rb +17 -0
  183. data/test/unit/blobs/shared_access_signature_test.rb +66 -0
  184. data/test/unit/blobs_test.rb +156 -0
  185. data/test/unit/core/service_test.rb +57 -0
  186. data/test/unit/core/utils/interval_test.rb +70 -0
  187. data/test/unit/core/utils/queryable_test.rb +69 -0
  188. data/test/unit/core/utils/storage_service_properties_test.rb +66 -0
  189. data/test/unit/error_test.rb +39 -0
  190. data/test/unit/queues/message_test.rb +40 -0
  191. data/test/unit/queues/queue_test.rb +64 -0
  192. data/test/unit/queues/service_properties.rb +35 -0
  193. data/test/unit/request_test.rb +38 -0
  194. data/test/unit/response_test.rb +43 -0
  195. data/test/unit/service_bus/auth/authorizer_test.rb +27 -0
  196. data/test/unit/service_bus/auth/wrap_token_test.rb +28 -0
  197. data/test/unit/service_bus/queues/queue_test.rb +38 -0
  198. data/test/unit/service_bus/topics/topic_test.rb +33 -0
  199. data/test/unit/service_runtime/data/goalstate.xml +9 -0
  200. data/test/unit/service_runtime/data/roleenvironmentdata.xml +29 -0
  201. data/test/unit/service_runtime/data/runtime.xml +6 -0
  202. data/test/unit/service_runtime/role_environment_test.rb +144 -0
  203. data/test/unit/tables/auth/shared_key_lite_test.rb +39 -0
  204. data/test/unit/tables/auth/shared_key_test.rb +45 -0
  205. data/test/unit/tables/entities_collection_test.rb +39 -0
  206. data/test/unit/tables/entity_test.rb +72 -0
  207. data/test/unit/tables/table_test.rb +57 -0
  208. data/test/unit/tables_test.rb +302 -0
  209. data/test/unit/types_test.rb +67 -0
  210. metadata +310 -47
  211. data/LICENSE +0 -0
  212. data/README +0 -0
@@ -0,0 +1,32 @@
1
+ module Azure
2
+ module ServiceRuntime
3
+ class RoleEnvironmentChange
4
+ end
5
+
6
+ class RoleEnvironmentConfigurationSettingChange < RoleEnvironmentChange
7
+ attr_reader :configuration_setting_name
8
+ alias :name :configuration_setting_name
9
+
10
+ def initialize(configuration_setting_name)
11
+ @configuration_setting_name = configuration_setting_name
12
+ end
13
+
14
+ def to_s
15
+ @configuration_setting_name
16
+ end
17
+ end
18
+
19
+ class RoleEnvironmentTopologyChange < RoleEnvironmentChange
20
+ attr_reader :role_name
21
+ alias :name :role_name
22
+
23
+ def initialize(role_name)
24
+ @role_name = role_name
25
+ end
26
+
27
+ def to_s
28
+ @role_name
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
1
+ require 'azure/service_runtime/role_instance_endpoint'
2
+ require 'azure/service_runtime/local_resource'
3
+
4
+ module Azure
5
+ module ServiceRuntime
6
+ class RoleInstance
7
+ attr_accessor :id, :role_name, :fault_domain, :update_domain, :endpoints, :configuration_settings, :local_resources
8
+ alias :instance_endpoints :endpoints
9
+
10
+ def initialize(node)
11
+ self.id = node["id"]
12
+ self.fault_domain = node["faultDomain"].to_i
13
+ self.update_domain = node["updateDomain"].to_i
14
+ self.role_name = node["roleName"]
15
+
16
+ self.endpoints = node.css('Endpoints > Endpoint').inject({}) do |hash, endpoint_xml|
17
+ endpoint = RoleInstanceEndpoint.new(endpoint_xml)
18
+ hash[endpoint.name] = endpoint
19
+ hash
20
+ end
21
+
22
+ self.configuration_settings = node.css('ConfigurationSettings > ConfigurationSetting').inject({}) do |hash, setting_xml|
23
+ hash[setting_xml["name"]] = setting_xml["value"]
24
+ hash
25
+ end
26
+
27
+ self.local_resources = node.css('LocalResources > LocalResource').inject({}) do |hash, local_resource_xml|
28
+ local_resource = LocalResource.new(local_resource_xml)
29
+ hash[local_resource.name] = local_resource
30
+ hash
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ module Azure
2
+ module ServiceRuntime
3
+ class RoleInstanceEndpoint
4
+ attr_accessor :name, :address, :port, :protocol
5
+
6
+ def initialize(node)
7
+ self.name = node["name"]
8
+ self.address = node["address"]
9
+ self.port = node["port"].to_i
10
+ self.protocol = node["protocol"]
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,215 @@
1
+ require "azure/tables/service"
2
+ require "azure/tables/table"
3
+ require "azure/tables/entity"
4
+ require "azure/tables/entities_collection"
5
+ require "azure/tables/tables_collection"
6
+ require "azure/atom"
7
+
8
+ module Azure
9
+ module Tables
10
+ # Public: Get a list of Tables from the server.
11
+ #
12
+ # query - Options for this query.
13
+ # service - The backend service to implement this (optional).
14
+ #
15
+ # Returns an Array of Table elements.
16
+ def self.all(query = {}, service=Azure::Tables::Services::QueryTables.new)
17
+ response = service.call(query)
18
+ feed = Atom::Feed.load_feed(response.body)
19
+ collection = Azure::Tables::TablesCollection.from_entries(feed.entries, query)
20
+
21
+ collection.continuation_token(
22
+ response.headers["x-ms-continuation-nexttablename"]
23
+ )
24
+
25
+ collection
26
+ end
27
+
28
+ # Public: Get a single table by name. If the operation is unsuccessful, the
29
+ # resulting table is invalidated.
30
+ #
31
+ # name - The name of the table.
32
+ # service - The backend service to implement this (optional).
33
+ #
34
+ # Returns a Table.
35
+ def self.fetch(name, service=Azure::Tables::Services::FetchTable.new)
36
+ response = service.call(name)
37
+
38
+ if response.success?
39
+ Table.from_entry(Atom::Entry.load_entry(response.body))
40
+ else
41
+ Table.from_error(response.error)
42
+ end
43
+ end
44
+
45
+ # Public: Attempt to create a new table. If the operation is unsuccessful,
46
+ # the resulting Table object will have the error accessible through the
47
+ # table.error method.
48
+ #
49
+ # name - The name of the table.
50
+ # service - The backend service to implement this (optional).
51
+ #
52
+ # Returns a Table.
53
+ def self.create(name, service=Azure::Tables::Services::CreateTable.new)
54
+ response = service.call(name)
55
+
56
+ if response.success?
57
+ Table.from_entry(Atom::Entry.load_entry(response.body))
58
+ else
59
+ Table.from_error(response.error)
60
+ end
61
+ end
62
+
63
+ # Public: Delete a Table from the server.
64
+ #
65
+ # table - An Azure::Tables::Table.
66
+ # service - The backend service to implement this (optional).
67
+ #
68
+ # Returns true|false to indicate success.
69
+ def self.delete(table, service=Azure::Tables::Services::DeleteTable.new)
70
+ response = service.call(table.url)
71
+ table.error = response.error unless response.success?
72
+ response.success?
73
+ end
74
+
75
+ # Public: Inserts a new entity in the given table. If the operation fails an
76
+ # error will be added to the entity.
77
+ #
78
+ # table - An Azure::Tables::Table.
79
+ # entity - An Azure::Tables::Entity.
80
+ # service - The backend service to implement this (optional).
81
+ #
82
+ # Returns the entity.
83
+ def self.insert_entity(table, entity, service=Azure::Tables::Services::InsertEntity.new)
84
+ response = service.call(table.name, entity.attributes)
85
+
86
+ if response.success?
87
+ entity.reset(
88
+ Entity.from_entry(Azure::Atom::Entry.load_entry(response.body))
89
+ )
90
+ entity.etag = response.headers["etag"]
91
+ else
92
+ entity.error = response.error
93
+ end
94
+
95
+ entity
96
+ end
97
+
98
+ # Public: Replaces the attributes of an existing entity. In case of an
99
+ # error, the entity won't be changed and entity.error will be set.
100
+ #
101
+ # entity - The entity to update.
102
+ # attributes - A Hash of attributes. This hash must contain a "PartitionKey"
103
+ # and a "RowKey".
104
+ # force - Force this operation even if the object is stale (optional,
105
+ # defaults to false).
106
+ # service - The backend service to implement this (optional).
107
+ #
108
+ # Returns true|false to indicate success.
109
+ def self.update_entity(entity, attributes, force=false, service=Azure::Tables::Services::ReplaceEntity.new)
110
+ etag = force ? Entity::FORCE_UPDATE : entity.etag
111
+ response = service.call(entity.url, attributes, etag)
112
+
113
+ if response.success?
114
+ entity.attributes.replace(attributes)
115
+ entity.etag = response.headers["etag"]
116
+ else
117
+ entity.error = response.error
118
+ end
119
+
120
+ response.success?
121
+ end
122
+
123
+ # Public: Merge new attributes into an entity. If successful, the entity
124
+ # will have the new attributes. In case of an error, the entity won't be
125
+ # changed and entity.error will be set.
126
+ #
127
+ # entity - The entity to update.
128
+ # attributes - A Hash of attributes.
129
+ # force - Force this operation even if the object is stale (optional,
130
+ # defaults to false).
131
+ # service - The backend service to implement this (optional).
132
+ #
133
+ # Returns true|false to indicate success.
134
+ def self.merge_entity(entity, attributes, force=false, service=Azure::Tables::Services::MergeEntity.new)
135
+ etag = force ? Entity::FORCE_UPDATE : entity.etag
136
+ response = service.call(entity.url, attributes, etag)
137
+
138
+ if response.success?
139
+ entity.attributes.update(attributes)
140
+ entity.etag = response.headers["etag"]
141
+ else
142
+ entity.error = response.error
143
+ end
144
+
145
+ response.success?
146
+ end
147
+
148
+ # Public: Delete an Entity. If the entity can't be deleted, entity.error
149
+ # will be set.
150
+ #
151
+ # entity - The entity to delete.
152
+ # force - Force this operation even if the object is stale (optional,
153
+ # defaults to false).
154
+ # service - The backend service to implement this (optional).
155
+ #
156
+ # Returns true|false to indicate success.
157
+ def self.delete_entity(entity, force=false, service=Azure::Tables::Services::DeleteEntity.new)
158
+ etag = force ? Entity::FORCE_UPDATE : entity.etag
159
+ response = service.call(entity.url, etag)
160
+
161
+ if response.success?
162
+ entity.etag = response.headers["etag"]
163
+ entity.freeze
164
+ else
165
+ entity.error = response.error
166
+ end
167
+
168
+ response.success?
169
+ end
170
+
171
+ # Public: Query a table for a specific entity.
172
+ #
173
+ # table - An Azure::Tables::Table.
174
+ # partition_key - The PartitionKey of the desired entity.
175
+ # row_key - The RowKey of the desired entity.
176
+ # service - The backend service to implement this (optional).
177
+ #
178
+ # Returns an Entity, or nil if none is found.
179
+ def self.query_entity(table, partition_key, row_key, query={}, service=Azure::Tables::Services::QueryEntities.new)
180
+ query.update(partition_key: partition_key, row_key: row_key)
181
+ response = service.call(table.name, query)
182
+
183
+ if response.success?
184
+ Entity.from_entry(Azure::Atom::Entry.load_entry(response.body))
185
+ else
186
+ nil
187
+ end
188
+ end
189
+
190
+ # Public: Query a table for entities.
191
+ # Options Hash keys *should* be defined using :symbols.
192
+ #
193
+ # table - An Azure::Tables::Table.
194
+ # query - A hash of query options.
195
+ # service - The backend service to implement this (optional).
196
+ #
197
+ # Returns an array of entities.
198
+ def self.query_entities(table, query={}, service=Azure::Tables::Services::QueryEntities.new)
199
+ response = service.call(table.name, query)
200
+
201
+ if response.success?
202
+ feed = Atom::Feed.load_feed(response.body)
203
+ collection = Azure::Tables::EntitiesCollection.from_entries(table, feed.entries, query)
204
+ collection.continuation_token(
205
+ response.headers["x-ms-continuation-nextpartitionkey"],
206
+ response.headers["x-ms-continuation-nextrowkey"]
207
+ )
208
+
209
+ collection
210
+ else
211
+ Azure::Tables::EntitiesCollection.new(table, query)
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,71 @@
1
+ require "cgi"
2
+ require "azure/configuration"
3
+ require "azure/core/signer"
4
+
5
+ module Azure
6
+ module Tables
7
+ module Auth
8
+ class SharedKey < Core::Signer
9
+ # The Azure account's name.
10
+ attr :account_name
11
+
12
+ # Public: Initialize the Signer.
13
+ #
14
+ # account_name - The Azure account name. Defaults to the one in the
15
+ # global configuration.
16
+ # access_key - The Azure access_key encoded in Base64. Defaults to the
17
+ # one in the global configuration.
18
+ def initialize(account_name=Azure.config.account_name, access_key=Azure.config.access_key)
19
+ @account_name = account_name
20
+ super(access_key)
21
+ end
22
+
23
+ # Public: The name of the strategy.
24
+ #
25
+ # Returns a String.
26
+ def name
27
+ "SharedKey"
28
+ end
29
+
30
+ # Public: Generate a request signature.
31
+ #
32
+ # verb - The HTTP request method.
33
+ # uri - The URI of the request we're signing.
34
+ # headers - A Hash of HTTP request headers.
35
+ #
36
+ # Returns a Base64 String signed with HMAC.
37
+ def sign(method, uri, headers)
38
+ super(signable_string(method, uri, headers))
39
+ end
40
+
41
+ # Generate the string to sign.
42
+ #
43
+ # verb - The HTTP request method.
44
+ # uri - The URI of the request we're signing.
45
+ # headers - A Hash of HTTP request headers.
46
+ #
47
+ # Returns a plain text string.
48
+ def signable_string(method, uri, headers)
49
+ [
50
+ method.to_s.upcase,
51
+ headers.fetch("Content-MD5", ""),
52
+ headers.fetch("Content-Type", ""),
53
+ headers.fetch("Date") { headers.fetch("x-ms-date") },
54
+ canonicalized_resource(uri)
55
+ ].join("\n")
56
+ end
57
+
58
+ # Calculate the Canonicalized Resource string for a request.
59
+ #
60
+ # uri - The request's URI.
61
+ #
62
+ # Returns a String with the canonicalized resource.
63
+ def canonicalized_resource(uri)
64
+ path = "/%s%s" % [account_name, uri.path]
65
+ query = CGI.parse(uri.query.to_s).fetch("comp", nil)
66
+ [path, query].compact.join("?")
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,30 @@
1
+ require "azure/tables/auth/shared_key"
2
+
3
+ module Azure
4
+ module Tables
5
+ module Auth
6
+ class SharedKeyLite < SharedKey
7
+ # Public: The name of the strategy.
8
+ #
9
+ # Returns a String.
10
+ def name
11
+ "SharedKeyLite"
12
+ end
13
+
14
+ # Generate the string to sign.
15
+ #
16
+ # verb - The HTTP request method.
17
+ # uri - The URI of the request we're signing.
18
+ # headers - A Hash of HTTP request headers.
19
+ #
20
+ # Returns a plain text string.
21
+ def signable_string(method, uri, headers)
22
+ [
23
+ headers.fetch("Date") { headers.fetch("x-ms-date") },
24
+ canonicalized_resource(uri)
25
+ ].join("\n")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,66 @@
1
+ require "azure/tables"
2
+
3
+ module Azure
4
+ module Tables
5
+
6
+ class EntitiesCollection < Array
7
+
8
+ # Public: Create a EntitiesCollection instance.
9
+ #
10
+ # table - Azure::Tables::Table instace where entities in this class belongs to.
11
+ # query - A Hash with the query options passed to the server to get the feed.
12
+ #
13
+ # Returns the instance.
14
+ def initialize(table, query = {}, service = Azure::Tables)
15
+ @service = service
16
+ @query = query
17
+ @table = table
18
+ end
19
+
20
+ # Public: Creates an Azure::Tables::EntitiesCollection from entries feed.
21
+ #
22
+ # table - An Azure::Tables::Table instance.
23
+ # entries - An array of xml entries.
24
+ # query - A Hash with the query options passed to the server to get the feed.
25
+ #
26
+ # Returns an instance of Azure::Tables::EntitiesCollection.
27
+ def self.from_entries(table, entries, query = {}, service = Azure::Tables)
28
+ collection = self.new(table, query, service)
29
+
30
+ entries.each do |entry|
31
+ collection << Entity.from_entry(entry)
32
+ end
33
+
34
+ collection
35
+ end
36
+
37
+ # Public: Set continuation tokens for this collection
38
+ def continuation_token(next_partition_key, next_row_key)
39
+ @next_partition_key = next_partition_key
40
+ @next_row_key = next_row_key
41
+ end
42
+
43
+ # Public: Indicates if the collection is a paginated result.
44
+ # http://msdn.microsoft.com/en-us/library/windowsazure/dd135718
45
+ #
46
+ # Returs boolean.
47
+ def paginated?
48
+ @next_partition_key ? true : false
49
+ end
50
+
51
+ # Public: Returns continuation results if exists.
52
+ #
53
+ # Returns an instance of Azure::Tables::EntitiesCollection
54
+ def next
55
+ return nil if !paginated?
56
+
57
+ query = @query.merge({
58
+ "NextPartitionKey" => @next_partition_key,
59
+ "NextRowKey" => @next_row_key
60
+ })
61
+
62
+ @service.query_entities(@table, query)
63
+ end
64
+ end
65
+ end
66
+ end