azure-plus 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +11 -0
- data/ChangeLog.txt +40 -0
- data/Gemfile +16 -0
- data/README.md +590 -0
- data/Rakefile +129 -0
- data/azure.gemspec +47 -0
- data/lib/azure.rb +52 -0
- data/lib/azure/base_management/affinity_group.rb +32 -0
- data/lib/azure/base_management/base_management_service.rb +238 -0
- data/lib/azure/base_management/location.rb +27 -0
- data/lib/azure/base_management/management_http_request.rb +244 -0
- data/lib/azure/base_management/serialization.rb +129 -0
- data/lib/azure/base_management/sql_management_http_request.rb +45 -0
- data/lib/azure/blob/blob.rb +32 -0
- data/lib/azure/blob/blob_service.rb +1424 -0
- data/lib/azure/blob/block.rb +31 -0
- data/lib/azure/blob/container.rb +32 -0
- data/lib/azure/blob/serialization.rb +285 -0
- data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
- data/lib/azure/cloud_service_management/cloud_service_management_service.rb +361 -0
- data/lib/azure/cloud_service_management/configuration_set.rb +28 -0
- data/lib/azure/cloud_service_management/deployment.rb +64 -0
- data/lib/azure/cloud_service_management/input_endpoint.rb +29 -0
- data/lib/azure/cloud_service_management/instance_endpoint.rb +31 -0
- data/lib/azure/cloud_service_management/persistent_vm_downtime.rb +29 -0
- data/lib/azure/cloud_service_management/role.rb +30 -0
- data/lib/azure/cloud_service_management/role_instance.rb +40 -0
- data/lib/azure/cloud_service_management/serialization.rb +329 -0
- data/lib/azure/cloud_service_management/virtual_ip.rb +29 -0
- data/lib/azure/core.rb +39 -0
- data/lib/azure/core/auth/authorizer.rb +36 -0
- data/lib/azure/core/auth/shared_key.rb +110 -0
- data/lib/azure/core/auth/shared_key_lite.rb +48 -0
- data/lib/azure/core/auth/signer.rb +48 -0
- data/lib/azure/core/configuration.rb +211 -0
- data/lib/azure/core/error.rb +22 -0
- data/lib/azure/core/filtered_service.rb +44 -0
- data/lib/azure/core/http/debug_filter.rb +36 -0
- data/lib/azure/core/http/http_error.rb +88 -0
- data/lib/azure/core/http/http_filter.rb +53 -0
- data/lib/azure/core/http/http_request.rb +159 -0
- data/lib/azure/core/http/http_response.rb +140 -0
- data/lib/azure/core/http/retry_policy.rb +74 -0
- data/lib/azure/core/http/signer_filter.rb +34 -0
- data/lib/azure/core/service.rb +63 -0
- data/lib/azure/core/signed_service.rb +43 -0
- data/lib/azure/core/utility.rb +190 -0
- data/lib/azure/queue/message.rb +30 -0
- data/lib/azure/queue/queue.rb +29 -0
- data/lib/azure/queue/queue_service.rb +568 -0
- data/lib/azure/queue/serialization.rb +106 -0
- data/lib/azure/service/access_policy.rb +26 -0
- data/lib/azure/service/enumeration_results.rb +21 -0
- data/lib/azure/service/logging.rb +32 -0
- data/lib/azure/service/metrics.rb +31 -0
- data/lib/azure/service/retention_policy.rb +25 -0
- data/lib/azure/service/serialization.rb +240 -0
- data/lib/azure/service/signed_identifier.rb +30 -0
- data/lib/azure/service/storage_service.rb +79 -0
- data/lib/azure/service/storage_service_properties.rb +32 -0
- data/lib/azure/service_bus/action.rb +21 -0
- data/lib/azure/service_bus/auth/wrap_service.rb +89 -0
- data/lib/azure/service_bus/auth/wrap_signer.rb +69 -0
- data/lib/azure/service_bus/brokered_message.rb +124 -0
- data/lib/azure/service_bus/brokered_message_serializer.rb +159 -0
- data/lib/azure/service_bus/correlation_filter.rb +45 -0
- data/lib/azure/service_bus/empty_rule_action.rb +30 -0
- data/lib/azure/service_bus/false_filter.rb +38 -0
- data/lib/azure/service_bus/filter.rb +21 -0
- data/lib/azure/service_bus/interval.rb +104 -0
- data/lib/azure/service_bus/queue.rb +230 -0
- data/lib/azure/service_bus/resource.rb +109 -0
- data/lib/azure/service_bus/rule.rb +98 -0
- data/lib/azure/service_bus/rule_aspect.rb +34 -0
- data/lib/azure/service_bus/serialization.rb +160 -0
- data/lib/azure/service_bus/service_bus_service.rb +829 -0
- data/lib/azure/service_bus/sql_filter.rb +50 -0
- data/lib/azure/service_bus/sql_rule_action.rb +50 -0
- data/lib/azure/service_bus/subscription.rb +184 -0
- data/lib/azure/service_bus/topic.rb +187 -0
- data/lib/azure/service_bus/true_filter.rb +38 -0
- data/lib/azure/sql_database_management/serialization.rb +111 -0
- data/lib/azure/sql_database_management/sql_database.rb +31 -0
- data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -0
- data/lib/azure/storage_management/serialization.rb +184 -0
- data/lib/azure/storage_management/storage_account.rb +40 -0
- data/lib/azure/storage_management/storage_management_service.rb +166 -0
- data/lib/azure/table/auth/shared_key.rb +92 -0
- data/lib/azure/table/auth/shared_key_lite.rb +44 -0
- data/lib/azure/table/batch.rb +330 -0
- data/lib/azure/table/batch_response.rb +118 -0
- data/lib/azure/table/edmtype.rb +127 -0
- data/lib/azure/table/entity.rb +31 -0
- data/lib/azure/table/guid.rb +24 -0
- data/lib/azure/table/query.rb +112 -0
- data/lib/azure/table/serialization.rb +108 -0
- data/lib/azure/table/table_service.rb +560 -0
- data/lib/azure/version.rb +31 -0
- data/lib/azure/virtual_machine_image_management/serialization.rb +51 -0
- data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -0
- data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -0
- data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +66 -0
- data/lib/azure/virtual_machine_management/serialization.rb +436 -0
- data/lib/azure/virtual_machine_management/virtual_machine.rb +42 -0
- data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +549 -0
- data/lib/azure/virtual_network_management/serialization.rb +186 -0
- data/lib/azure/virtual_network_management/virtual_network.rb +36 -0
- data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -0
- data/test/fixtures/32px-fulls-black.jpg +0 -0
- data/test/fixtures/affinity_group.xml +33 -0
- data/test/fixtures/all_containers.xml +20 -0
- data/test/fixtures/all_tables.xml +22 -0
- data/test/fixtures/certificate.pem +21 -0
- data/test/fixtures/container_acl.xml +11 -0
- data/test/fixtures/create_sql_database_server.xml +2 -0
- data/test/fixtures/create_storage_desc_error.xml +5 -0
- data/test/fixtures/create_storage_extendedprop_error.xml +8 -0
- data/test/fixtures/create_storage_extendedpropname_error.xml +6 -0
- data/test/fixtures/create_storage_full_error.xml +6 -0
- data/test/fixtures/create_storage_label_error.xml +5 -0
- data/test/fixtures/create_storage_location_error.xml +5 -0
- data/test/fixtures/create_storage_name_error.xml +6 -0
- data/test/fixtures/create_table_response_entry.xml +15 -0
- data/test/fixtures/delete_storage_container_error.xml +5 -0
- data/test/fixtures/delete_storage_error.xml +5 -0
- data/test/fixtures/deployment_error.xml +5 -0
- data/test/fixtures/empty_xml_file +0 -0
- data/test/fixtures/get_deployment.xml +94 -0
- data/test/fixtures/get_deployment_existing.xml +94 -0
- data/test/fixtures/get_deployment_missing.xml +5 -0
- data/test/fixtures/get_storage_account_error.xml +5 -0
- data/test/fixtures/get_storage_account_properties.xml +32 -0
- data/test/fixtures/get_storage_account_properties_new.xml +32 -0
- data/test/fixtures/http_error.xml +5 -0
- data/test/fixtures/insert_entity_response_entry.xml +25 -0
- data/test/fixtures/list_affinity_groups.xml +22 -0
- data/test/fixtures/list_blobs.xml +121 -0
- data/test/fixtures/list_block_all_with_none_committed.xml +22 -0
- data/test/fixtures/list_blocks_all.xml +23 -0
- data/test/fixtures/list_blocks_committed.xml +13 -0
- data/test/fixtures/list_cloud_services.xml +39 -0
- data/test/fixtures/list_containers.xml +38 -0
- data/test/fixtures/list_firewall_management_endpoint.xml +27 -0
- data/test/fixtures/list_images.xml +110 -0
- data/test/fixtures/list_locations.xml +62 -0
- data/test/fixtures/list_page_ranges.xml +11 -0
- data/test/fixtures/list_sql_database.xml +36 -0
- data/test/fixtures/list_sql_server_firewall.xml +23 -0
- data/test/fixtures/list_storage_account_single.xml +25 -0
- data/test/fixtures/list_storage_accounts.xml +46 -0
- data/test/fixtures/list_virtual_networks.xml +92 -0
- data/test/fixtures/logging.xml +11 -0
- data/test/fixtures/management_certificate.pem +55 -0
- data/test/fixtures/messages.xml +12 -0
- data/test/fixtures/metrics.xml +10 -0
- data/test/fixtures/privatekey.key +28 -0
- data/test/fixtures/query_entities_empty_response.xml +7 -0
- data/test/fixtures/query_entities_response.xml +45 -0
- data/test/fixtures/queue_service_properties.xml +22 -0
- data/test/fixtures/queue_service_properties_original.xml +19 -0
- data/test/fixtures/queues.xml +16 -0
- data/test/fixtures/retention_policy.xml +5 -0
- data/test/fixtures/sb_default_create_queue_response.xml +23 -0
- data/test/fixtures/sb_default_create_topic_response.xml +18 -0
- data/test/fixtures/sb_get_access_token_response.txt +1 -0
- data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -0
- data/test/fixtures/storage_service_properties.xml +23 -0
- data/test/fixtures/update_storage_account.xml +16 -0
- data/test/fixtures/update_storage_error.xml +5 -0
- data/test/fixtures/updated_storage_accounts.xml +53 -0
- data/test/fixtures/virtual_machine.xml +113 -0
- data/test/fixtures/windows_virtual_machine.xml +106 -0
- data/test/integration/affinity_group/Affinity_test.rb +55 -0
- data/test/integration/affinity_group/Create_Affinity_test.rb +63 -0
- data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -0
- data/test/integration/affinity_group/List_Affinity_test.rb +41 -0
- data/test/integration/affinity_group/Update_Affinity_test.rb +82 -0
- data/test/integration/blob/blob_gb18030_test.rb +199 -0
- data/test/integration/blob/blob_metadata_test.rb +75 -0
- data/test/integration/blob/blob_pages_test.rb +119 -0
- data/test/integration/blob/blob_properties_test.rb +77 -0
- data/test/integration/blob/block_blob_test.rb +254 -0
- data/test/integration/blob/container/container_acl_test.rb +69 -0
- data/test/integration/blob/container/container_metadata_test.rb +50 -0
- data/test/integration/blob/container/create_container_test.rb +60 -0
- data/test/integration/blob/container/delete_container_test.rb +39 -0
- data/test/integration/blob/container/get_container_properties_test.rb +48 -0
- data/test/integration/blob/container/list_containers_test.rb +79 -0
- data/test/integration/blob/container/root_container_test.rb +54 -0
- data/test/integration/blob/copy_blob_test.rb +113 -0
- data/test/integration/blob/create_blob_snapshot_test.rb +80 -0
- data/test/integration/blob/create_page_blob_test.rb +83 -0
- data/test/integration/blob/delete_blob_test.rb +159 -0
- data/test/integration/blob/get_blob_test.rb +65 -0
- data/test/integration/blob/informative_errors_test.rb +39 -0
- data/test/integration/blob/lease/acquire_lease_test.rb +36 -0
- data/test/integration/blob/lease/break_lease_test.rb +40 -0
- data/test/integration/blob/lease/release_lease_test.rb +40 -0
- data/test/integration/blob/lease/renew_lease_test.rb +42 -0
- data/test/integration/blob/list_blobs_test.rb +113 -0
- data/test/integration/cloud_service/Cloud_Create_test.rb +44 -0
- data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -0
- data/test/integration/database/create_sql_server_firewall_test.rb +86 -0
- data/test/integration/database/create_sql_server_test.rb +53 -0
- data/test/integration/database/delete_sql_server_firewall_test.rb +70 -0
- data/test/integration/database/delete_sql_server_test.rb +58 -0
- data/test/integration/database/list_sql_server_firewall_test.rb +45 -0
- data/test/integration/database/list_sql_servers_test.rb +44 -0
- data/test/integration/database/reset_password_sql_server_test.rb +55 -0
- data/test/integration/location/Location_List_test.rb +39 -0
- data/test/integration/queue/clear_messages_test.rb +42 -0
- data/test/integration/queue/create_message_test.rb +75 -0
- data/test/integration/queue/create_queue_test.rb +50 -0
- data/test/integration/queue/delete_message_test.rb +67 -0
- data/test/integration/queue/delete_queue_test.rb +45 -0
- data/test/integration/queue/informative_errors_test.rb +42 -0
- data/test/integration/queue/list_messages_encoded_test.rb +79 -0
- data/test/integration/queue/list_messages_test.rb +79 -0
- data/test/integration/queue/list_queues_test.rb +44 -0
- data/test/integration/queue/peek_messages_test.rb +59 -0
- data/test/integration/queue/queue_gb18030_test.rb +131 -0
- data/test/integration/queue/queue_metadata_test.rb +40 -0
- data/test/integration/queue/update_message_test.rb +74 -0
- data/test/integration/service_bus/informative_errors_test.rb +37 -0
- data/test/integration/service_bus/queues_scenario_test.rb +200 -0
- data/test/integration/service_bus/queues_test.rb +266 -0
- data/test/integration/service_bus/rules_test.rb +145 -0
- data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -0
- data/test/integration/service_bus/scenario_test.rb +101 -0
- data/test/integration/service_bus/subscriptions_test.rb +211 -0
- data/test/integration/service_bus/topics_scenario_test.rb +406 -0
- data/test/integration/service_bus/topics_test.rb +129 -0
- data/test/integration/storage_management/storage_management_test.rb +160 -0
- data/test/integration/table/create_table_test.rb +36 -0
- data/test/integration/table/delete_entity_batch_test.rb +107 -0
- data/test/integration/table/delete_entity_test.rb +94 -0
- data/test/integration/table/delete_table_test.rb +40 -0
- data/test/integration/table/get_table_test.rb +37 -0
- data/test/integration/table/informative_errors_test.rb +39 -0
- data/test/integration/table/insert_entity_batch_test.rb +100 -0
- data/test/integration/table/insert_entity_test.rb +88 -0
- data/test/integration/table/insert_or_merge_entity_batch_test.rb +159 -0
- data/test/integration/table/insert_or_merge_entity_test.rb +143 -0
- data/test/integration/table/insert_or_replace_entity_batch_test.rb +152 -0
- data/test/integration/table/insert_or_replace_entity_test.rb +137 -0
- data/test/integration/table/merge_entity_batch_test.rb +128 -0
- data/test/integration/table/merge_entity_test.rb +113 -0
- data/test/integration/table/query_entities_test.rb +195 -0
- data/test/integration/table/query_tables_test.rb +43 -0
- data/test/integration/table/query_test.rb +251 -0
- data/test/integration/table/table_acl_test.rb +52 -0
- data/test/integration/table/table_gb18030_test.rb +355 -0
- data/test/integration/table/update_entity_batch_test.rb +149 -0
- data/test/integration/table/update_entity_test.rb +131 -0
- data/test/integration/test_helper.rb +42 -0
- data/test/integration/vm/VM_Create_test.rb +260 -0
- data/test/integration/vm/VM_Delete_test.rb +55 -0
- data/test/integration/vm/VM_Operations_test.rb +173 -0
- data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -0
- data/test/integration/vm_image/virtual_machine_image_test.rb +37 -0
- data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -0
- data/test/integration/vnet/Virtual_Network_list_test.rb +53 -0
- data/test/support/env.rb +19 -0
- data/test/support/fixtures.rb +36 -0
- data/test/support/name_generator.rb +160 -0
- data/test/support/stubs.rb +42 -0
- data/test/support/virtual_machine_name_generator.rb +102 -0
- data/test/support/virtual_network_helper.rb +73 -0
- data/test/test_helper.rb +53 -0
- data/test/unit/affinity_group/affinity_group_test.rb +192 -0
- data/test/unit/affinity_group/serialization_test.rb +88 -0
- data/test/unit/base_management/location_test.rb +57 -0
- data/test/unit/blob/blob_service_test.rb +1947 -0
- data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +276 -0
- data/test/unit/cloud_service_management/serialization_test.rb +169 -0
- data/test/unit/core/auth/shared_key_lite_test.rb +51 -0
- data/test/unit/core/auth/shared_key_test.rb +58 -0
- data/test/unit/core/auth/signer_test.rb +30 -0
- data/test/unit/core/http/http_error_test.rb +57 -0
- data/test/unit/core/http/http_request_test.rb +66 -0
- data/test/unit/core/http/http_response_test.rb +45 -0
- data/test/unit/core/http/retry_policy_test.rb +23 -0
- data/test/unit/database/serialization_test.rb +97 -0
- data/test/unit/database/sql_database_server_service_test.rb +288 -0
- data/test/unit/service/serialization_test.rb +502 -0
- data/test/unit/service/storage_service_test.rb +291 -0
- data/test/unit/storage_management/serialization_test.rb +232 -0
- data/test/unit/storage_management/storage_management_service_test.rb +261 -0
- data/test/unit/table/edmtype_test.rb +108 -0
- data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -0
- data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -0
- data/test/unit/virtual_machine_management/serialization_test.rb +247 -0
- data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -0
- data/test/unit/vnet/serialization_test.rb +187 -0
- data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
- metadata +470 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
module Azure
|
|
16
|
+
module StorageManagement
|
|
17
|
+
# Represents a Windows Azure storage account
|
|
18
|
+
class StorageAccount
|
|
19
|
+
def initialize
|
|
20
|
+
yield self if block_given?
|
|
21
|
+
end
|
|
22
|
+
attr_accessor :url
|
|
23
|
+
attr_accessor :name
|
|
24
|
+
attr_accessor :description
|
|
25
|
+
attr_accessor :location
|
|
26
|
+
attr_accessor :affinity_group
|
|
27
|
+
attr_accessor :label
|
|
28
|
+
attr_accessor :status
|
|
29
|
+
attr_accessor :endpoints
|
|
30
|
+
attr_accessor :geo_replication_enabled
|
|
31
|
+
attr_accessor :geo_primary_region
|
|
32
|
+
attr_accessor :status_of_primary
|
|
33
|
+
attr_accessor :last_geo_failover_time
|
|
34
|
+
attr_accessor :geo_secondary_region
|
|
35
|
+
attr_accessor :status_of_secondary
|
|
36
|
+
attr_accessor :creation_time
|
|
37
|
+
attr_accessor :extended_properties
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
require 'azure/storage_management/serialization'
|
|
16
|
+
|
|
17
|
+
module Azure
|
|
18
|
+
module StorageManagement
|
|
19
|
+
# Provides Storage Management API
|
|
20
|
+
class StorageManagementService < BaseManagementService
|
|
21
|
+
def initialize
|
|
22
|
+
super()
|
|
23
|
+
end
|
|
24
|
+
# Public: Gets a list of storage accounts available under the
|
|
25
|
+
# current subscription.
|
|
26
|
+
#
|
|
27
|
+
# Returns an array of Azure::StorageManagement::StorageAccount objects
|
|
28
|
+
def list_storage_accounts
|
|
29
|
+
request_path = '/services/storageservices'
|
|
30
|
+
request = ManagementHttpRequest.new(:get, request_path, nil)
|
|
31
|
+
response = request.call
|
|
32
|
+
Serialization.storage_services_from_xml(response)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Public: Checks to see if the specified storage account is available
|
|
36
|
+
#
|
|
37
|
+
# ==== Attributes
|
|
38
|
+
#
|
|
39
|
+
# * +name+ - String. Storage account name.
|
|
40
|
+
#
|
|
41
|
+
# Returns: A boolean value indicating whether the storage account exists.
|
|
42
|
+
# If true, the storage account exists. If false, the storage account
|
|
43
|
+
# does not exist.
|
|
44
|
+
def get_storage_account(name)
|
|
45
|
+
return false if name.nil?
|
|
46
|
+
flag = false
|
|
47
|
+
storage_accounts = list_storage_accounts
|
|
48
|
+
storage_accounts.each do |storage|
|
|
49
|
+
if storage.name == name
|
|
50
|
+
flag = true
|
|
51
|
+
break
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
flag
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Public: Gets the properties of the storage account specified.
|
|
58
|
+
#
|
|
59
|
+
# ==== Attributes
|
|
60
|
+
#
|
|
61
|
+
# * +name+ - String. The name of the storage account. Required.
|
|
62
|
+
#
|
|
63
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460802.aspx
|
|
64
|
+
#
|
|
65
|
+
# Returns the storage account
|
|
66
|
+
def get_storage_account_properties(name)
|
|
67
|
+
request_path = "/services/storageservices/#{name}"
|
|
68
|
+
request = ManagementHttpRequest.new(:get, request_path, nil)
|
|
69
|
+
response = request.call
|
|
70
|
+
Serialization.storage_services_from_xml(response).first
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Public: Create a new storage account in Windows Azure.
|
|
74
|
+
#
|
|
75
|
+
# ==== Attributes
|
|
76
|
+
#
|
|
77
|
+
# * +name+ - String. The name of the storage service.
|
|
78
|
+
# * +options+ - Hash. Optional parameters.
|
|
79
|
+
#
|
|
80
|
+
# ==== Options
|
|
81
|
+
#
|
|
82
|
+
# Accepted key/value pairs in options parameter are:
|
|
83
|
+
# * +:label+ - String. The label for this storage account. The name will
|
|
84
|
+
# be used as label if none specified. (optional)
|
|
85
|
+
# * +:location+ - String. The location where the storage
|
|
86
|
+
# service will be created. Reqruied if no affinity_group_name specified.
|
|
87
|
+
# * +:description+ - String. A description for the storage
|
|
88
|
+
# service. (optional)
|
|
89
|
+
# * +:affinity_group_name+ - String. The name of an existing affinity group
|
|
90
|
+
# in the specified subscription. Required if no location specified.
|
|
91
|
+
# * +:geo_replication_enabled+ - String. A flag indicating wheter to
|
|
92
|
+
# turn Geo replication on or off. Values other than 'true'/'false'
|
|
93
|
+
# will result in an error from the REST API. (optional)
|
|
94
|
+
# * +:extended_properties+ - Hash. Key/Value pairs of extended
|
|
95
|
+
# properties to add to the storage account. The key is used as the
|
|
96
|
+
# property name and the value as its value. (optional)
|
|
97
|
+
#
|
|
98
|
+
# Returns None
|
|
99
|
+
def create_storage_account(name, options = {})
|
|
100
|
+
raise 'Name not specified' if !name || name.class != String || name.empty?
|
|
101
|
+
if get_storage_account(name)
|
|
102
|
+
Loggerx.warn "Storage Account #{name} already exists. Skipped..."
|
|
103
|
+
else
|
|
104
|
+
Loggerx.info "Creating Storage Account #{name}."
|
|
105
|
+
body = Serialization.storage_services_to_xml(name, options)
|
|
106
|
+
request_path = '/services/storageservices'
|
|
107
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
108
|
+
request.call
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Public: Updates an existing storage account in Windows Azure
|
|
113
|
+
#
|
|
114
|
+
# ==== Attributes
|
|
115
|
+
#
|
|
116
|
+
# * +name+ - String. The name of the storage service.
|
|
117
|
+
# * +options+ - Hash. Optional parameters.
|
|
118
|
+
#
|
|
119
|
+
# ==== Options
|
|
120
|
+
#
|
|
121
|
+
# Accepted key/value pairs in options parameter are:
|
|
122
|
+
# * +:label+ - String. A label for the storage service. Required if no
|
|
123
|
+
# description is provided. If both label and description are
|
|
124
|
+
# provided, only the label will get updated.
|
|
125
|
+
# * +:description+ - String. A description for the storage service.
|
|
126
|
+
# Required if no label is provided. If both label and description are
|
|
127
|
+
# provided, only the label will get updated.
|
|
128
|
+
# * +:geo_replication_enabled+ - Boolean (TrueClass/FalseClass). Boolean
|
|
129
|
+
# flag indicating wheter to turn Geo replication on or off. (optional)
|
|
130
|
+
# * +:extended_properties+ - Hash. Key/Value pairs of extended
|
|
131
|
+
# properties to add to the storage account. The key is used as the
|
|
132
|
+
# property name and the value as its value. (optional)
|
|
133
|
+
#
|
|
134
|
+
# Returns None
|
|
135
|
+
# Fails with RuntimeError if invalid options specified
|
|
136
|
+
def update_storage_account(name, options = {})
|
|
137
|
+
if get_storage_account name
|
|
138
|
+
Loggerx.info "Account '#{name}' exists, updating..."
|
|
139
|
+
body = Serialization.storage_update_to_xml options
|
|
140
|
+
request_path = "/services/storageservices/#{name}"
|
|
141
|
+
request = ManagementHttpRequest.new(:put, request_path, body)
|
|
142
|
+
request.call
|
|
143
|
+
else
|
|
144
|
+
Loggerx.warn "Storage Account '#{name}' does not exist. Skipped..."
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Public: Deletes the specified storage account of given subscription id
|
|
149
|
+
# from Windows Azure.
|
|
150
|
+
#
|
|
151
|
+
# ==== Attributes
|
|
152
|
+
#
|
|
153
|
+
# * +name+ - String. Storage account name.
|
|
154
|
+
#
|
|
155
|
+
# Returns: None
|
|
156
|
+
def delete_storage_account(name)
|
|
157
|
+
Loggerx.info "Deleting Storage Account #{name}."
|
|
158
|
+
request_path = "/services/storageservices/#{name}"
|
|
159
|
+
request = ManagementHttpRequest.new(:delete, request_path)
|
|
160
|
+
request.call
|
|
161
|
+
rescue Exception => e
|
|
162
|
+
e.message
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
@@ -0,0 +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
|
|
@@ -0,0 +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
|
|
@@ -0,0 +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
|
|
330
|
+
end
|