azure-fix 0.7.0.pre3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.env_sample +13 -0
- data/.gitignore +30 -0
- data/.travis.yml +13 -0
- data/ChangeLog.txt +56 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +202 -0
- data/README.md +702 -0
- data/Rakefile +121 -0
- data/azure.gemspec +51 -0
- data/bin/pfxer +35 -0
- data/lib/azure.rb +147 -0
- data/lib/azure/base_management/affinity_group.rb +32 -0
- data/lib/azure/base_management/base_management_service.rb +220 -0
- data/lib/azure/base_management/location.rb +27 -0
- data/lib/azure/base_management/management_http_request.rb +172 -0
- data/lib/azure/base_management/serialization.rb +135 -0
- data/lib/azure/base_management/sql_management_http_request.rb +35 -0
- data/lib/azure/blob/auth/shared_access_signature.rb +147 -0
- data/lib/azure/blob/blob.rb +32 -0
- data/lib/azure/blob/blob_service.rb +1452 -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/client.rb +31 -0
- data/lib/azure/client_services.rb +98 -0
- data/lib/azure/cloud_service_management/cloud_service.rb +38 -0
- data/lib/azure/cloud_service_management/cloud_service_management_service.rb +135 -0
- data/lib/azure/cloud_service_management/serialization.rb +118 -0
- data/lib/azure/configurable.rb +290 -0
- data/lib/azure/core/auth/authorizer.rb +36 -0
- data/lib/azure/core/auth/shared_key.rb +118 -0
- data/lib/azure/core/auth/shared_key_lite.rb +48 -0
- data/lib/azure/core/auth/signer.rb +51 -0
- data/lib/azure/core/error.rb +21 -0
- data/lib/azure/core/filtered_service.rb +45 -0
- data/lib/azure/core/http/debug_filter.rb +36 -0
- data/lib/azure/core/http/http_error.rb +86 -0
- data/lib/azure/core/http/http_filter.rb +53 -0
- data/lib/azure/core/http/http_request.rb +173 -0
- data/lib/azure/core/http/http_response.rb +96 -0
- data/lib/azure/core/http/retry_policy.rb +74 -0
- data/lib/azure/core/http/signer_filter.rb +33 -0
- data/lib/azure/core/service.rb +46 -0
- data/lib/azure/core/signed_service.rb +45 -0
- data/lib/azure/core/utility.rb +244 -0
- data/lib/azure/default.rb +126 -0
- data/lib/azure/http_client.rb +85 -0
- data/lib/azure/queue/message.rb +30 -0
- data/lib/azure/queue/queue.rb +28 -0
- data/lib/azure/queue/queue_service.rb +570 -0
- data/lib/azure/queue/serialization.rb +105 -0
- data/lib/azure/service/access_policy.rb +26 -0
- data/lib/azure/service/cors.rb +11 -0
- data/lib/azure/service/cors_rule.rb +15 -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 +299 -0
- data/lib/azure/service/signed_identifier.rb +30 -0
- data/lib/azure/service/storage_service.rb +86 -0
- data/lib/azure/service/storage_service_properties.rb +37 -0
- data/lib/azure/service_bus/action.rb +21 -0
- data/lib/azure/service_bus/auth/shared_access_signer.rb +44 -0
- data/lib/azure/service_bus/auth/wrap_service.rb +90 -0
- data/lib/azure/service_bus/auth/wrap_signer.rb +77 -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/relay.rb +88 -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 +161 -0
- data/lib/azure/service_bus/service_bus_service.rb +899 -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/errors.rb +11 -0
- data/lib/azure/sql_database_management/firewall_rule.rb +30 -0
- data/lib/azure/sql_database_management/serialization.rb +99 -0
- data/lib/azure/sql_database_management/sql_database_management_service.rb +211 -0
- data/lib/azure/sql_database_management/sql_server.rb +32 -0
- data/lib/azure/storage_management/serialization.rb +204 -0
- data/lib/azure/storage_management/storage_account.rb +48 -0
- data/lib/azure/storage_management/storage_management_service.rb +207 -0
- data/lib/azure/table/auth/shared_key.rb +59 -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 +563 -0
- data/lib/azure/version.rb +31 -0
- data/lib/azure/virtual_machine_image_management/serialization.rb +70 -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 +83 -0
- data/lib/azure/virtual_machine_management/serialization.rb +459 -0
- data/lib/azure/virtual_machine_management/virtual_machine.rb +44 -0
- data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +552 -0
- data/lib/azure/virtual_network_management/serialization.rb +193 -0
- data/lib/azure/virtual_network_management/virtual_network.rb +37 -0
- data/lib/azure/virtual_network_management/virtual_network_management_service.rb +108 -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/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_storage_account_error.xml +5 -0
- data/test/fixtures/get_storage_account_properties.xml +34 -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_locations.xml +212 -0
- data/test/fixtures/list_os_images.xml +110 -0
- data/test/fixtures/list_page_ranges.xml +11 -0
- data/test/fixtures/list_sql_database.xml +24 -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 +48 -0
- data/test/fixtures/list_virtual_networks.xml +92 -0
- data/test/fixtures/list_vm_images.xml +21 -0
- data/test/fixtures/logging.xml +11 -0
- data/test/fixtures/management_certificate.pfx +0 -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_relay_response.xml +15 -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_keys.xml +8 -0
- data/test/fixtures/storage_service_properties.xml +55 -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 +55 -0
- data/test/fixtures/virtual_machine.xml +116 -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 +64 -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 +87 -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 +55 -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 +45 -0
- data/test/integration/cloud_service/Cloud_Delete_test.rb +45 -0
- data/test/integration/database/create_sql_server_firewall_test.rb +81 -0
- data/test/integration/database/create_sql_server_test.rb +53 -0
- data/test/integration/database/delete_sql_server_firewall_test.rb +64 -0
- data/test/integration/database/delete_sql_server_test.rb +45 -0
- data/test/integration/database/list_sql_server_firewall_test.rb +44 -0
- data/test/integration/database/list_sql_servers_test.rb +44 -0
- data/test/integration/database/reset_password_sql_server_test.rb +53 -0
- data/test/integration/location/Location_List_test.rb +39 -0
- data/test/integration/location/RoleSize_List_test.rb +35 -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 +43 -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/relay_test.rb +132 -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 +185 -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 +196 -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 +40 -0
- data/test/integration/vm/VM_Create_test.rb +262 -0
- data/test/integration/vm/VM_Delete_test.rb +53 -0
- data/test/integration/vm/VM_Operations_test.rb +172 -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 +116 -0
- data/test/integration/vnet/Virtual_Network_list_test.rb +48 -0
- data/test/support/env.rb +19 -0
- data/test/support/fixtures.rb +36 -0
- data/test/support/name_generator.rb +168 -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 +47 -0
- data/test/unit/affinity_group/affinity_group_test.rb +189 -0
- data/test/unit/affinity_group/serialization_test.rb +87 -0
- data/test/unit/base_management/base_management_service_test.rb +19 -0
- data/test/unit/base_management/location_test.rb +56 -0
- data/test/unit/base_management/role_size_test.rb +50 -0
- data/test/unit/blob/auth/shared_access_signature_test.rb +71 -0
- data/test/unit/blob/blob_service_test.rb +1970 -0
- data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -0
- data/test/unit/cloud_service_management/serialization_test.rb +169 -0
- data/test/unit/config/azure_test.rb +112 -0
- data/test/unit/config/client_test.rb +37 -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 +61 -0
- data/test/unit/core/http/http_request_test.rb +138 -0
- data/test/unit/core/http/http_response_test.rb +20 -0
- data/test/unit/core/http/retry_policy_test.rb +23 -0
- data/test/unit/core/utility_test.rb +122 -0
- data/test/unit/database/serialization_test.rb +94 -0
- data/test/unit/database/sql_database_server_service_test.rb +341 -0
- data/test/unit/http_client_test.rb +74 -0
- data/test/unit/service/serialization_test.rb +533 -0
- data/test/unit/service/storage_service_test.rb +297 -0
- data/test/unit/storage_management/serialization_test.rb +244 -0
- data/test/unit/storage_management/storage_management_service_test.rb +247 -0
- data/test/unit/table/edmtype_test.rb +108 -0
- data/test/unit/virtual_machine_image_management/serialization_test.rb +50 -0
- data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +114 -0
- data/test/unit/virtual_machine_management/serialization_test.rb +316 -0
- data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +480 -0
- data/test/unit/vnet/serialization_test.rb +187 -0
- data/test/unit/vnet/virtual_network_management_service_test.rb +131 -0
- metadata +579 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
require 'azure/service_bus/sql_filter'
|
|
16
|
+
|
|
17
|
+
module Azure
|
|
18
|
+
module ServiceBus
|
|
19
|
+
class TrueFilter < SqlFilter
|
|
20
|
+
# Public: Initialize the SQL True Filter.
|
|
21
|
+
#
|
|
22
|
+
# ==== Attributes
|
|
23
|
+
#
|
|
24
|
+
# * +hash+ - The resource options Hash
|
|
25
|
+
#
|
|
26
|
+
# ==== Options
|
|
27
|
+
#
|
|
28
|
+
# Accepted key/value pairs in options parameter are:
|
|
29
|
+
# * +:sql_expression+ - The SQL expression.
|
|
30
|
+
#
|
|
31
|
+
def initialize(hash=nil)
|
|
32
|
+
hash = {} unless hash
|
|
33
|
+
hash[:sql_expression] = "1 = 1" unless hash[:sql_expression]
|
|
34
|
+
super(hash)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
|
|
2
|
+
module Azure
|
|
3
|
+
module SqlDatabaseManagement
|
|
4
|
+
# Generic error for SQL Management activities
|
|
5
|
+
class Error < Azure::Core::Error;end
|
|
6
|
+
# Server does not exist error for SQL Management activities
|
|
7
|
+
class ServerDoesNotExist < Azure::Core::Error;end
|
|
8
|
+
# Firewall Rule does not exist error for SQL Management activities
|
|
9
|
+
class RuleDoesNotExist < Azure::Core::Error;end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2015 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
module Azure
|
|
16
|
+
module SqlDatabaseManagement
|
|
17
|
+
class FirewallRule
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
yield self if block_given?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_accessor :name
|
|
24
|
+
attr_accessor :type
|
|
25
|
+
attr_accessor :start_ip_address
|
|
26
|
+
attr_accessor :end_ip_address
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
require 'azure/sql_database_management/sql_server'
|
|
16
|
+
require 'azure/sql_database_management/firewall_rule'
|
|
17
|
+
|
|
18
|
+
module Azure
|
|
19
|
+
module SqlDatabaseManagement
|
|
20
|
+
module Serialization
|
|
21
|
+
extend Azure::Core::Utility
|
|
22
|
+
|
|
23
|
+
def self.server_to_xml(login, password, location, version = 12.0)
|
|
24
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
25
|
+
xml.Server('xmlns' => 'http://schemas.microsoft.com/sqlazure/2010/12/') {
|
|
26
|
+
xml.AdministratorLogin login
|
|
27
|
+
xml.AdministratorLoginPassword password
|
|
28
|
+
xml.Location location
|
|
29
|
+
xml.Version version
|
|
30
|
+
}
|
|
31
|
+
end
|
|
32
|
+
builder.doc.to_xml
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.servers_from_xml(wrapper_XML)
|
|
36
|
+
servers_XML = wrapper_XML.css('Servers Server')
|
|
37
|
+
servers_XML.map do |server_xml|
|
|
38
|
+
server = SqlServer.new
|
|
39
|
+
server.name = xml_content(server_xml, 'Name')
|
|
40
|
+
server.administrator_login = xml_content(server_xml, 'AdministratorLogin')
|
|
41
|
+
server.location = xml_content(server_xml, 'Location')
|
|
42
|
+
server.version = xml_content(server_xml, 'Version')
|
|
43
|
+
server.state = xml_content(server_xml, 'State')
|
|
44
|
+
server.fully_qualified_domain_name = xml_content(server_xml, 'FullyQualifiedDomainName')
|
|
45
|
+
server
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def self.server_name_from_xml(response_xml, login, location, version)
|
|
50
|
+
server_name = xml_content(response_xml, 'ServerName')
|
|
51
|
+
SqlServer.new do |db|
|
|
52
|
+
db.name = server_name
|
|
53
|
+
db.location = location
|
|
54
|
+
db.administrator_login = login
|
|
55
|
+
db.version = version
|
|
56
|
+
db.fully_qualified_domain_name = response_xml.css('ServerName').first['FullyQualifiedDomainName']
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.reset_password_to_xml(password)
|
|
61
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
62
|
+
xml.AdministratorLoginPassword(password, {'xmlns' => 'http://schemas.microsoft.com/sqlazure/2010/12/'})
|
|
63
|
+
end
|
|
64
|
+
builder.doc.to_xml
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Serialize a firewall rule to xml
|
|
68
|
+
# @param rule [Azure::SqlDatabaseManagement::FirewallRule] The firewall rule to serialize
|
|
69
|
+
# @return [String] xml document contain the firewall rule
|
|
70
|
+
def self.firewall_rule_to_xml(rule)
|
|
71
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
72
|
+
xml.ServiceResource('xmlns' => 'http://schemas.microsoft.com/windowsazure') {
|
|
73
|
+
xml.Name rule.name
|
|
74
|
+
xml.StartIPAddress rule.start_ip_address
|
|
75
|
+
xml.EndIPAddress rule.end_ip_address
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
builder.doc.to_xml
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Create a list of firewall hashes from xml
|
|
82
|
+
# @param response_xml The xml containing the list of ServiceResources (firewall rules)
|
|
83
|
+
# @return [Array<Azure::SqlDatabaseManagement::FirewallRule>]
|
|
84
|
+
def self.database_firewall_from_xml(response_xml)
|
|
85
|
+
service_resources = response_xml.css(
|
|
86
|
+
'ServiceResources ServiceResource'
|
|
87
|
+
)
|
|
88
|
+
service_resources.map do |resource|
|
|
89
|
+
FirewallRule.new do |rule|
|
|
90
|
+
rule.name = xml_content(resource, 'Name')
|
|
91
|
+
rule.type = xml_content(resource, 'Type')
|
|
92
|
+
rule.start_ip_address = xml_content(resource, 'StartIPAddress')
|
|
93
|
+
rule.end_ip_address = xml_content(resource, 'EndIPAddress')
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
require 'socket'
|
|
17
|
+
require 'azure/sql_database_management/sql_server'
|
|
18
|
+
require 'azure/sql_database_management/firewall_rule'
|
|
19
|
+
require 'azure/sql_database_management/serialization'
|
|
20
|
+
require 'azure/sql_database_management/errors'
|
|
21
|
+
|
|
22
|
+
module Azure
|
|
23
|
+
module SqlDatabaseManagement
|
|
24
|
+
# Service for managing SQL Azure servers and databases
|
|
25
|
+
class SqlDatabaseManagementService < BaseManagement::BaseManagementService
|
|
26
|
+
|
|
27
|
+
# Gets a list of database servers available under the current subscription.
|
|
28
|
+
#
|
|
29
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715269.aspx
|
|
30
|
+
#
|
|
31
|
+
# @return Array<Azure::SqlDatabaseManagement::SqlServer>
|
|
32
|
+
def list_servers
|
|
33
|
+
response = client.sql_management_request(:get, servers_path).call
|
|
34
|
+
Serialization.servers_from_xml(response)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Create a new sql server in Microsoft Azure.
|
|
38
|
+
#
|
|
39
|
+
# @param login [String] The administrator login name.
|
|
40
|
+
# @param password [String] The administrator login password.
|
|
41
|
+
# @param location [String] The location where the database server will be created.
|
|
42
|
+
# @param version [String|Integer] The version of the SQL server (default 12.0)
|
|
43
|
+
#
|
|
44
|
+
# @see https://msdn.microsoft.com/en-us/library/azure/dn505699.aspx
|
|
45
|
+
#
|
|
46
|
+
# @return [Azure::SqlDatabaseManagement::SqlServer]
|
|
47
|
+
def create_server(login, password, location, version = 12.0)
|
|
48
|
+
body = Serialization.server_to_xml(login, password, location, version)
|
|
49
|
+
server_names = list_servers.map(&:name)
|
|
50
|
+
created_server = nil
|
|
51
|
+
|
|
52
|
+
begin
|
|
53
|
+
response = client.sql_management_request(:post, servers_path, body: body, warn: true).call
|
|
54
|
+
created_server = Serialization.server_name_from_xml(response, login, location, version)
|
|
55
|
+
rescue RuntimeError => ex
|
|
56
|
+
if ex.message =~ /Please retry the request/
|
|
57
|
+
created_server = list_servers.reject{|server| server_names.include?(server.name)}.first
|
|
58
|
+
# sometimes the service returns 500, but it doesn't really mean it.
|
|
59
|
+
#
|
|
60
|
+
# If the operation returns success, the operation is complete and the server is created immediately. If the
|
|
61
|
+
# operation fails because of a user error, a server is not created. If there is a communication error or
|
|
62
|
+
# internal server error, you should check the status of the operation using List Servers.
|
|
63
|
+
#
|
|
64
|
+
raise unless created_server
|
|
65
|
+
else
|
|
66
|
+
raise
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
Azure::Loggerx.info "SQL database server #{created_server.name} is created." if created_server
|
|
70
|
+
created_server
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Deletes the specified database server of given subscription id from Microsoft Azure.
|
|
74
|
+
#
|
|
75
|
+
# @param name [String] SqlServer name.
|
|
76
|
+
#
|
|
77
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715285.aspx
|
|
78
|
+
#
|
|
79
|
+
# @return [void]
|
|
80
|
+
def delete_server(name)
|
|
81
|
+
ensure_server_exists!(name)
|
|
82
|
+
client.sql_management_request(:delete, servers_path(name)).call
|
|
83
|
+
Azure::Loggerx.info "Deleted database server #{name}."
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Sets the administrative password of a SQL Database server for a subscription. Will raise
|
|
87
|
+
# Azure::SqlManagement::Error if server does not exist.
|
|
88
|
+
#
|
|
89
|
+
# @param name [String] SqlServer name.
|
|
90
|
+
# @param password [String] SqlServer new password.
|
|
91
|
+
#
|
|
92
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715272.aspx
|
|
93
|
+
#
|
|
94
|
+
# @return [void]
|
|
95
|
+
def reset_password(name, password)
|
|
96
|
+
ensure_server_exists!(name)
|
|
97
|
+
body = Serialization.reset_password_to_xml(password)
|
|
98
|
+
request_path = servers_path + "#{name}?op=ResetPassword"
|
|
99
|
+
request = client.sql_management_request(:post, request_path, body)
|
|
100
|
+
request.call
|
|
101
|
+
Azure::Loggerx.info "Password for server #{name} changed successfully."
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Adds a new server-level firewall or updates an existing server-level firewall rule for a SQL Database server.
|
|
105
|
+
#
|
|
106
|
+
# @param server_name [String] SqlServer server name.
|
|
107
|
+
# @param rule_name [String] Firewall rule name.
|
|
108
|
+
# @param start_ip [String] The lowest IP address in the range of the server-level firewall setting.
|
|
109
|
+
# IP addresses equal to or greater than this can attempt to connect to the server.
|
|
110
|
+
# The lowest possible IP address is 0.0.0.0. (default: first local public ip)
|
|
111
|
+
# @param end_ip [String] The highest IP address in the range of the server-level firewall setting. IP
|
|
112
|
+
# addresses equal to or less than this can attempt to connect to the server. The
|
|
113
|
+
# highest possible IP address is 255.255.255.255. (default: first local public ip)
|
|
114
|
+
#
|
|
115
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715280.aspx
|
|
116
|
+
#
|
|
117
|
+
# @return [void]
|
|
118
|
+
def set_sql_server_firewall_rule(server_name, rule_name, start_ip = public_ipv4, end_ip = public_ipv4)
|
|
119
|
+
|
|
120
|
+
if [server_name, rule_name, start_ip, end_ip].any? { |arg| arg.nil? || arg.empty? || !arg.kind_of?(String) }
|
|
121
|
+
raise ArgumentError.new('Missing or empty parameter server_name, rule_name, start_ip or end_ip')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
fw_rule = FirewallRule.new do |rule|
|
|
125
|
+
rule.name = rule_name
|
|
126
|
+
rule.start_ip_address = start_ip
|
|
127
|
+
rule.end_ip_address = end_ip
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
body = Serialization.firewall_rule_to_xml(fw_rule)
|
|
131
|
+
method = if list_sql_server_firewall_rules(server_name).any? { |rule| rule.name == rule_name }
|
|
132
|
+
# the rule exists, so we need to update the rule
|
|
133
|
+
:put
|
|
134
|
+
else
|
|
135
|
+
# the rule doesn't exist, so we need to create the rule
|
|
136
|
+
:post
|
|
137
|
+
end
|
|
138
|
+
request_path = servers_path "#{server_name}/firewallrules/#{method == :put ? rule_name : ''}"
|
|
139
|
+
client.sql_management_request(method, request_path, body).call
|
|
140
|
+
Azure::Loggerx.info "Modified server-level firewall rule #{rule_name}."
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Gets a list of server-level firewall rules set for SQL database servers. Will raise
|
|
144
|
+
# Azure::SqlManagement::Error if server does not exist.
|
|
145
|
+
#
|
|
146
|
+
# @param server_name [String] Database server name.
|
|
147
|
+
#
|
|
148
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715278.aspx
|
|
149
|
+
#
|
|
150
|
+
# @return [Array<Azure::SqlDatabaseManagement::FirewallRule>]
|
|
151
|
+
def list_sql_server_firewall_rules(server_name)
|
|
152
|
+
ensure_server_exists!(server_name)
|
|
153
|
+
response = client.sql_management_request(:get, servers_path("#{server_name}/firewallrules")).call
|
|
154
|
+
Serialization.database_firewall_from_xml(response)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Deletes a server-level firewall rule from a SQL Database server. Will raise
|
|
158
|
+
# Azure::SqlManagement::Error if server does not exist.
|
|
159
|
+
#
|
|
160
|
+
# @param server_name [String] SQL database server name.
|
|
161
|
+
# @param rule_name [String] SQL database server firewall rule name.
|
|
162
|
+
#
|
|
163
|
+
# @see http://msdn.microsoft.com/en-us/library/azure/gg715277.aspx
|
|
164
|
+
#
|
|
165
|
+
# @return [void]
|
|
166
|
+
def delete_sql_server_firewall_rule(server_name, rule_name)
|
|
167
|
+
ensure_server_exists!(server_name)
|
|
168
|
+
if list_sql_server_firewall_rules(server_name).any? { |rule| rule.name == rule_name }
|
|
169
|
+
request_path = servers_path "#{server_name}/firewallrules/#{rule_name}"
|
|
170
|
+
client.sql_management_request(:delete, request_path).call
|
|
171
|
+
Azure::Loggerx.info "Deleted server-level firewall rule #{rule_name}."
|
|
172
|
+
else
|
|
173
|
+
raise RuleDoesNotExist.new("Firewall rule named #{rule_name} does not exist for server named #{server_name}")
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
private
|
|
178
|
+
|
|
179
|
+
def servers_path(end_path = '')
|
|
180
|
+
'/servers' + if end_path.start_with?('/')
|
|
181
|
+
end_path
|
|
182
|
+
elsif end_path.empty?
|
|
183
|
+
''
|
|
184
|
+
else
|
|
185
|
+
"/#{end_path}"
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Ensures the a database server of a given name exists and raises Azure::SqlManagement::ServerDoesNotExist if it
|
|
190
|
+
# does not exist
|
|
191
|
+
#
|
|
192
|
+
# @param server_name [String] The name of the Azure SQL Server
|
|
193
|
+
# @return [void] Returns true if the server exists
|
|
194
|
+
def ensure_server_exists!(server_name)
|
|
195
|
+
raise ServerDoesNotExist.new("Server named #{server_name} does not exist.") unless server_exists?(server_name)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def server_exists?(server_name)
|
|
199
|
+
ArgumentError.new('Servername cannot be empty or null.') if server_name.empty?
|
|
200
|
+
list_servers.any? { |server| server.name == server_name }
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def public_ipv4
|
|
204
|
+
@public_ip ||= `curl -s whatismyip.akamai.com`
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
Azure::SqlDatabaseManagementService = Azure::SqlDatabaseManagement::SqlDatabaseManagementService
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
module Azure
|
|
16
|
+
module SqlDatabaseManagement
|
|
17
|
+
class SqlServer
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
yield self if block_given?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_accessor :name
|
|
24
|
+
attr_accessor :administrator_login
|
|
25
|
+
attr_accessor :location
|
|
26
|
+
attr_accessor :fully_qualified_domain_name
|
|
27
|
+
attr_accessor :version
|
|
28
|
+
attr_accessor :state
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#-------------------------------------------------------------------------
|
|
2
|
+
# Copyright 2013 Microsoft Open Technologies, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#--------------------------------------------------------------------------
|
|
15
|
+
require 'base64'
|
|
16
|
+
require 'azure/storage_management/storage_account'
|
|
17
|
+
|
|
18
|
+
module Azure
|
|
19
|
+
module StorageManagement
|
|
20
|
+
# Storage management serialization module is responsible for converting
|
|
21
|
+
# the objects to XML and vice versa.
|
|
22
|
+
module Serialization
|
|
23
|
+
extend Azure::Core::Utility
|
|
24
|
+
def self.storage_services_to_xml(name, options = {})
|
|
25
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
26
|
+
xml.CreateStorageServiceInput(
|
|
27
|
+
'xmlns' => 'http://schemas.microsoft.com/windowsazure'
|
|
28
|
+
) do
|
|
29
|
+
xml.ServiceName(name)
|
|
30
|
+
label = options[:label] || name
|
|
31
|
+
xml.Label(Base64.encode64(label))
|
|
32
|
+
xml.Description options[:description]\
|
|
33
|
+
|| 'Explicitly created storage service'
|
|
34
|
+
unless options[:affinity_group_name].nil?
|
|
35
|
+
xml.AffinityGroup options[:affinity_group_name]
|
|
36
|
+
else
|
|
37
|
+
xml.Location options[:location]
|
|
38
|
+
end
|
|
39
|
+
add_options_to_xml(xml, options)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
builder.doc.to_xml
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.storage_services_from_xml(storage_xml)
|
|
46
|
+
storage_accounts = []
|
|
47
|
+
storage_services_xml = storage_xml.css('StorageService')
|
|
48
|
+
storage_services_xml.each do |storage_service_xml|
|
|
49
|
+
storage_account = StorageAccount.new
|
|
50
|
+
|
|
51
|
+
storage_account.url = xml_content(storage_service_xml, 'Url')
|
|
52
|
+
storage_account.name = xml_content(
|
|
53
|
+
storage_service_xml, 'ServiceName'
|
|
54
|
+
)
|
|
55
|
+
storage_service_properties = storage_service_xml.css(
|
|
56
|
+
'StorageServiceProperties'
|
|
57
|
+
)
|
|
58
|
+
storage_account.description = xml_content(
|
|
59
|
+
storage_service_properties, 'Description'
|
|
60
|
+
)
|
|
61
|
+
storage_account.affinity_group = xml_content(
|
|
62
|
+
storage_service_properties, 'AffinityGroup'
|
|
63
|
+
)
|
|
64
|
+
storage_account.location = xml_content(
|
|
65
|
+
storage_service_properties, 'Location'
|
|
66
|
+
)
|
|
67
|
+
storage_account.label = Base64.decode64(
|
|
68
|
+
xml_content(storage_service_properties, 'Label')
|
|
69
|
+
)
|
|
70
|
+
storage_account.status = xml_content(
|
|
71
|
+
storage_service_properties, 'Status'
|
|
72
|
+
)
|
|
73
|
+
storage_account.endpoints = storage_service_properties.css(
|
|
74
|
+
'Endpoints Endpoint'
|
|
75
|
+
).map { |endpoint| endpoint.content }
|
|
76
|
+
storage_account.geo_replication_enabled = xml_content(
|
|
77
|
+
storage_service_properties, 'GeoReplicationEnabled'
|
|
78
|
+
)
|
|
79
|
+
storage_account.account_type = xml_content(
|
|
80
|
+
storage_service_properties, 'AccountType'
|
|
81
|
+
)
|
|
82
|
+
storage_account.geo_primary_region = xml_content(
|
|
83
|
+
storage_service_properties, 'GeoPrimaryRegion'
|
|
84
|
+
)
|
|
85
|
+
storage_account.status_of_primary = xml_content(
|
|
86
|
+
storage_service_properties, 'StatusOfPrimary'
|
|
87
|
+
)
|
|
88
|
+
storage_account.last_geo_failover_time = xml_content(
|
|
89
|
+
storage_service_properties, 'LastGeoFailoverTime'
|
|
90
|
+
)
|
|
91
|
+
storage_account.geo_secondary_region = xml_content(
|
|
92
|
+
storage_service_properties, 'GeoSecondaryRegion'
|
|
93
|
+
)
|
|
94
|
+
storage_account.status_of_secondary = xml_content(
|
|
95
|
+
storage_service_properties, 'StatusOfSecondary'
|
|
96
|
+
)
|
|
97
|
+
storage_account.creation_time = xml_content(
|
|
98
|
+
storage_service_properties, 'CreationTime'
|
|
99
|
+
)
|
|
100
|
+
storage_account.extended_properties = storage_service_xml.css(
|
|
101
|
+
'ExtendedProperties ExtendedProperty'
|
|
102
|
+
).map do |prop|
|
|
103
|
+
{
|
|
104
|
+
name: xml_content(prop, 'Name'),
|
|
105
|
+
value: xml_content(prop, 'Value')
|
|
106
|
+
}
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
storage_accounts << storage_account
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
storage_accounts.compact
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def self.storage_update_to_xml(options)
|
|
116
|
+
# Cannot update if options is nil or empty
|
|
117
|
+
fail 'No options specified' if options.empty?
|
|
118
|
+
|
|
119
|
+
# Either one of Label, or Description is required.
|
|
120
|
+
if (options[:label].nil? || options[:label].empty?) &&
|
|
121
|
+
(options[:description].nil? || options[:description].empty?)
|
|
122
|
+
fail 'Either one of Label or Description'\
|
|
123
|
+
' has to be provided. Both cannot be empty'
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# The input param may not be nil or empty, but the values inside may
|
|
127
|
+
# be. Check if atleast one value exists before proceeding.
|
|
128
|
+
is_empty = true
|
|
129
|
+
options.each do |option, value|
|
|
130
|
+
case option
|
|
131
|
+
when :description, :label
|
|
132
|
+
is_empty = value.nil? || value.empty?
|
|
133
|
+
when :geo_replication_enabled
|
|
134
|
+
is_empty = !(value.is_a?(TrueClass) || value.is_a?(FalseClass))
|
|
135
|
+
when :extended_properties
|
|
136
|
+
value.each do |p, v|
|
|
137
|
+
is_empty = ((p.nil? || p.empty?) || (v.nil? || v.empty?))
|
|
138
|
+
break unless is_empty
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
break unless is_empty
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Raise a RuntimeError if no options were provided
|
|
145
|
+
fail 'No Options Specified' if is_empty
|
|
146
|
+
|
|
147
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
148
|
+
xml.UpdateStorageServiceInput(
|
|
149
|
+
'xmlns' => 'http://schemas.microsoft.com/windowsazure'
|
|
150
|
+
) do
|
|
151
|
+
# Check if label is nil. Use description only if label is nil
|
|
152
|
+
if options[:label].nil? || options[:label].empty?
|
|
153
|
+
desc = options[:description]
|
|
154
|
+
xml.Description(desc) unless desc.nil? || desc.empty?
|
|
155
|
+
else
|
|
156
|
+
label = Base64.encode64(options[:label])
|
|
157
|
+
xml.Label(label) unless label.nil? || label.empty?
|
|
158
|
+
end
|
|
159
|
+
add_options_to_xml(xml, options)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
builder.to_xml
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def self.add_options_to_xml(xml, options = {})
|
|
166
|
+
gre = options[:geo_replication_enabled]
|
|
167
|
+
xml.GeoReplicationEnabled(
|
|
168
|
+
gre
|
|
169
|
+
) unless gre.nil? || !(gre.is_a?(TrueClass) || gre.is_a?(FalseClass))
|
|
170
|
+
xml.ExtendedProperties do
|
|
171
|
+
options[:extended_properties].each do |name, value|
|
|
172
|
+
xml.ExtendedProperty do
|
|
173
|
+
xml.Name name
|
|
174
|
+
xml.Value value
|
|
175
|
+
end unless (name.to_s.empty?) || (value.to_s.empty?)
|
|
176
|
+
end
|
|
177
|
+
end unless options[:extended_properties].to_s.empty?
|
|
178
|
+
xml.AccountType options[:account_type] if options[:account_type]
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def self.storage_account_keys_from_xml(storage_xml)
|
|
182
|
+
storage_xml.css('StorageService')
|
|
183
|
+
storage_service_xml = storage_xml.css('StorageService').first
|
|
184
|
+
service_key_xml = storage_service_xml.css('StorageServiceKeys').first
|
|
185
|
+
storage_account_keys = StorageAccountKeys.new
|
|
186
|
+
storage_account_keys.url = xml_content(storage_service_xml, 'Url')
|
|
187
|
+
storage_account_keys.primary_key = xml_content(service_key_xml, 'Primary')
|
|
188
|
+
storage_account_keys.secondary_key = xml_content(service_key_xml, 'Secondary')
|
|
189
|
+
storage_account_keys
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def self.regenerate_storage_account_keys_to_xml(key_type)
|
|
193
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
|
194
|
+
xml.RegenerateKeys(
|
|
195
|
+
'xmlns' => 'http://schemas.microsoft.com/windowsazure'
|
|
196
|
+
) do
|
|
197
|
+
xml.KeyType(key_type)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
builder.doc.to_xml
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|