stuartpreston-azure-sdk-for-ruby 0.7.1 → 0.7.2
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.
- checksums.yaml +4 -4
- data/.gitignore +11 -11
- data/.travis.yml +10 -10
- data/ChangeLog.txt +70 -68
- data/Gemfile +15 -15
- data/README.md +618 -618
- data/Rakefile +133 -133
- data/azure.gemspec +44 -44
- data/lib/azure.rb +52 -52
- data/lib/azure/base_management/affinity_group.rb +32 -32
- data/lib/azure/base_management/base_management_service.rb +304 -304
- data/lib/azure/base_management/location.rb +27 -27
- data/lib/azure/base_management/management_http_request.rb +171 -171
- data/lib/azure/base_management/serialization.rb +129 -129
- data/lib/azure/base_management/sql_management_http_request.rb +45 -45
- data/lib/azure/blob/blob.rb +31 -31
- data/lib/azure/blob/blob_service.rb +1423 -1423
- data/lib/azure/blob/block.rb +30 -30
- data/lib/azure/blob/container.rb +31 -31
- data/lib/azure/blob/serialization.rb +284 -284
- data/lib/azure/cloud_service_management/cloud_service.rb +38 -38
- data/lib/azure/cloud_service_management/cloud_service_management_service.rb +140 -140
- data/lib/azure/cloud_service_management/serialization.rb +117 -117
- data/lib/azure/core.rb +39 -39
- data/lib/azure/core/auth/authorizer.rb +36 -36
- data/lib/azure/core/auth/shared_key.rb +110 -110
- data/lib/azure/core/auth/shared_key_lite.rb +48 -48
- data/lib/azure/core/auth/signer.rb +48 -48
- data/lib/azure/core/configuration.rb +211 -211
- data/lib/azure/core/error.rb +22 -22
- data/lib/azure/core/filtered_service.rb +43 -43
- data/lib/azure/core/http/debug_filter.rb +35 -35
- data/lib/azure/core/http/http_error.rb +88 -88
- data/lib/azure/core/http/http_filter.rb +52 -52
- data/lib/azure/core/http/http_request.rb +157 -157
- data/lib/azure/core/http/http_response.rb +140 -140
- data/lib/azure/core/http/retry_policy.rb +73 -73
- data/lib/azure/core/http/signer_filter.rb +33 -33
- data/lib/azure/core/service.rb +62 -62
- data/lib/azure/core/signed_service.rb +42 -42
- data/lib/azure/core/utility.rb +190 -190
- data/lib/azure/queue/message.rb +29 -29
- data/lib/azure/queue/queue.rb +28 -28
- data/lib/azure/queue/queue_service.rb +567 -567
- data/lib/azure/queue/serialization.rb +106 -106
- data/lib/azure/service/access_policy.rb +25 -25
- data/lib/azure/service/cors.rb +11 -11
- data/lib/azure/service/cors_rule.rb +15 -15
- data/lib/azure/service/enumeration_results.rb +20 -20
- data/lib/azure/service/logging.rb +31 -31
- data/lib/azure/service/metrics.rb +30 -30
- data/lib/azure/service/retention_policy.rb +24 -24
- data/lib/azure/service/serialization.rb +297 -297
- data/lib/azure/service/signed_identifier.rb +29 -29
- data/lib/azure/service/storage_service.rb +82 -82
- data/lib/azure/service/storage_service_properties.rb +37 -37
- data/lib/azure/service_bus/action.rb +21 -21
- data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
- data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
- data/lib/azure/service_bus/brokered_message.rb +123 -123
- data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
- data/lib/azure/service_bus/correlation_filter.rb +45 -45
- data/lib/azure/service_bus/empty_rule_action.rb +29 -29
- data/lib/azure/service_bus/false_filter.rb +38 -38
- data/lib/azure/service_bus/filter.rb +21 -21
- data/lib/azure/service_bus/interval.rb +103 -103
- data/lib/azure/service_bus/queue.rb +229 -229
- data/lib/azure/service_bus/relay.rb +87 -87
- data/lib/azure/service_bus/resource.rb +108 -108
- data/lib/azure/service_bus/rule.rb +97 -97
- data/lib/azure/service_bus/rule_aspect.rb +34 -34
- data/lib/azure/service_bus/serialization.rb +161 -161
- data/lib/azure/service_bus/service_bus_service.rb +896 -896
- data/lib/azure/service_bus/sql_filter.rb +50 -50
- data/lib/azure/service_bus/sql_rule_action.rb +50 -50
- data/lib/azure/service_bus/subscription.rb +183 -183
- data/lib/azure/service_bus/topic.rb +186 -186
- data/lib/azure/service_bus/true_filter.rb +38 -38
- data/lib/azure/sql_database_management/serialization.rb +111 -111
- data/lib/azure/sql_database_management/sql_database.rb +31 -31
- data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -200
- data/lib/azure/storage_management/serialization.rb +184 -184
- data/lib/azure/storage_management/storage_account.rb +40 -40
- data/lib/azure/storage_management/storage_management_service.rb +166 -166
- data/lib/azure/table/auth/shared_key.rb +92 -92
- data/lib/azure/table/auth/shared_key_lite.rb +44 -44
- data/lib/azure/table/batch.rb +329 -329
- data/lib/azure/table/batch_response.rb +118 -118
- data/lib/azure/table/edmtype.rb +126 -126
- data/lib/azure/table/entity.rb +30 -30
- data/lib/azure/table/guid.rb +23 -23
- data/lib/azure/table/query.rb +111 -111
- data/lib/azure/table/serialization.rb +107 -107
- data/lib/azure/table/table_service.rb +559 -559
- data/lib/azure/version.rb +31 -31
- data/lib/azure/virtual_machine_image_management/serialization.rb +66 -66
- data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +94 -94
- data/lib/azure/virtual_machine_management/serialization.rb +462 -462
- data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -45
- data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +588 -588
- data/lib/azure/virtual_network_management/serialization.rb +190 -190
- data/lib/azure/virtual_network_management/virtual_network.rb +37 -37
- data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
- data/test/fixtures/affinity_group.xml +33 -33
- data/test/fixtures/all_containers.xml +20 -20
- data/test/fixtures/all_tables.xml +22 -22
- data/test/fixtures/certificate.pem +21 -21
- data/test/fixtures/container_acl.xml +11 -11
- data/test/fixtures/create_sql_database_server.xml +1 -1
- data/test/fixtures/create_storage_desc_error.xml +5 -5
- data/test/fixtures/create_storage_extendedprop_error.xml +8 -8
- data/test/fixtures/create_storage_extendedpropname_error.xml +6 -6
- data/test/fixtures/create_storage_full_error.xml +6 -6
- data/test/fixtures/create_storage_label_error.xml +5 -5
- data/test/fixtures/create_storage_location_error.xml +5 -5
- data/test/fixtures/create_storage_name_error.xml +6 -6
- data/test/fixtures/create_table_response_entry.xml +15 -15
- data/test/fixtures/delete_storage_container_error.xml +5 -5
- data/test/fixtures/delete_storage_error.xml +5 -5
- data/test/fixtures/deployment_error.xml +5 -5
- data/test/fixtures/get_storage_account_error.xml +5 -5
- data/test/fixtures/get_storage_account_properties.xml +31 -31
- data/test/fixtures/get_storage_account_properties_new.xml +31 -31
- data/test/fixtures/http_error.xml +5 -5
- data/test/fixtures/insert_entity_response_entry.xml +25 -25
- data/test/fixtures/list_affinity_groups.xml +22 -22
- data/test/fixtures/list_blobs.xml +120 -120
- data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
- data/test/fixtures/list_blocks_all.xml +22 -22
- data/test/fixtures/list_blocks_committed.xml +12 -12
- data/test/fixtures/list_cloud_services.xml +38 -38
- data/test/fixtures/list_containers.xml +37 -37
- data/test/fixtures/list_firewall_management_endpoint.xml +27 -27
- data/test/fixtures/list_images.xml +110 -110
- data/test/fixtures/list_locations.xml +62 -62
- data/test/fixtures/list_page_ranges.xml +10 -10
- data/test/fixtures/list_sql_database.xml +36 -36
- data/test/fixtures/list_sql_server_firewall.xml +23 -23
- data/test/fixtures/list_storage_account_single.xml +24 -24
- data/test/fixtures/list_storage_accounts.xml +45 -45
- data/test/fixtures/list_virtual_networks.xml +92 -92
- data/test/fixtures/logging.xml +11 -11
- data/test/fixtures/management_certificate.pem +55 -55
- data/test/fixtures/messages.xml +12 -12
- data/test/fixtures/metrics.xml +10 -10
- data/test/fixtures/privatekey.key +28 -28
- data/test/fixtures/query_entities_empty_response.xml +7 -7
- data/test/fixtures/query_entities_response.xml +45 -45
- data/test/fixtures/queue_service_properties.xml +22 -22
- data/test/fixtures/queue_service_properties_original.xml +19 -19
- data/test/fixtures/queues.xml +16 -16
- data/test/fixtures/retention_policy.xml +5 -5
- data/test/fixtures/sb_default_create_queue_response.xml +23 -23
- data/test/fixtures/sb_default_create_relay_response.xml +15 -15
- data/test/fixtures/sb_default_create_topic_response.xml +18 -18
- data/test/fixtures/sb_get_access_token_response.txt +1 -1
- data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
- data/test/fixtures/storage_service_properties.xml +54 -54
- data/test/fixtures/update_storage_account.xml +16 -16
- data/test/fixtures/update_storage_error.xml +4 -4
- data/test/fixtures/updated_storage_accounts.xml +52 -52
- data/test/fixtures/virtual_machine.xml +113 -113
- data/test/fixtures/windows_virtual_machine.xml +106 -106
- data/test/integration/affinity_group/Affinity_test.rb +55 -55
- data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
- data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
- data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
- data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
- data/test/integration/blob/blob_gb18030_test.rb +199 -199
- data/test/integration/blob/blob_metadata_test.rb +75 -75
- data/test/integration/blob/blob_pages_test.rb +119 -119
- data/test/integration/blob/blob_properties_test.rb +77 -77
- data/test/integration/blob/block_blob_test.rb +254 -254
- data/test/integration/blob/container/container_acl_test.rb +69 -69
- data/test/integration/blob/container/container_metadata_test.rb +50 -50
- data/test/integration/blob/container/create_container_test.rb +60 -60
- data/test/integration/blob/container/delete_container_test.rb +39 -39
- data/test/integration/blob/container/get_container_properties_test.rb +48 -48
- data/test/integration/blob/container/list_containers_test.rb +79 -79
- data/test/integration/blob/container/root_container_test.rb +53 -53
- data/test/integration/blob/copy_blob_test.rb +113 -113
- data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
- data/test/integration/blob/create_page_blob_test.rb +83 -83
- data/test/integration/blob/delete_blob_test.rb +159 -159
- data/test/integration/blob/get_blob_test.rb +65 -65
- data/test/integration/blob/informative_errors_test.rb +38 -38
- data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
- data/test/integration/blob/lease/break_lease_test.rb +40 -40
- data/test/integration/blob/lease/release_lease_test.rb +40 -40
- data/test/integration/blob/lease/renew_lease_test.rb +42 -42
- data/test/integration/blob/list_blobs_test.rb +113 -113
- data/test/integration/cloud_service/Cloud_Create_test.rb +44 -44
- data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -44
- data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
- data/test/integration/database/create_sql_server_test.rb +53 -53
- data/test/integration/database/delete_sql_server_firewall_test.rb +70 -70
- data/test/integration/database/delete_sql_server_test.rb +58 -58
- data/test/integration/database/list_sql_server_firewall_test.rb +45 -45
- data/test/integration/database/list_sql_servers_test.rb +44 -44
- data/test/integration/database/reset_password_sql_server_test.rb +55 -55
- data/test/integration/location/Location_List_test.rb +39 -39
- data/test/integration/queue/clear_messages_test.rb +42 -42
- data/test/integration/queue/create_message_test.rb +75 -75
- data/test/integration/queue/create_queue_test.rb +50 -50
- data/test/integration/queue/delete_message_test.rb +67 -67
- data/test/integration/queue/delete_queue_test.rb +45 -45
- data/test/integration/queue/informative_errors_test.rb +41 -41
- data/test/integration/queue/list_messages_encoded_test.rb +79 -79
- data/test/integration/queue/list_messages_test.rb +79 -79
- data/test/integration/queue/list_queues_test.rb +44 -44
- data/test/integration/queue/peek_messages_test.rb +59 -59
- data/test/integration/queue/queue_gb18030_test.rb +131 -131
- data/test/integration/queue/queue_metadata_test.rb +40 -40
- data/test/integration/queue/update_message_test.rb +74 -74
- data/test/integration/service_bus/informative_errors_test.rb +36 -36
- data/test/integration/service_bus/queues_scenario_test.rb +200 -200
- data/test/integration/service_bus/queues_test.rb +265 -265
- data/test/integration/service_bus/relay_test.rb +131 -131
- data/test/integration/service_bus/rules_test.rb +144 -144
- data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
- data/test/integration/service_bus/scenario_test.rb +101 -101
- data/test/integration/service_bus/subscriptions_test.rb +211 -211
- data/test/integration/service_bus/topics_scenario_test.rb +406 -406
- data/test/integration/service_bus/topics_test.rb +129 -129
- data/test/integration/storage_management/storage_management_test.rb +160 -160
- data/test/integration/table/create_table_test.rb +35 -35
- data/test/integration/table/delete_entity_batch_test.rb +106 -106
- data/test/integration/table/delete_entity_test.rb +93 -93
- data/test/integration/table/delete_table_test.rb +39 -39
- data/test/integration/table/get_table_test.rb +36 -36
- data/test/integration/table/informative_errors_test.rb +38 -38
- data/test/integration/table/insert_entity_batch_test.rb +99 -99
- data/test/integration/table/insert_entity_test.rb +87 -87
- data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
- data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
- data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
- data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
- data/test/integration/table/merge_entity_batch_test.rb +127 -127
- data/test/integration/table/merge_entity_test.rb +112 -112
- data/test/integration/table/query_entities_test.rb +194 -194
- data/test/integration/table/query_tables_test.rb +42 -42
- data/test/integration/table/query_test.rb +250 -250
- data/test/integration/table/table_acl_test.rb +51 -51
- data/test/integration/table/table_gb18030_test.rb +355 -355
- data/test/integration/table/update_entity_batch_test.rb +148 -148
- data/test/integration/table/update_entity_test.rb +130 -130
- data/test/integration/test_helper.rb +42 -42
- data/test/integration/vm/VM_Create_test.rb +260 -260
- data/test/integration/vm/VM_Delete_test.rb +55 -55
- data/test/integration/vm/VM_Operations_test.rb +173 -173
- data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
- data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
- data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
- data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
- data/test/support/env.rb +19 -19
- data/test/support/fixtures.rb +36 -36
- data/test/support/name_generator.rb +168 -168
- data/test/support/stubs.rb +42 -42
- data/test/support/virtual_machine_name_generator.rb +102 -102
- data/test/support/virtual_network_helper.rb +73 -73
- data/test/test_helper.rb +53 -53
- data/test/unit/affinity_group/affinity_group_test.rb +192 -192
- data/test/unit/affinity_group/serialization_test.rb +88 -88
- data/test/unit/base_management/location_test.rb +57 -57
- data/test/unit/blob/blob_service_test.rb +1946 -1946
- data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
- data/test/unit/cloud_service_management/serialization_test.rb +169 -169
- data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
- data/test/unit/core/auth/shared_key_test.rb +58 -58
- data/test/unit/core/auth/signer_test.rb +30 -30
- data/test/unit/core/http/http_error_test.rb +57 -57
- data/test/unit/core/http/http_request_test.rb +66 -66
- data/test/unit/core/http/http_response_test.rb +45 -45
- data/test/unit/core/http/retry_policy_test.rb +23 -23
- data/test/unit/database/serialization_test.rb +97 -97
- data/test/unit/database/sql_database_server_service_test.rb +288 -288
- data/test/unit/service/serialization_test.rb +532 -532
- data/test/unit/service/storage_service_test.rb +292 -292
- data/test/unit/storage_management/serialization_test.rb +232 -232
- data/test/unit/storage_management/storage_management_service_test.rb +261 -261
- data/test/unit/table/edmtype_test.rb +107 -107
- data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -35
- data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -65
- data/test/unit/virtual_machine_management/serialization_test.rb +258 -258
- data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -440
- data/test/unit/vnet/serialization_test.rb +187 -187
- data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
- metadata +34 -27
@@ -1,92 +1,92 @@
|
|
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 "cgi"
|
16
|
-
|
17
|
-
require "azure/core/configuration"
|
18
|
-
require "azure/core/auth/signer"
|
19
|
-
|
20
|
-
module Azure
|
21
|
-
module Table
|
22
|
-
module Auth
|
23
|
-
class SharedKey < Azure::Core::Auth::Signer
|
24
|
-
# The account name
|
25
|
-
attr :account_name
|
26
|
-
|
27
|
-
# Public: Initialize the Signer.
|
28
|
-
#
|
29
|
-
# account_name - The account name. Defaults to the one in the
|
30
|
-
# global configuration.
|
31
|
-
# access_key - The access_key encoded in Base64. Defaults to the
|
32
|
-
# one in the global configuration.
|
33
|
-
def initialize(account_name=Azure.config.storage_account_name, access_key=Azure.config.storage_access_key)
|
34
|
-
@account_name = account_name
|
35
|
-
super(access_key)
|
36
|
-
end
|
37
|
-
|
38
|
-
# Public: The name of the strategy.
|
39
|
-
#
|
40
|
-
# Returns a String.
|
41
|
-
def name
|
42
|
-
"SharedKey"
|
43
|
-
end
|
44
|
-
|
45
|
-
# Public: Generate a request signature.
|
46
|
-
#
|
47
|
-
# verb - The HTTP request method.
|
48
|
-
# uri - The URI of the request we're signing.
|
49
|
-
# headers - A Hash of HTTP request headers.
|
50
|
-
#
|
51
|
-
# Returns a Base64 String signed with HMAC.
|
52
|
-
def sign(method, uri, headers)
|
53
|
-
signature = super(signable_string(method, uri, headers))
|
54
|
-
return "#{account_name}:#{signature}"
|
55
|
-
end
|
56
|
-
|
57
|
-
# Generate the string to sign.
|
58
|
-
#
|
59
|
-
# verb - The HTTP request method.
|
60
|
-
# uri - The URI of the request we're signing.
|
61
|
-
# headers - A Hash of HTTP request headers.
|
62
|
-
#
|
63
|
-
# Returns a plain text string.
|
64
|
-
def signable_string(method, uri, headers)
|
65
|
-
[
|
66
|
-
method.to_s.upcase,
|
67
|
-
headers.fetch("Content-MD5", ""),
|
68
|
-
headers.fetch("Content-Type", ""),
|
69
|
-
headers.fetch("Date") { headers.fetch("x-ms-date") },
|
70
|
-
canonicalized_resource(uri)
|
71
|
-
].join("\n")
|
72
|
-
end
|
73
|
-
|
74
|
-
# Calculate the Canonicalized Resource string for a request.
|
75
|
-
#
|
76
|
-
# uri - The request's URI.
|
77
|
-
#
|
78
|
-
# Returns a String with the canonicalized resource.
|
79
|
-
def canonicalized_resource(uri)
|
80
|
-
resource = "/%s%s" % [account_name, uri.path]
|
81
|
-
|
82
|
-
comp = CGI.parse(uri.query.to_s).fetch("comp", nil)
|
83
|
-
if (comp)
|
84
|
-
resource = [resource, "comp=" + comp[0]].join("?")
|
85
|
-
end
|
86
|
-
|
87
|
-
resource
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
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 "cgi"
|
16
|
+
|
17
|
+
require "azure/core/configuration"
|
18
|
+
require "azure/core/auth/signer"
|
19
|
+
|
20
|
+
module Azure
|
21
|
+
module Table
|
22
|
+
module Auth
|
23
|
+
class SharedKey < Azure::Core::Auth::Signer
|
24
|
+
# The account name
|
25
|
+
attr :account_name
|
26
|
+
|
27
|
+
# Public: Initialize the Signer.
|
28
|
+
#
|
29
|
+
# account_name - The account name. Defaults to the one in the
|
30
|
+
# global configuration.
|
31
|
+
# access_key - The access_key encoded in Base64. Defaults to the
|
32
|
+
# one in the global configuration.
|
33
|
+
def initialize(account_name=Azure.config.storage_account_name, access_key=Azure.config.storage_access_key)
|
34
|
+
@account_name = account_name
|
35
|
+
super(access_key)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Public: The name of the strategy.
|
39
|
+
#
|
40
|
+
# Returns a String.
|
41
|
+
def name
|
42
|
+
"SharedKey"
|
43
|
+
end
|
44
|
+
|
45
|
+
# Public: Generate a request signature.
|
46
|
+
#
|
47
|
+
# verb - The HTTP request method.
|
48
|
+
# uri - The URI of the request we're signing.
|
49
|
+
# headers - A Hash of HTTP request headers.
|
50
|
+
#
|
51
|
+
# Returns a Base64 String signed with HMAC.
|
52
|
+
def sign(method, uri, headers)
|
53
|
+
signature = super(signable_string(method, uri, headers))
|
54
|
+
return "#{account_name}:#{signature}"
|
55
|
+
end
|
56
|
+
|
57
|
+
# Generate the string to sign.
|
58
|
+
#
|
59
|
+
# verb - The HTTP request method.
|
60
|
+
# uri - The URI of the request we're signing.
|
61
|
+
# headers - A Hash of HTTP request headers.
|
62
|
+
#
|
63
|
+
# Returns a plain text string.
|
64
|
+
def signable_string(method, uri, headers)
|
65
|
+
[
|
66
|
+
method.to_s.upcase,
|
67
|
+
headers.fetch("Content-MD5", ""),
|
68
|
+
headers.fetch("Content-Type", ""),
|
69
|
+
headers.fetch("Date") { headers.fetch("x-ms-date") },
|
70
|
+
canonicalized_resource(uri)
|
71
|
+
].join("\n")
|
72
|
+
end
|
73
|
+
|
74
|
+
# Calculate the Canonicalized Resource string for a request.
|
75
|
+
#
|
76
|
+
# uri - The request's URI.
|
77
|
+
#
|
78
|
+
# Returns a String with the canonicalized resource.
|
79
|
+
def canonicalized_resource(uri)
|
80
|
+
resource = "/%s%s" % [account_name, uri.path]
|
81
|
+
|
82
|
+
comp = CGI.parse(uri.query.to_s).fetch("comp", nil)
|
83
|
+
if (comp)
|
84
|
+
resource = [resource, "comp=" + comp[0]].join("?")
|
85
|
+
end
|
86
|
+
|
87
|
+
resource
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -1,44 +1,44 @@
|
|
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/table/auth/shared_key"
|
16
|
-
|
17
|
-
module Azure
|
18
|
-
module Table
|
19
|
-
module Auth
|
20
|
-
class SharedKeyLite < SharedKey
|
21
|
-
# Public: The name of the strategy.
|
22
|
-
#
|
23
|
-
# Returns a String.
|
24
|
-
def name
|
25
|
-
"SharedKeyLite"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Generate the string to sign.
|
29
|
-
#
|
30
|
-
# verb - The HTTP request method.
|
31
|
-
# uri - The URI of the request we're signing.
|
32
|
-
# headers - A Hash of HTTP request headers.
|
33
|
-
#
|
34
|
-
# Returns a plain text string.
|
35
|
-
def signable_string(method, uri, headers)
|
36
|
-
[
|
37
|
-
headers.fetch("Date") { headers.fetch("x-ms-date") },
|
38
|
-
canonicalized_resource(uri)
|
39
|
-
].join("\n")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
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/table/auth/shared_key"
|
16
|
+
|
17
|
+
module Azure
|
18
|
+
module Table
|
19
|
+
module Auth
|
20
|
+
class SharedKeyLite < SharedKey
|
21
|
+
# Public: The name of the strategy.
|
22
|
+
#
|
23
|
+
# Returns a String.
|
24
|
+
def name
|
25
|
+
"SharedKeyLite"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Generate the string to sign.
|
29
|
+
#
|
30
|
+
# verb - The HTTP request method.
|
31
|
+
# uri - The URI of the request we're signing.
|
32
|
+
# headers - A Hash of HTTP request headers.
|
33
|
+
#
|
34
|
+
# Returns a plain text string.
|
35
|
+
def signable_string(method, uri, headers)
|
36
|
+
[
|
37
|
+
headers.fetch("Date") { headers.fetch("x-ms-date") },
|
38
|
+
canonicalized_resource(uri)
|
39
|
+
].join("\n")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/azure/table/batch.rb
CHANGED
@@ -1,330 +1,330 @@
|
|
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 'uuid'
|
16
|
-
|
17
|
-
require 'azure/table/serialization'
|
18
|
-
require 'azure/table/table_service'
|
19
|
-
require 'azure/table/batch_response'
|
20
|
-
require 'azure/core/http/http_error'
|
21
|
-
|
22
|
-
module Azure
|
23
|
-
module Table
|
24
|
-
# Represents a batch of table operations.
|
25
|
-
#
|
26
|
-
# Example usage (block syntax):
|
27
|
-
#
|
28
|
-
# results = Batch.new "table", "partition" do
|
29
|
-
# insert "row1", {"meta"=>"data"}
|
30
|
-
# insert "row2", {"meta"=>"data"}
|
31
|
-
# end.execute
|
32
|
-
#
|
33
|
-
# which is equivalent to (fluent syntax):
|
34
|
-
#
|
35
|
-
# results = Batch.new("table", "partition")
|
36
|
-
# .insert("row1", {"meta"=>"data"})
|
37
|
-
# .insert("row2", {"meta"=>"data"})
|
38
|
-
# .execute
|
39
|
-
#
|
40
|
-
# which is equivalent to (as class):
|
41
|
-
#
|
42
|
-
# svc = TableSerice.new
|
43
|
-
#
|
44
|
-
# batch = Batch.new "table", "partition"
|
45
|
-
# batch.insert "row1", {"meta"=>"data"}
|
46
|
-
# batch.insert "row2", {"meta"=>"data"}
|
47
|
-
#
|
48
|
-
# results = svc.execute_batch batch
|
49
|
-
#
|
50
|
-
class Batch
|
51
|
-
def initialize(table, partition, &block)
|
52
|
-
@table = table
|
53
|
-
@partition = partition
|
54
|
-
@operations = []
|
55
|
-
@entity_keys = []
|
56
|
-
@table_service = Azure::Table::TableService.new
|
57
|
-
uuid = UUID.new
|
58
|
-
@batch_id = "batch_" + uuid.generate
|
59
|
-
@changeset_id = "changeset_" + uuid.generate
|
60
|
-
|
61
|
-
self.instance_eval(&block) if block_given?
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
attr_reader :table
|
66
|
-
attr_reader :partition
|
67
|
-
attr_reader :table_service
|
68
|
-
|
69
|
-
attr_accessor :operations
|
70
|
-
attr_accessor :entity_keys
|
71
|
-
attr_accessor :changeset_id
|
72
|
-
|
73
|
-
public
|
74
|
-
attr_accessor :batch_id
|
75
|
-
|
76
|
-
protected
|
77
|
-
def execute
|
78
|
-
@table_service.execute_batch(self)
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
class ResponseWrapper
|
83
|
-
def initialize(hash)
|
84
|
-
@hash = hash
|
85
|
-
end
|
86
|
-
|
87
|
-
def uri
|
88
|
-
@hash[:uri]
|
89
|
-
end
|
90
|
-
|
91
|
-
def status_code
|
92
|
-
@hash[:status_code].to_i
|
93
|
-
end
|
94
|
-
|
95
|
-
def body
|
96
|
-
@hash[:body]
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
protected
|
101
|
-
def add_operation(method, uri, body=nil, headers=nil)
|
102
|
-
op = {
|
103
|
-
:method => method,
|
104
|
-
:uri => uri,
|
105
|
-
:body => body,
|
106
|
-
:headers => headers
|
107
|
-
}
|
108
|
-
operations.push op
|
109
|
-
end
|
110
|
-
|
111
|
-
protected
|
112
|
-
def check_entity_key(key)
|
113
|
-
raise ArgumentError, "Only allowed to perform a single operation per entity, and there is already a operation registered in this batch for the key: #{key}." if entity_keys.include? key
|
114
|
-
entity_keys.push key
|
115
|
-
end
|
116
|
-
|
117
|
-
public
|
118
|
-
def parse_response(response)
|
119
|
-
responses = BatchResponse.parse response.body
|
120
|
-
new_responses = []
|
121
|
-
|
122
|
-
(0..responses.length-1).each { |index|
|
123
|
-
operation = operations[index]
|
124
|
-
response = responses[index]
|
125
|
-
|
126
|
-
if response[:status_code].to_i > 299
|
127
|
-
# failed
|
128
|
-
error = Azure::Core::Http::HTTPError.new(ResponseWrapper.new(response.merge({:uri=>operation[:uri]})))
|
129
|
-
error.description = response[:message] if (error.description || '').strip == ''
|
130
|
-
raise error
|
131
|
-
else
|
132
|
-
# success
|
133
|
-
case operation[:method]
|
134
|
-
when :post
|
135
|
-
# entity from body
|
136
|
-
result = Azure::Table::Serialization.hash_from_entry_xml(response[:body])
|
137
|
-
|
138
|
-
entity = Azure::Table::Entity.new
|
139
|
-
entity.table = table
|
140
|
-
entity.updated = result[:updated]
|
141
|
-
entity.etag = response[:headers]["etag"] || result[:etag]
|
142
|
-
entity.properties = result[:properties]
|
143
|
-
|
144
|
-
new_responses.push entity
|
145
|
-
when :put, :merge
|
146
|
-
# etag from headers
|
147
|
-
new_responses.push response[:headers]["etag"]
|
148
|
-
when :delete
|
149
|
-
# true
|
150
|
-
new_responses.push nil
|
151
|
-
end
|
152
|
-
end
|
153
|
-
}
|
154
|
-
|
155
|
-
new_responses
|
156
|
-
end
|
157
|
-
|
158
|
-
public
|
159
|
-
def to_body
|
160
|
-
body = ""
|
161
|
-
body.define_singleton_method(:add_line) do |a| self << (a||nil) + "\n" end
|
162
|
-
|
163
|
-
body.add_line "--#{batch_id}"
|
164
|
-
body.add_line "Content-Type: multipart/mixed; boundary=#{changeset_id}"
|
165
|
-
body.add_line ""
|
166
|
-
|
167
|
-
content_id = 1
|
168
|
-
operations.each { |op|
|
169
|
-
body.add_line "--#{changeset_id}"
|
170
|
-
body.add_line "Content-Type: application/http"
|
171
|
-
body.add_line "Content-Transfer-Encoding: binary"
|
172
|
-
body.add_line ""
|
173
|
-
body.add_line "#{op[:method].to_s.upcase} #{op[:uri]} HTTP/1.1"
|
174
|
-
body.add_line "Content-ID: #{content_id}"
|
175
|
-
|
176
|
-
if op[:headers]
|
177
|
-
op[:headers].each { |k,v|
|
178
|
-
body.add_line "#{k}: #{v}"
|
179
|
-
}
|
180
|
-
end
|
181
|
-
|
182
|
-
if op[:body]
|
183
|
-
body.add_line "Content-Type: application/atom+xml;type=entry"
|
184
|
-
body.add_line "Content-Length: #{op[:body].bytesize.to_s}"
|
185
|
-
body.add_line ""
|
186
|
-
body.add_line op[:body]
|
187
|
-
else
|
188
|
-
body.add_line ""
|
189
|
-
end
|
190
|
-
|
191
|
-
content_id += 1
|
192
|
-
}
|
193
|
-
body.add_line "--#{changeset_id}--"
|
194
|
-
body.add_line "--#{batch_id}--"
|
195
|
-
end
|
196
|
-
|
197
|
-
# Public: Inserts new entity to the table.
|
198
|
-
#
|
199
|
-
# ==== Attributes
|
200
|
-
#
|
201
|
-
# * +row_key+ - String. The row key
|
202
|
-
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
203
|
-
#
|
204
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179433
|
205
|
-
public
|
206
|
-
def insert(row_key, entity_values)
|
207
|
-
check_entity_key(row_key)
|
208
|
-
|
209
|
-
body = Azure::Table::Serialization.hash_to_entry_xml({
|
210
|
-
"PartitionKey" => partition,
|
211
|
-
"RowKey" => row_key
|
212
|
-
}.merge(entity_values) ).to_xml
|
213
|
-
|
214
|
-
add_operation(:post, @table_service.entities_uri(table), body)
|
215
|
-
self
|
216
|
-
end
|
217
|
-
|
218
|
-
# Public: Updates an existing entity in a table. The Update Entity operation replaces
|
219
|
-
# the entire entity and can be used to remove properties.
|
220
|
-
#
|
221
|
-
# ==== Attributes
|
222
|
-
#
|
223
|
-
# * +row_key+ - String. The row key
|
224
|
-
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
225
|
-
# * +options+ - Hash. Optional parameters.
|
226
|
-
#
|
227
|
-
# ==== Options
|
228
|
-
#
|
229
|
-
# Accepted key/value pairs in options parameter are:
|
230
|
-
# * :if_match - String. A matching condition which is required for update (optional, Default="*")
|
231
|
-
# * :create_if_not_exists - Boolean. If true, and partition_key and row_key do not reference and existing entity,
|
232
|
-
# that entity will be inserted. If false, the operation will fail. (optional, Default=false)
|
233
|
-
#
|
234
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179427
|
235
|
-
public
|
236
|
-
def update(row_key, entity_values, options={})
|
237
|
-
check_entity_key(row_key)
|
238
|
-
|
239
|
-
uri = @table_service.entities_uri(table, partition, row_key)
|
240
|
-
|
241
|
-
headers = {}
|
242
|
-
headers["If-Match"] = options[:if_match] || "*" unless options[:create_if_not_exists]
|
243
|
-
|
244
|
-
body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
|
245
|
-
|
246
|
-
add_operation(:put, uri, body, headers)
|
247
|
-
self
|
248
|
-
end
|
249
|
-
|
250
|
-
# Public: Updates an existing entity by updating the entity's properties. This operation
|
251
|
-
# does not replace the existing entity, as the update_entity operation does.
|
252
|
-
#
|
253
|
-
# ==== Attributes
|
254
|
-
#
|
255
|
-
# * +row_key+ - String. The row key
|
256
|
-
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
257
|
-
# * +options+ - Hash. Optional parameters.
|
258
|
-
#
|
259
|
-
# ==== Options
|
260
|
-
#
|
261
|
-
# Accepted key/value pairs in options parameter are:
|
262
|
-
# * +if_match+ - String. A matching condition which is required for update (optional, Default="*")
|
263
|
-
# * +create_if_not_exists+ - Boolean. If true, and partition_key and row_key do not reference and existing entity,
|
264
|
-
# that entity will be inserted. If false, the operation will fail. (optional, Default=false)
|
265
|
-
#
|
266
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179392
|
267
|
-
public
|
268
|
-
def merge(row_key, entity_values, options={})
|
269
|
-
check_entity_key(row_key)
|
270
|
-
|
271
|
-
uri = @table_service.entities_uri(table, partition, row_key)
|
272
|
-
|
273
|
-
headers = {}
|
274
|
-
headers["If-Match"] = options[:if_match] || "*" unless options[:create_if_not_exists]
|
275
|
-
|
276
|
-
body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
|
277
|
-
|
278
|
-
add_operation(:merge, uri, body, headers)
|
279
|
-
self
|
280
|
-
end
|
281
|
-
|
282
|
-
# Public: Inserts or updates an existing entity within a table by merging new property values into the entity.
|
283
|
-
#
|
284
|
-
# ==== Attributes
|
285
|
-
#
|
286
|
-
# * +row_key+ - String. The row key
|
287
|
-
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
288
|
-
#
|
289
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh452241
|
290
|
-
public
|
291
|
-
def insert_or_merge(row_key, entity_values)
|
292
|
-
merge(row_key, entity_values, { :create_if_not_exists => true })
|
293
|
-
self
|
294
|
-
end
|
295
|
-
|
296
|
-
# Public: Inserts or updates a new entity into a table.
|
297
|
-
#
|
298
|
-
# ==== Attributes
|
299
|
-
#
|
300
|
-
# * +row_key+ - String. The row key
|
301
|
-
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
302
|
-
#
|
303
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh452242
|
304
|
-
public
|
305
|
-
def insert_or_replace(row_key, entity_values)
|
306
|
-
update(row_key, entity_values, { :create_if_not_exists => true })
|
307
|
-
self
|
308
|
-
end
|
309
|
-
|
310
|
-
# Public: Deletes an existing entity in the table.
|
311
|
-
#
|
312
|
-
# ==== Attributes
|
313
|
-
#
|
314
|
-
# * +row_key+ - String. The row key
|
315
|
-
# * +options+ - Hash. Optional parameters.
|
316
|
-
#
|
317
|
-
# ==== Options
|
318
|
-
#
|
319
|
-
# Accepted key/value pairs in options parameter are:
|
320
|
-
# * +if_match+ - String. A matching condition which is required for update (optional, Default="*")
|
321
|
-
#
|
322
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd135727
|
323
|
-
public
|
324
|
-
def delete(row_key, options={})
|
325
|
-
add_operation(:delete, @table_service.entities_uri(table, partition, row_key), nil, {"If-Match"=> options[:if_match] || "*"})
|
326
|
-
self
|
327
|
-
end
|
328
|
-
end
|
329
|
-
end
|
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 'uuid'
|
16
|
+
|
17
|
+
require 'azure/table/serialization'
|
18
|
+
require 'azure/table/table_service'
|
19
|
+
require 'azure/table/batch_response'
|
20
|
+
require 'azure/core/http/http_error'
|
21
|
+
|
22
|
+
module Azure
|
23
|
+
module Table
|
24
|
+
# Represents a batch of table operations.
|
25
|
+
#
|
26
|
+
# Example usage (block syntax):
|
27
|
+
#
|
28
|
+
# results = Batch.new "table", "partition" do
|
29
|
+
# insert "row1", {"meta"=>"data"}
|
30
|
+
# insert "row2", {"meta"=>"data"}
|
31
|
+
# end.execute
|
32
|
+
#
|
33
|
+
# which is equivalent to (fluent syntax):
|
34
|
+
#
|
35
|
+
# results = Batch.new("table", "partition")
|
36
|
+
# .insert("row1", {"meta"=>"data"})
|
37
|
+
# .insert("row2", {"meta"=>"data"})
|
38
|
+
# .execute
|
39
|
+
#
|
40
|
+
# which is equivalent to (as class):
|
41
|
+
#
|
42
|
+
# svc = TableSerice.new
|
43
|
+
#
|
44
|
+
# batch = Batch.new "table", "partition"
|
45
|
+
# batch.insert "row1", {"meta"=>"data"}
|
46
|
+
# batch.insert "row2", {"meta"=>"data"}
|
47
|
+
#
|
48
|
+
# results = svc.execute_batch batch
|
49
|
+
#
|
50
|
+
class Batch
|
51
|
+
def initialize(table, partition, &block)
|
52
|
+
@table = table
|
53
|
+
@partition = partition
|
54
|
+
@operations = []
|
55
|
+
@entity_keys = []
|
56
|
+
@table_service = Azure::Table::TableService.new
|
57
|
+
uuid = UUID.new
|
58
|
+
@batch_id = "batch_" + uuid.generate
|
59
|
+
@changeset_id = "changeset_" + uuid.generate
|
60
|
+
|
61
|
+
self.instance_eval(&block) if block_given?
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
attr_reader :table
|
66
|
+
attr_reader :partition
|
67
|
+
attr_reader :table_service
|
68
|
+
|
69
|
+
attr_accessor :operations
|
70
|
+
attr_accessor :entity_keys
|
71
|
+
attr_accessor :changeset_id
|
72
|
+
|
73
|
+
public
|
74
|
+
attr_accessor :batch_id
|
75
|
+
|
76
|
+
protected
|
77
|
+
def execute
|
78
|
+
@table_service.execute_batch(self)
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
class ResponseWrapper
|
83
|
+
def initialize(hash)
|
84
|
+
@hash = hash
|
85
|
+
end
|
86
|
+
|
87
|
+
def uri
|
88
|
+
@hash[:uri]
|
89
|
+
end
|
90
|
+
|
91
|
+
def status_code
|
92
|
+
@hash[:status_code].to_i
|
93
|
+
end
|
94
|
+
|
95
|
+
def body
|
96
|
+
@hash[:body]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
protected
|
101
|
+
def add_operation(method, uri, body=nil, headers=nil)
|
102
|
+
op = {
|
103
|
+
:method => method,
|
104
|
+
:uri => uri,
|
105
|
+
:body => body,
|
106
|
+
:headers => headers
|
107
|
+
}
|
108
|
+
operations.push op
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
def check_entity_key(key)
|
113
|
+
raise ArgumentError, "Only allowed to perform a single operation per entity, and there is already a operation registered in this batch for the key: #{key}." if entity_keys.include? key
|
114
|
+
entity_keys.push key
|
115
|
+
end
|
116
|
+
|
117
|
+
public
|
118
|
+
def parse_response(response)
|
119
|
+
responses = BatchResponse.parse response.body
|
120
|
+
new_responses = []
|
121
|
+
|
122
|
+
(0..responses.length-1).each { |index|
|
123
|
+
operation = operations[index]
|
124
|
+
response = responses[index]
|
125
|
+
|
126
|
+
if response[:status_code].to_i > 299
|
127
|
+
# failed
|
128
|
+
error = Azure::Core::Http::HTTPError.new(ResponseWrapper.new(response.merge({:uri=>operation[:uri]})))
|
129
|
+
error.description = response[:message] if (error.description || '').strip == ''
|
130
|
+
raise error
|
131
|
+
else
|
132
|
+
# success
|
133
|
+
case operation[:method]
|
134
|
+
when :post
|
135
|
+
# entity from body
|
136
|
+
result = Azure::Table::Serialization.hash_from_entry_xml(response[:body])
|
137
|
+
|
138
|
+
entity = Azure::Table::Entity.new
|
139
|
+
entity.table = table
|
140
|
+
entity.updated = result[:updated]
|
141
|
+
entity.etag = response[:headers]["etag"] || result[:etag]
|
142
|
+
entity.properties = result[:properties]
|
143
|
+
|
144
|
+
new_responses.push entity
|
145
|
+
when :put, :merge
|
146
|
+
# etag from headers
|
147
|
+
new_responses.push response[:headers]["etag"]
|
148
|
+
when :delete
|
149
|
+
# true
|
150
|
+
new_responses.push nil
|
151
|
+
end
|
152
|
+
end
|
153
|
+
}
|
154
|
+
|
155
|
+
new_responses
|
156
|
+
end
|
157
|
+
|
158
|
+
public
|
159
|
+
def to_body
|
160
|
+
body = ""
|
161
|
+
body.define_singleton_method(:add_line) do |a| self << (a||nil) + "\n" end
|
162
|
+
|
163
|
+
body.add_line "--#{batch_id}"
|
164
|
+
body.add_line "Content-Type: multipart/mixed; boundary=#{changeset_id}"
|
165
|
+
body.add_line ""
|
166
|
+
|
167
|
+
content_id = 1
|
168
|
+
operations.each { |op|
|
169
|
+
body.add_line "--#{changeset_id}"
|
170
|
+
body.add_line "Content-Type: application/http"
|
171
|
+
body.add_line "Content-Transfer-Encoding: binary"
|
172
|
+
body.add_line ""
|
173
|
+
body.add_line "#{op[:method].to_s.upcase} #{op[:uri]} HTTP/1.1"
|
174
|
+
body.add_line "Content-ID: #{content_id}"
|
175
|
+
|
176
|
+
if op[:headers]
|
177
|
+
op[:headers].each { |k,v|
|
178
|
+
body.add_line "#{k}: #{v}"
|
179
|
+
}
|
180
|
+
end
|
181
|
+
|
182
|
+
if op[:body]
|
183
|
+
body.add_line "Content-Type: application/atom+xml;type=entry"
|
184
|
+
body.add_line "Content-Length: #{op[:body].bytesize.to_s}"
|
185
|
+
body.add_line ""
|
186
|
+
body.add_line op[:body]
|
187
|
+
else
|
188
|
+
body.add_line ""
|
189
|
+
end
|
190
|
+
|
191
|
+
content_id += 1
|
192
|
+
}
|
193
|
+
body.add_line "--#{changeset_id}--"
|
194
|
+
body.add_line "--#{batch_id}--"
|
195
|
+
end
|
196
|
+
|
197
|
+
# Public: Inserts new entity to the table.
|
198
|
+
#
|
199
|
+
# ==== Attributes
|
200
|
+
#
|
201
|
+
# * +row_key+ - String. The row key
|
202
|
+
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
203
|
+
#
|
204
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179433
|
205
|
+
public
|
206
|
+
def insert(row_key, entity_values)
|
207
|
+
check_entity_key(row_key)
|
208
|
+
|
209
|
+
body = Azure::Table::Serialization.hash_to_entry_xml({
|
210
|
+
"PartitionKey" => partition,
|
211
|
+
"RowKey" => row_key
|
212
|
+
}.merge(entity_values) ).to_xml
|
213
|
+
|
214
|
+
add_operation(:post, @table_service.entities_uri(table), body)
|
215
|
+
self
|
216
|
+
end
|
217
|
+
|
218
|
+
# Public: Updates an existing entity in a table. The Update Entity operation replaces
|
219
|
+
# the entire entity and can be used to remove properties.
|
220
|
+
#
|
221
|
+
# ==== Attributes
|
222
|
+
#
|
223
|
+
# * +row_key+ - String. The row key
|
224
|
+
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
225
|
+
# * +options+ - Hash. Optional parameters.
|
226
|
+
#
|
227
|
+
# ==== Options
|
228
|
+
#
|
229
|
+
# Accepted key/value pairs in options parameter are:
|
230
|
+
# * :if_match - String. A matching condition which is required for update (optional, Default="*")
|
231
|
+
# * :create_if_not_exists - Boolean. If true, and partition_key and row_key do not reference and existing entity,
|
232
|
+
# that entity will be inserted. If false, the operation will fail. (optional, Default=false)
|
233
|
+
#
|
234
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179427
|
235
|
+
public
|
236
|
+
def update(row_key, entity_values, options={})
|
237
|
+
check_entity_key(row_key)
|
238
|
+
|
239
|
+
uri = @table_service.entities_uri(table, partition, row_key)
|
240
|
+
|
241
|
+
headers = {}
|
242
|
+
headers["If-Match"] = options[:if_match] || "*" unless options[:create_if_not_exists]
|
243
|
+
|
244
|
+
body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
|
245
|
+
|
246
|
+
add_operation(:put, uri, body, headers)
|
247
|
+
self
|
248
|
+
end
|
249
|
+
|
250
|
+
# Public: Updates an existing entity by updating the entity's properties. This operation
|
251
|
+
# does not replace the existing entity, as the update_entity operation does.
|
252
|
+
#
|
253
|
+
# ==== Attributes
|
254
|
+
#
|
255
|
+
# * +row_key+ - String. The row key
|
256
|
+
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
257
|
+
# * +options+ - Hash. Optional parameters.
|
258
|
+
#
|
259
|
+
# ==== Options
|
260
|
+
#
|
261
|
+
# Accepted key/value pairs in options parameter are:
|
262
|
+
# * +if_match+ - String. A matching condition which is required for update (optional, Default="*")
|
263
|
+
# * +create_if_not_exists+ - Boolean. If true, and partition_key and row_key do not reference and existing entity,
|
264
|
+
# that entity will be inserted. If false, the operation will fail. (optional, Default=false)
|
265
|
+
#
|
266
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd179392
|
267
|
+
public
|
268
|
+
def merge(row_key, entity_values, options={})
|
269
|
+
check_entity_key(row_key)
|
270
|
+
|
271
|
+
uri = @table_service.entities_uri(table, partition, row_key)
|
272
|
+
|
273
|
+
headers = {}
|
274
|
+
headers["If-Match"] = options[:if_match] || "*" unless options[:create_if_not_exists]
|
275
|
+
|
276
|
+
body = Azure::Table::Serialization.hash_to_entry_xml(entity_values).to_xml
|
277
|
+
|
278
|
+
add_operation(:merge, uri, body, headers)
|
279
|
+
self
|
280
|
+
end
|
281
|
+
|
282
|
+
# Public: Inserts or updates an existing entity within a table by merging new property values into the entity.
|
283
|
+
#
|
284
|
+
# ==== Attributes
|
285
|
+
#
|
286
|
+
# * +row_key+ - String. The row key
|
287
|
+
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
288
|
+
#
|
289
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh452241
|
290
|
+
public
|
291
|
+
def insert_or_merge(row_key, entity_values)
|
292
|
+
merge(row_key, entity_values, { :create_if_not_exists => true })
|
293
|
+
self
|
294
|
+
end
|
295
|
+
|
296
|
+
# Public: Inserts or updates a new entity into a table.
|
297
|
+
#
|
298
|
+
# ==== Attributes
|
299
|
+
#
|
300
|
+
# * +row_key+ - String. The row key
|
301
|
+
# * +entity_values+ - Hash. A hash of the name/value pairs for the entity.
|
302
|
+
#
|
303
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh452242
|
304
|
+
public
|
305
|
+
def insert_or_replace(row_key, entity_values)
|
306
|
+
update(row_key, entity_values, { :create_if_not_exists => true })
|
307
|
+
self
|
308
|
+
end
|
309
|
+
|
310
|
+
# Public: Deletes an existing entity in the table.
|
311
|
+
#
|
312
|
+
# ==== Attributes
|
313
|
+
#
|
314
|
+
# * +row_key+ - String. The row key
|
315
|
+
# * +options+ - Hash. Optional parameters.
|
316
|
+
#
|
317
|
+
# ==== Options
|
318
|
+
#
|
319
|
+
# Accepted key/value pairs in options parameter are:
|
320
|
+
# * +if_match+ - String. A matching condition which is required for update (optional, Default="*")
|
321
|
+
#
|
322
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/dd135727
|
323
|
+
public
|
324
|
+
def delete(row_key, options={})
|
325
|
+
add_operation(:delete, @table_service.entities_uri(table, partition, row_key), nil, {"If-Match"=> options[:if_match] || "*"})
|
326
|
+
self
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
330
|
end
|