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,31 @@
|
|
|
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
|
+
module Azure
|
|
16
|
+
module Blob
|
|
17
|
+
# Represents a Block as part of a BlockList
|
|
18
|
+
# The type should be one of :uncommitted, :committed or :latest
|
|
19
|
+
class Block
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
@type = :latest
|
|
23
|
+
yield self if block_given?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_accessor :name
|
|
27
|
+
attr_accessor :size
|
|
28
|
+
attr_accessor :type
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
|
|
16
|
+
module Azure
|
|
17
|
+
module Blob
|
|
18
|
+
class Container
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
@properties = {}
|
|
22
|
+
@metadata = {}
|
|
23
|
+
yield self if block_given?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
attr_accessor :name
|
|
27
|
+
attr_accessor :properties
|
|
28
|
+
attr_accessor :metadata
|
|
29
|
+
attr_accessor :public_access_level
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,285 @@
|
|
|
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/serialization'
|
|
16
|
+
require 'azure/service/enumeration_results'
|
|
17
|
+
|
|
18
|
+
require 'azure/blob/container'
|
|
19
|
+
require 'azure/blob/blob'
|
|
20
|
+
require 'azure/blob/block'
|
|
21
|
+
|
|
22
|
+
require 'base64'
|
|
23
|
+
|
|
24
|
+
module Azure
|
|
25
|
+
module Blob
|
|
26
|
+
module Serialization
|
|
27
|
+
include Azure::Service::Serialization
|
|
28
|
+
|
|
29
|
+
def self.container_enumeration_results_from_xml(xml)
|
|
30
|
+
xml = slopify(xml)
|
|
31
|
+
expect_node("EnumerationResults", xml)
|
|
32
|
+
|
|
33
|
+
results = enumeration_results_from_xml(xml, Azure::Service::EnumerationResults.new)
|
|
34
|
+
|
|
35
|
+
return results unless (xml > "Containers").any? && ((xml > "Containers") > "Container").any?
|
|
36
|
+
|
|
37
|
+
if xml.Containers.Container.count == 0
|
|
38
|
+
results.push(container_from_xml(xml.Containers.Container))
|
|
39
|
+
else
|
|
40
|
+
xml.Containers.Container.each { |container_node|
|
|
41
|
+
results.push(container_from_xml(container_node))
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
results
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.container_from_xml(xml)
|
|
49
|
+
xml = slopify(xml)
|
|
50
|
+
expect_node("Container", xml)
|
|
51
|
+
|
|
52
|
+
Container.new do |container|
|
|
53
|
+
container.name = xml.Name.text if (xml > "Name").any?
|
|
54
|
+
container.properties = container_properties_from_xml(xml.Properties) if (xml > "Properties").any?
|
|
55
|
+
container.metadata = metadata_from_xml(xml.Metadata) if (xml > "Metadata").any?
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def self.container_from_headers(headers)
|
|
60
|
+
Container.new do |container|
|
|
61
|
+
container.properties = container_properties_from_headers(headers)
|
|
62
|
+
container.public_access_level = public_access_level_from_headers(headers)
|
|
63
|
+
container.metadata = metadata_from_headers(headers)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.container_properties_from_xml(xml)
|
|
68
|
+
xml = slopify(xml)
|
|
69
|
+
expect_node("Properties", xml)
|
|
70
|
+
|
|
71
|
+
props = {}
|
|
72
|
+
|
|
73
|
+
props[:last_modified] = (xml > "Last-Modified").text if (xml > "Last-Modified").any?
|
|
74
|
+
props[:etag] = xml.Etag.text if (xml > "Etag").any?
|
|
75
|
+
props[:lease_status] = xml.LeaseStatus.text if (xml > "LeaseStatus").any?
|
|
76
|
+
props[:lease_state] = xml.LeaseState.text if (xml > "LeaseState").any?
|
|
77
|
+
props[:lease_duration] = xml.LeaseDuration.text if (xml > "LeaseDuration").any?
|
|
78
|
+
|
|
79
|
+
props
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def self.container_properties_from_headers(headers)
|
|
83
|
+
props = {}
|
|
84
|
+
|
|
85
|
+
props[:last_modified] = headers["Last-Modified"]
|
|
86
|
+
props[:etag] = headers["Etag"]
|
|
87
|
+
props[:lease_status] = headers["x-ms-lease-status"]
|
|
88
|
+
props[:lease_state] = headers["x-ms-lease-state"]
|
|
89
|
+
props[:lease_duration] = headers["x-ms-lease-duration"]
|
|
90
|
+
|
|
91
|
+
props
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def self.public_access_level_from_headers(headers)
|
|
95
|
+
headers["x-ms-blob-public-access"]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.blob_enumeration_results_from_xml(xml)
|
|
99
|
+
|
|
100
|
+
xml = slopify(xml)
|
|
101
|
+
expect_node("EnumerationResults", xml)
|
|
102
|
+
|
|
103
|
+
results = enumeration_results_from_xml(xml, Azure::Service::EnumerationResults.new)
|
|
104
|
+
|
|
105
|
+
return results unless (xml > "Blobs").any?
|
|
106
|
+
|
|
107
|
+
if ((xml > "Blobs") > "Blob").any?
|
|
108
|
+
if xml.Blobs.Blob.count == 0
|
|
109
|
+
results.push(blob_from_xml(xml.Blobs.Blob))
|
|
110
|
+
else
|
|
111
|
+
xml.Blobs.Blob.each { |blob_node|
|
|
112
|
+
results.push(blob_from_xml(blob_node))
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
results
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def self.blob_from_xml(xml)
|
|
121
|
+
xml = slopify(xml)
|
|
122
|
+
expect_node("Blob", xml)
|
|
123
|
+
|
|
124
|
+
Blob.new do |blob|
|
|
125
|
+
blob.name = xml.Name.text if (xml > "Name").any?
|
|
126
|
+
blob.snapshot = xml.Snapshot.text if (xml > "Snapshot").any?
|
|
127
|
+
|
|
128
|
+
blob.properties = blob_properties_from_xml(xml.Properties) if (xml > "Properties").any?
|
|
129
|
+
blob.metadata = metadata_from_xml(xml.Metadata) if (xml > "Metadata").any?
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def self.blob_from_headers(headers)
|
|
134
|
+
Blob.new do |blob|
|
|
135
|
+
blob.properties = blob_properties_from_headers(headers)
|
|
136
|
+
blob.metadata = metadata_from_headers(headers)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def self.blob_properties_from_xml(xml)
|
|
141
|
+
xml = slopify(xml)
|
|
142
|
+
expect_node("Properties", xml)
|
|
143
|
+
|
|
144
|
+
props = {}
|
|
145
|
+
|
|
146
|
+
props[:last_modified] = (xml > "Last-Modified").text if (xml > "Last-Modified").any?
|
|
147
|
+
props[:etag] = xml.Etag.text if (xml > "Etag").any?
|
|
148
|
+
props[:lease_status] = xml.LeaseStatus.text if (xml > "LeaseStatus").any?
|
|
149
|
+
props[:lease_state] = xml.LeaseState.text if (xml > "LeaseState").any?
|
|
150
|
+
props[:lease_duration] = xml.LeaseDuration.text if (xml > "LeaseDuration").any?
|
|
151
|
+
props[:content_length] = (xml > "Content-Length").text.to_i if (xml > "Content-Length").any?
|
|
152
|
+
props[:content_type] = (xml > "Content-Type").text if (xml > "Content-Type").any?
|
|
153
|
+
props[:content_encoding] = (xml > "Content-Encoding").text if (xml > "Content-Encoding").any?
|
|
154
|
+
props[:content_language] = (xml > "Content-Language").text if (xml > "Content-Language").any?
|
|
155
|
+
props[:content_md5] = (xml > "Content-MD5").text if (xml > "Content-MD5").any?
|
|
156
|
+
|
|
157
|
+
props[:cache_control] = (xml > "Cache-Control").text if (xml > "Cache-Control").any?
|
|
158
|
+
props[:sequence_number] = (xml > "x-ms-blob-sequence-number").text.to_i if (xml > "x-ms-blob-sequence-number").any?
|
|
159
|
+
props[:blob_type] = xml.BlobType.text if (xml > "BlobType").any?
|
|
160
|
+
props[:copy_id] = xml.CopyId.text if (xml > "CopyId").any?
|
|
161
|
+
props[:copy_status] = xml.CopyStatus.text if (xml > "CopyStatus").any?
|
|
162
|
+
props[:copy_source] = xml.CopySource.text if (xml > "CopySource").any?
|
|
163
|
+
props[:copy_progress] = xml.CopyProgress.text if (xml > "CopyProgress").any?
|
|
164
|
+
props[:copy_completion_time] = xml.CopyCompletionTime.text if (xml > "CopyCompletionTime").any?
|
|
165
|
+
props[:copy_status_description] = xml.CopyStatusDescription.text if (xml > "CopyStatusDescription").any?
|
|
166
|
+
|
|
167
|
+
props
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def self.blob_properties_from_headers(headers)
|
|
171
|
+
props = {}
|
|
172
|
+
|
|
173
|
+
props[:last_modified] = headers["Last-Modified"]
|
|
174
|
+
props[:etag] = headers["Etag"]
|
|
175
|
+
props[:lease_status] = headers["x-ms-lease-status"]
|
|
176
|
+
props[:lease_state] = headers["x-ms-lease-state"]
|
|
177
|
+
props[:lease_duration] = headers["x-ms-lease-duration"]
|
|
178
|
+
|
|
179
|
+
props[:content_length] = headers["x-ms-blob-content-length"] || headers["Content-Length"]
|
|
180
|
+
props[:content_length] = props[:content_length].to_i if props[:content_length]
|
|
181
|
+
|
|
182
|
+
props[:content_type] = headers["x-ms-blob-content-type"] || headers["Content-Type"]
|
|
183
|
+
props[:content_encoding] = headers["x-ms-blob-content-encoding"] || headers["Content-Encoding"]
|
|
184
|
+
props[:content_language] = headers["x-ms-blob-content-language"] || headers["Content-Language"]
|
|
185
|
+
props[:content_md5] = headers["x-ms-blob-content-md5"] || headers["Content-MD5"]
|
|
186
|
+
|
|
187
|
+
props[:cache_control] = headers["x-ms-blob-cache-control"] || headers["Cache-Control"]
|
|
188
|
+
props[:sequence_number] = headers["x-ms-blob-sequence-number"].to_i if headers["x-ms-blob-sequence-number"]
|
|
189
|
+
props[:blob_type] = headers["x-ms-blob-type"]
|
|
190
|
+
|
|
191
|
+
props[:copy_id] = headers["x-ms-copy-id"]
|
|
192
|
+
props[:copy_status] = headers["x-ms-copy-status"]
|
|
193
|
+
props[:copy_source] = headers["x-ms-copy-source"]
|
|
194
|
+
props[:copy_progress] = headers["x-ms-copy-progress"]
|
|
195
|
+
props[:copy_completion_time] = headers["x-ms-copy-completion-time"]
|
|
196
|
+
props[:copy_status_description] = headers["x-ms-copy-status-description"]
|
|
197
|
+
|
|
198
|
+
props[:accept_ranges] = headers["Accept-Ranges"].to_i if headers["Accept-Ranges"]
|
|
199
|
+
|
|
200
|
+
props
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def self.block_list_to_xml(block_list)
|
|
204
|
+
builder = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |xml|
|
|
205
|
+
xml.BlockList {
|
|
206
|
+
block_list.each { |block|
|
|
207
|
+
encoded_id = Base64.strict_encode64(block[0])
|
|
208
|
+
case block[1]
|
|
209
|
+
when :uncommitted
|
|
210
|
+
xml.Uncommitted encoded_id
|
|
211
|
+
when :committed
|
|
212
|
+
xml.Committed encoded_id
|
|
213
|
+
else
|
|
214
|
+
xml.Latest encoded_id
|
|
215
|
+
end
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
end
|
|
219
|
+
builder.to_xml
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def self.block_list_from_xml(xml)
|
|
223
|
+
xml = slopify(xml)
|
|
224
|
+
expect_node("BlockList", xml)
|
|
225
|
+
|
|
226
|
+
block_list = {
|
|
227
|
+
:committed => [],
|
|
228
|
+
:uncommitted => []
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if ((xml > "CommittedBlocks") > "Block").any?
|
|
232
|
+
if xml.CommittedBlocks.Block.count == 0
|
|
233
|
+
add_block(:committed, xml.CommittedBlocks.Block, block_list)
|
|
234
|
+
else
|
|
235
|
+
xml.CommittedBlocks.Block.each { |block_node|
|
|
236
|
+
add_block(:committed, block_node, block_list)
|
|
237
|
+
}
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
return block_list unless (xml > "UncommittedBlocks")
|
|
242
|
+
|
|
243
|
+
if ((xml > "UncommittedBlocks") > "Block").any?
|
|
244
|
+
if xml.UncommittedBlocks.Block.count == 0
|
|
245
|
+
add_block(:uncommitted, xml.UncommittedBlocks.Block, block_list)
|
|
246
|
+
else
|
|
247
|
+
xml.UncommittedBlocks.Block.each { |block_node|
|
|
248
|
+
add_block(:uncommitted, block_node, block_list)
|
|
249
|
+
}
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
block_list
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def self.add_block(type, block_node, block_list)
|
|
257
|
+
block = Block.new do |b|
|
|
258
|
+
b.name = Base64.strict_decode64(block_node.Name.text) if (block_node > "Name").any?
|
|
259
|
+
b.size = block_node.Size.text.to_i if (block_node > "Size").any?
|
|
260
|
+
b.type = type
|
|
261
|
+
end
|
|
262
|
+
block_list[type].push block
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def self.page_list_from_xml(xml)
|
|
266
|
+
xml = slopify(xml)
|
|
267
|
+
expect_node("PageList", xml)
|
|
268
|
+
|
|
269
|
+
page_list = []
|
|
270
|
+
|
|
271
|
+
return page_list unless (xml > "PageRange").any?
|
|
272
|
+
|
|
273
|
+
if xml.PageRange.count == 0
|
|
274
|
+
page_list.push [xml.PageRange.Start.text.to_i, xml.PageRange.End.text.to_i]
|
|
275
|
+
else
|
|
276
|
+
xml.PageRange.each { |page_range|
|
|
277
|
+
page_list.push [page_range.Start.text.to_i, page_range.End.text.to_i]
|
|
278
|
+
}
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
page_list
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
module Azure
|
|
17
|
+
module CloudServiceManagement
|
|
18
|
+
class CloudService
|
|
19
|
+
def initialize
|
|
20
|
+
yield self if block_given?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
attr_accessor :url
|
|
24
|
+
attr_accessor :name
|
|
25
|
+
attr_accessor :label
|
|
26
|
+
attr_accessor :description
|
|
27
|
+
attr_accessor :location
|
|
28
|
+
attr_accessor :affinity_group
|
|
29
|
+
attr_accessor :status
|
|
30
|
+
attr_accessor :date_created
|
|
31
|
+
attr_accessor :date_modified
|
|
32
|
+
attr_accessor :extended_properties
|
|
33
|
+
attr_accessor :default_winrm_certificate_thumbprint
|
|
34
|
+
attr_accessor :virtual_machines
|
|
35
|
+
attr_accessor :deployment_name
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,361 @@
|
|
|
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/cloud_service_management/serialization'
|
|
16
|
+
|
|
17
|
+
module Azure
|
|
18
|
+
module CloudServiceManagement
|
|
19
|
+
class CloudServiceManagementService < BaseManagementService
|
|
20
|
+
def initialize
|
|
21
|
+
super()
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Public: Creates a new cloud service in Windows Azure.
|
|
25
|
+
#
|
|
26
|
+
# ==== Attributes
|
|
27
|
+
#
|
|
28
|
+
# * +name+ - String. The name of the cloud service.
|
|
29
|
+
# * +options+ - Hash. Optional parameters.
|
|
30
|
+
#
|
|
31
|
+
# ==== Options
|
|
32
|
+
#
|
|
33
|
+
# Accepted key/value pairs in options parameter are:
|
|
34
|
+
# * +:label+ -String. The label for this cloud service.
|
|
35
|
+
# * +:description+ - String. A description for the hosted service. (optional)
|
|
36
|
+
# * +:location+ - String. The regional data center location where the
|
|
37
|
+
# cloud service will be created. Required if affinity group not
|
|
38
|
+
# specified (optional)
|
|
39
|
+
# * +:affinity_group_name - String. Name of the affinity group with
|
|
40
|
+
# which to assocate the cloud service. Required if location not
|
|
41
|
+
# specified (optional)
|
|
42
|
+
# * +:extended_properties+ - Hash. Key/Value pairs of extended
|
|
43
|
+
# properties to add to the cloud service. The key is used as the
|
|
44
|
+
# property name and the value as its value. (optional)
|
|
45
|
+
#
|
|
46
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg441304.aspx
|
|
47
|
+
#
|
|
48
|
+
# Returns None
|
|
49
|
+
def create_cloud_service(name, options = {})
|
|
50
|
+
Loggerx.error_with_exit 'Cloud service name is not valid ' unless name
|
|
51
|
+
if get_cloud_service(name)
|
|
52
|
+
Loggerx.warn "Cloud service #{name} already exists. Skipped..."
|
|
53
|
+
else
|
|
54
|
+
Loggerx.info "Creating cloud service #{name}."
|
|
55
|
+
request_path = '/services/hostedservices'
|
|
56
|
+
body = Serialization.cloud_services_to_xml(name, options)
|
|
57
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
58
|
+
request.call
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Public: Deploy a .cspkg hosted at a specific package_url to a a Cloud Service on a specific slot
|
|
63
|
+
#
|
|
64
|
+
# ==== Attributes
|
|
65
|
+
#
|
|
66
|
+
# * +deployment_name+ - String. Name of the deployment
|
|
67
|
+
# * +cloud_service_name+ - String. Name of the Cloud Service where the deployment
|
|
68
|
+
# needs to be created
|
|
69
|
+
# * +package_url+ - String. URL of the blob storage where the .cspkg is being
|
|
70
|
+
# stored
|
|
71
|
+
# * +package_url+ - String. URL of the blob storage where the .cspkg is being
|
|
72
|
+
# stored
|
|
73
|
+
# * +service_configuration+ - Base64 encoded String. ServiceConfiguration.cscfg file
|
|
74
|
+
# * +options+ - Hash. Optional parameters.
|
|
75
|
+
#
|
|
76
|
+
# ==== Options
|
|
77
|
+
#
|
|
78
|
+
# Accepted key/value pairs in options parameter are:
|
|
79
|
+
# * +:slot+ - String. Deployment slot. Valid values are either
|
|
80
|
+
# 'production'(default) or 'staging'.
|
|
81
|
+
# * +:label+ - String. The label for this cloud service.
|
|
82
|
+
# * +:start_deployment+ - String. A description for the hosted service. (optional)
|
|
83
|
+
# * +:treat_warnings_as_error+ - String.
|
|
84
|
+
# * +:extended_properties+ - Hash. Key/Value pairs of extended properties to add to
|
|
85
|
+
# the cloud service. The key is used as the property name
|
|
86
|
+
# and the value as its value.
|
|
87
|
+
# * +fire_and_forget+ - Boolean(efault is false). If true, the client
|
|
88
|
+
# does not wait until the request is completed.
|
|
89
|
+
# * +:upgrade_if_exists+ - Boolean(default is false). If true, then if a deployment
|
|
90
|
+
# already exists, then it is upgraded. Otherwise, an exception
|
|
91
|
+
# is thrown.
|
|
92
|
+
#
|
|
93
|
+
# More details at http://msdn.microsoft.com/en-us/library/azure/ee460813.aspx
|
|
94
|
+
#
|
|
95
|
+
# Returns None
|
|
96
|
+
def create_deployment(deployment_name, cloud_service_name, package_url, service_configuration, options = {})
|
|
97
|
+
Loggerx.error_with_exit 'Cloud service name is not valid' unless cloud_service_name
|
|
98
|
+
Loggerx.error_with_exit 'Deployment name is not valid' unless deployment_name
|
|
99
|
+
Loggerx.error_with_exit 'Package url is not valid' unless package_url
|
|
100
|
+
Loggerx.error_with_exit 'ServiceConfiguration.cscfg is not valid' unless service_configuration
|
|
101
|
+
upgrade_if_exists = options[:upgrade_if_exists].nil? ? false : options[:upgrade_if_exists]
|
|
102
|
+
|
|
103
|
+
slot = "production"
|
|
104
|
+
unless options.nil? || options[:slot].nil?
|
|
105
|
+
valid_slot = options[:slot].casecmp("staging") || options[:slot].casecmp("production")
|
|
106
|
+
Loggerx.error_with_exit 'Deployment slot is not valid' unless valid_slot
|
|
107
|
+
slot = options[:slot].downcase
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# 2. Get the current deployment so one can verify that it can be upgraded
|
|
111
|
+
deployment = get_deployment(cloud_service_name, {:slot => slot, :no_exit_on_failure => true})
|
|
112
|
+
|
|
113
|
+
# 3. Create or upgrade the deployment
|
|
114
|
+
if deployment.exists?
|
|
115
|
+
if upgrade_if_exists
|
|
116
|
+
upgrade_deployment(cloud_service_name, package_url, service_configuration, options)
|
|
117
|
+
else
|
|
118
|
+
Loggerx.error_with_exit "#{slot.capitalize} deployment '#{deployment_name}' on cloud service #{cloud_service_name} already exist."
|
|
119
|
+
end
|
|
120
|
+
else
|
|
121
|
+
slot = "production"
|
|
122
|
+
unless options.nil? || options[:slot].nil?
|
|
123
|
+
valid_slot = options[:slot].casecmp("staging") || options[:slot].casecmp("production")
|
|
124
|
+
Loggerx.error_with_exit 'Deployment slot is not valid' unless valid_slot
|
|
125
|
+
slot = options[:slot].downcase
|
|
126
|
+
end
|
|
127
|
+
Loggerx.info "Creating deployment #{deployment_name}."
|
|
128
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}"
|
|
129
|
+
body = Serialization.create_deployment_to_xml(deployment_name, package_url, service_configuration, options)
|
|
130
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
131
|
+
request.call(options)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Public: Upgrade an existing deployment with a new .cspkg hosted at a specific package_url.
|
|
136
|
+
# You can choose to upgrade all roles within the deployment(default), or only select
|
|
137
|
+
# specific ones
|
|
138
|
+
#
|
|
139
|
+
# ==== Attributes
|
|
140
|
+
#
|
|
141
|
+
# * +cloud_service_name+ - String. Name of the Cloud Service where the deployment
|
|
142
|
+
# needs to be created
|
|
143
|
+
# * +package_url+ - String. URL of the blob storage where the .cspkg is being
|
|
144
|
+
# stored
|
|
145
|
+
# * +service_configuration+ - Base64 encoded String. ServiceConfiguration.cscfg file
|
|
146
|
+
# * +options+ - Hash. Optional parameters.
|
|
147
|
+
#
|
|
148
|
+
# ==== Options
|
|
149
|
+
#
|
|
150
|
+
# Accepted key/value pairs in options parameter are:
|
|
151
|
+
# * +:slot+ - String. Deployment slot. Valid values are either
|
|
152
|
+
# 'production'(default) or 'staging'.
|
|
153
|
+
# * +:name+ - String. Deployment's name.
|
|
154
|
+
# * +:mode+ - String. Specifies the type of update to initiate.Valid values
|
|
155
|
+
# are either 'Auto'(default), 'Manual', or 'Simultaneous'
|
|
156
|
+
# * +:label+ - String. The label for this cloud service.
|
|
157
|
+
# * +:role_to_upgrade+ - String. Specifies the name of the specific role instance to update.
|
|
158
|
+
# * +:force+ - Boolean(default false). Indicates whether the rollback should
|
|
159
|
+
# proceed even when it will cause local data to be lost from some
|
|
160
|
+
# role instances
|
|
161
|
+
# * +:extended_properties+ - Hash. Key/Value pairs of extended properties to add to
|
|
162
|
+
# the cloud service. The key is used as the property name
|
|
163
|
+
# and the value as its value.
|
|
164
|
+
# * +fire_and_forget+ - Boolean(efault is false). If true, the client
|
|
165
|
+
# does not wait until the request is completed.
|
|
166
|
+
#
|
|
167
|
+
# More details at http://msdn.microsoft.com/en-us/library/azure/ee460793.aspx
|
|
168
|
+
#
|
|
169
|
+
# Returns None
|
|
170
|
+
def upgrade_deployment(cloud_service_name, package_url, service_configuration, options = {})
|
|
171
|
+
Loggerx.error_with_exit 'Cloud service name is not valid' unless cloud_service_name
|
|
172
|
+
Loggerx.error_with_exit 'Package url is not valid' unless package_url
|
|
173
|
+
Loggerx.error_with_exit 'ServiceConfiguration.cscfg is not valid' unless service_configuration
|
|
174
|
+
|
|
175
|
+
# 1. Identify which type of query needs to be processes
|
|
176
|
+
request_path = nil
|
|
177
|
+
info_msg = nil
|
|
178
|
+
error_msg_body = "nil"
|
|
179
|
+
slot = (options[:slot].nil? && options[:name].nil?) ? "production" : options[:slot]
|
|
180
|
+
if !slot.nil?
|
|
181
|
+
invalid_slot = slot.casecmp("staging") != 0 && slot.casecmp("production") != 0
|
|
182
|
+
Loggerx.error_with_exit 'slot is not valid' if invalid_slot
|
|
183
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}/?comp=upgrade"
|
|
184
|
+
info_msg = "Upgrading #{slot} deployment on #{cloud_service_name} cloud service."
|
|
185
|
+
error_msg_body = "#{slot.capitalize} deployment on cloud service #{cloud_service_name}"
|
|
186
|
+
else
|
|
187
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deployments/#{options[:name]}/?comp=upgrade"
|
|
188
|
+
info_msg = "Upgrading deployment #{options[:name]} on #{cloud_service_name} cloud service."
|
|
189
|
+
error_msg_body = "Deployment #{options[:name]} on cloud service #{cloud_service_name}"
|
|
190
|
+
end
|
|
191
|
+
options[:label] = "#{slot} deployment #{cloud_service_name}" if options[:label].nil?
|
|
192
|
+
|
|
193
|
+
# 2. Get the current deployment so one can verify that it can be upgraded
|
|
194
|
+
options[:no_exit_on_failure] = true
|
|
195
|
+
deployment = get_deployment(cloud_service_name, options)
|
|
196
|
+
|
|
197
|
+
# 3. Upgrade the deployment if it is in a state where it can be upgraded
|
|
198
|
+
if !deployment.exists?
|
|
199
|
+
Loggerx.error_with_exit "#{error_msg_body} does not exist, and therefore cannot be upgraded."
|
|
200
|
+
elsif deployment.is_transitioning?
|
|
201
|
+
Loggerx.error_with_exit "#{error_msg_body} is currently transitioning. Wait until it is done transitioning before doing an upgrade."
|
|
202
|
+
else
|
|
203
|
+
Loggerx.info info_msg
|
|
204
|
+
body = Serialization.upgrade_deployment_to_xml(package_url, service_configuration, options)
|
|
205
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
206
|
+
request.call(options)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Public: Swap the staging and production deployment of a specific cloud service
|
|
211
|
+
#
|
|
212
|
+
# ==== Attributes
|
|
213
|
+
#
|
|
214
|
+
# * +cloud_service_name+ - String. Name of the Cloud Service where the deployments
|
|
215
|
+
# are going to be swapped
|
|
216
|
+
# * +options+ - Hash. Optional parameters.
|
|
217
|
+
#
|
|
218
|
+
# ==== Options
|
|
219
|
+
#
|
|
220
|
+
# Accepted key/value pairs in options parameter are:
|
|
221
|
+
#
|
|
222
|
+
# * +fire_and_forget+ - Boolean(efault is false). If true, the client
|
|
223
|
+
# does not wait until the request is completed.
|
|
224
|
+
#
|
|
225
|
+
# More details at http://msdn.microsoft.com/en-us/library/azure/ee460814.aspx
|
|
226
|
+
#
|
|
227
|
+
# Returns None
|
|
228
|
+
def swap_deployment(cloud_service_name, options={})
|
|
229
|
+
Loggerx.error_with_exit 'Cloud service name is not valid' unless cloud_service_name
|
|
230
|
+
|
|
231
|
+
staging_deployment = get_deployment(cloud_service_name, {:slot => "staging", :no_exit_on_failure => true})
|
|
232
|
+
Loggerx.error_with_exit "Staging deployment on cloud service #{cloud_service_name} is transitioning. Wait until transitioning is over before swapping." if (staging_deployment.exists? && staging_deployment.is_transitioning?)
|
|
233
|
+
production_deployment = get_deployment(cloud_service_name, {:slot => "production", :no_exit_on_failure => true})
|
|
234
|
+
Loggerx.error_with_exit "Production deployment on cloud service #{cloud_service_name} is transitioning. Wait until transitioning is over before swapping." if (production_deployment.exists? && production_deployment.is_transitioning?)
|
|
235
|
+
Loggerx.error_with_exit "There are no deployments on cloud service #{cloud_service_name}." unless (staging_deployment.exists? || production_deployment.exists?)
|
|
236
|
+
|
|
237
|
+
Loggerx.info "Swapping deployments on cloud service #{cloud_service_name} starting"
|
|
238
|
+
request_path = "/services/hostedservices/#{cloud_service_name}"
|
|
239
|
+
body = Serialization.swap_deployments_to_xml(production_deployment.name, staging_deployment.name)
|
|
240
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
241
|
+
request.call(options)
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Public: Gets a specific deployment of a Cloud Service based on either its name, or its slot
|
|
245
|
+
#
|
|
246
|
+
# ==== Attributes
|
|
247
|
+
#
|
|
248
|
+
# * +cloud_service_name+ - String. Name of the Cloud Service where the deployment lives
|
|
249
|
+
# * +options+ - Hash. Optional parameters.
|
|
250
|
+
#
|
|
251
|
+
# ==== Options
|
|
252
|
+
#
|
|
253
|
+
# Accepted key/value pairs in options parameter are:
|
|
254
|
+
# * +:slot+ - String. Deployment slot. Valid values are either 'production'(default)
|
|
255
|
+
# or 'staging'. If not defined, and 'name' is also not defined, then
|
|
256
|
+
# default slot is set to 'production'
|
|
257
|
+
# * +:id+ - String. Deployment's id(aka deployment's name, or private id).
|
|
258
|
+
# * +:no_exit_on_failure+ - Boolean(optional). Default is false.
|
|
259
|
+
#
|
|
260
|
+
# More details at http://msdn.microsoft.com/en-us/library/azure/ee460804.aspx
|
|
261
|
+
#
|
|
262
|
+
def get_deployment(cloud_service_name, options={})
|
|
263
|
+
Loggerx.error_with_exit 'Cloud service name is not valid' unless cloud_service_name
|
|
264
|
+
request_path = nil
|
|
265
|
+
slot = (options[:slot].nil? && options[:id].nil?) ? "production" : options[:slot]
|
|
266
|
+
if !slot.nil?
|
|
267
|
+
invalid_slot = slot.casecmp("staging") != 0 && slot.casecmp("production") != 0
|
|
268
|
+
Loggerx.error_with_exit 'slot is not valid' if invalid_slot
|
|
269
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}"
|
|
270
|
+
else
|
|
271
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deployments/#{options[:id]}"
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
request = ManagementHttpRequest.new(:get, request_path, nil)
|
|
275
|
+
response = request.call(options)
|
|
276
|
+
#puts response
|
|
277
|
+
Serialization.deployment_from_xml(response)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Public: Gets a list of hosted services available under the current subscription.
|
|
281
|
+
#
|
|
282
|
+
# Returns an array of Azure::CloudServiceManagement::CloudService objects
|
|
283
|
+
def list_cloud_services
|
|
284
|
+
request_path = '/services/hostedservices'
|
|
285
|
+
request = ManagementHttpRequest.new(:get, request_path, nil)
|
|
286
|
+
response = request.call
|
|
287
|
+
Serialization.cloud_services_from_xml(response)
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
# Public: Checks to see if the specified hosted service is available
|
|
291
|
+
#
|
|
292
|
+
# ==== Attributes
|
|
293
|
+
#
|
|
294
|
+
# * +name+ - String. Cloud service name.
|
|
295
|
+
#
|
|
296
|
+
# Returns: A boolean value indicating whether the cloud service exists.
|
|
297
|
+
# If true, the cloud service is available. If false, the cloud service
|
|
298
|
+
# does not exist.
|
|
299
|
+
def get_cloud_service(name)
|
|
300
|
+
return false if name.nil?
|
|
301
|
+
flag = false
|
|
302
|
+
list_cloud_services.each do |cloud_service|
|
|
303
|
+
if cloud_service.name == name
|
|
304
|
+
flag = true
|
|
305
|
+
break
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
flag
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def get_cloud_service_properties(name)
|
|
312
|
+
request_path = "/services/hostedservices/#{name}?embed-detail=true"
|
|
313
|
+
request = ManagementHttpRequest.new(:get, request_path)
|
|
314
|
+
response = request.call
|
|
315
|
+
Serialization.cloud_services_from_xml(response).first
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
# Public: Deletes the specified cloud service of given subscription id from Windows Azure.
|
|
319
|
+
#
|
|
320
|
+
# ==== Attributes
|
|
321
|
+
#
|
|
322
|
+
# * +name+ - String. Cloud service name.
|
|
323
|
+
#
|
|
324
|
+
# Returns: None
|
|
325
|
+
def delete_cloud_service(cloud_service_name)
|
|
326
|
+
request_path = "/services/hostedservices/#{cloud_service_name}"
|
|
327
|
+
request = ManagementHttpRequest.new(:delete, request_path)
|
|
328
|
+
Loggerx.info "Deleting cloud service #{cloud_service_name}. \n"
|
|
329
|
+
request.call
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
# Public: Deletes the specified deployment.
|
|
333
|
+
#
|
|
334
|
+
# ==== Attributes
|
|
335
|
+
#
|
|
336
|
+
# * +cloud_service_name+ - String. Cloud service name.
|
|
337
|
+
# * +slot+ - String. Either 'production' or 'staging'. Optional parameters.
|
|
338
|
+
# Default if not specified is 'production'
|
|
339
|
+
#
|
|
340
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460815.aspx
|
|
341
|
+
#
|
|
342
|
+
# Returns NONE
|
|
343
|
+
def delete_cloud_service_deployment(cloud_service_name, slot='production')
|
|
344
|
+
slot = "production" unless slot
|
|
345
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/deploymentslots/#{slot}"
|
|
346
|
+
request = ManagementHttpRequest.new(:delete, request_path)
|
|
347
|
+
Loggerx.info "Deleting deployment of cloud service \"#{cloud_service_name}\" ..."
|
|
348
|
+
request.call
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def upload_certificate(cloud_service_name, ssh)
|
|
352
|
+
data = export_der(ssh[:cert], ssh[:key])
|
|
353
|
+
request_path = "/services/hostedservices/#{cloud_service_name}/certificates"
|
|
354
|
+
body = Serialization.add_certificate_to_xml(data)
|
|
355
|
+
Loggerx.info "Uploading certificate to cloud service #{cloud_service_name}..."
|
|
356
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
|
357
|
+
request.call
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|