stuartpreston-azure-sdk-for-ruby 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +11 -11
- data/.travis.yml +10 -10
- data/ChangeLog.txt +70 -68
- data/Gemfile +15 -15
- data/README.md +618 -618
- data/Rakefile +133 -133
- data/azure.gemspec +44 -44
- data/lib/azure.rb +52 -52
- data/lib/azure/base_management/affinity_group.rb +32 -32
- data/lib/azure/base_management/base_management_service.rb +304 -304
- data/lib/azure/base_management/location.rb +27 -27
- data/lib/azure/base_management/management_http_request.rb +171 -171
- data/lib/azure/base_management/serialization.rb +129 -129
- data/lib/azure/base_management/sql_management_http_request.rb +45 -45
- data/lib/azure/blob/blob.rb +31 -31
- data/lib/azure/blob/blob_service.rb +1423 -1423
- data/lib/azure/blob/block.rb +30 -30
- data/lib/azure/blob/container.rb +31 -31
- data/lib/azure/blob/serialization.rb +284 -284
- data/lib/azure/cloud_service_management/cloud_service.rb +38 -38
- data/lib/azure/cloud_service_management/cloud_service_management_service.rb +140 -140
- data/lib/azure/cloud_service_management/serialization.rb +117 -117
- data/lib/azure/core.rb +39 -39
- data/lib/azure/core/auth/authorizer.rb +36 -36
- data/lib/azure/core/auth/shared_key.rb +110 -110
- data/lib/azure/core/auth/shared_key_lite.rb +48 -48
- data/lib/azure/core/auth/signer.rb +48 -48
- data/lib/azure/core/configuration.rb +211 -211
- data/lib/azure/core/error.rb +22 -22
- data/lib/azure/core/filtered_service.rb +43 -43
- data/lib/azure/core/http/debug_filter.rb +35 -35
- data/lib/azure/core/http/http_error.rb +88 -88
- data/lib/azure/core/http/http_filter.rb +52 -52
- data/lib/azure/core/http/http_request.rb +157 -157
- data/lib/azure/core/http/http_response.rb +140 -140
- data/lib/azure/core/http/retry_policy.rb +73 -73
- data/lib/azure/core/http/signer_filter.rb +33 -33
- data/lib/azure/core/service.rb +62 -62
- data/lib/azure/core/signed_service.rb +42 -42
- data/lib/azure/core/utility.rb +190 -190
- data/lib/azure/queue/message.rb +29 -29
- data/lib/azure/queue/queue.rb +28 -28
- data/lib/azure/queue/queue_service.rb +567 -567
- data/lib/azure/queue/serialization.rb +106 -106
- data/lib/azure/service/access_policy.rb +25 -25
- data/lib/azure/service/cors.rb +11 -11
- data/lib/azure/service/cors_rule.rb +15 -15
- data/lib/azure/service/enumeration_results.rb +20 -20
- data/lib/azure/service/logging.rb +31 -31
- data/lib/azure/service/metrics.rb +30 -30
- data/lib/azure/service/retention_policy.rb +24 -24
- data/lib/azure/service/serialization.rb +297 -297
- data/lib/azure/service/signed_identifier.rb +29 -29
- data/lib/azure/service/storage_service.rb +82 -82
- data/lib/azure/service/storage_service_properties.rb +37 -37
- data/lib/azure/service_bus/action.rb +21 -21
- data/lib/azure/service_bus/auth/wrap_service.rb +88 -88
- data/lib/azure/service_bus/auth/wrap_signer.rb +68 -68
- data/lib/azure/service_bus/brokered_message.rb +123 -123
- data/lib/azure/service_bus/brokered_message_serializer.rb +159 -159
- data/lib/azure/service_bus/correlation_filter.rb +45 -45
- data/lib/azure/service_bus/empty_rule_action.rb +29 -29
- data/lib/azure/service_bus/false_filter.rb +38 -38
- data/lib/azure/service_bus/filter.rb +21 -21
- data/lib/azure/service_bus/interval.rb +103 -103
- data/lib/azure/service_bus/queue.rb +229 -229
- data/lib/azure/service_bus/relay.rb +87 -87
- data/lib/azure/service_bus/resource.rb +108 -108
- data/lib/azure/service_bus/rule.rb +97 -97
- data/lib/azure/service_bus/rule_aspect.rb +34 -34
- data/lib/azure/service_bus/serialization.rb +161 -161
- data/lib/azure/service_bus/service_bus_service.rb +896 -896
- data/lib/azure/service_bus/sql_filter.rb +50 -50
- data/lib/azure/service_bus/sql_rule_action.rb +50 -50
- data/lib/azure/service_bus/subscription.rb +183 -183
- data/lib/azure/service_bus/topic.rb +186 -186
- data/lib/azure/service_bus/true_filter.rb +38 -38
- data/lib/azure/sql_database_management/serialization.rb +111 -111
- data/lib/azure/sql_database_management/sql_database.rb +31 -31
- data/lib/azure/sql_database_management/sql_database_management_service.rb +200 -200
- data/lib/azure/storage_management/serialization.rb +184 -184
- data/lib/azure/storage_management/storage_account.rb +40 -40
- data/lib/azure/storage_management/storage_management_service.rb +166 -166
- data/lib/azure/table/auth/shared_key.rb +92 -92
- data/lib/azure/table/auth/shared_key_lite.rb +44 -44
- data/lib/azure/table/batch.rb +329 -329
- data/lib/azure/table/batch_response.rb +118 -118
- data/lib/azure/table/edmtype.rb +126 -126
- data/lib/azure/table/entity.rb +30 -30
- data/lib/azure/table/guid.rb +23 -23
- data/lib/azure/table/query.rb +111 -111
- data/lib/azure/table/serialization.rb +107 -107
- data/lib/azure/table/table_service.rb +559 -559
- data/lib/azure/version.rb +31 -31
- data/lib/azure/virtual_machine_image_management/serialization.rb +66 -66
- data/lib/azure/virtual_machine_image_management/virtual_machine_disk.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image.rb +25 -25
- data/lib/azure/virtual_machine_image_management/virtual_machine_image_management_service.rb +94 -94
- data/lib/azure/virtual_machine_management/serialization.rb +462 -462
- data/lib/azure/virtual_machine_management/virtual_machine.rb +45 -45
- data/lib/azure/virtual_machine_management/virtual_machine_management_service.rb +588 -588
- data/lib/azure/virtual_network_management/serialization.rb +190 -190
- data/lib/azure/virtual_network_management/virtual_network.rb +37 -37
- data/lib/azure/virtual_network_management/virtual_network_management_service.rb +109 -109
- data/test/fixtures/affinity_group.xml +33 -33
- data/test/fixtures/all_containers.xml +20 -20
- data/test/fixtures/all_tables.xml +22 -22
- data/test/fixtures/certificate.pem +21 -21
- data/test/fixtures/container_acl.xml +11 -11
- data/test/fixtures/create_sql_database_server.xml +1 -1
- data/test/fixtures/create_storage_desc_error.xml +5 -5
- data/test/fixtures/create_storage_extendedprop_error.xml +8 -8
- data/test/fixtures/create_storage_extendedpropname_error.xml +6 -6
- data/test/fixtures/create_storage_full_error.xml +6 -6
- data/test/fixtures/create_storage_label_error.xml +5 -5
- data/test/fixtures/create_storage_location_error.xml +5 -5
- data/test/fixtures/create_storage_name_error.xml +6 -6
- data/test/fixtures/create_table_response_entry.xml +15 -15
- data/test/fixtures/delete_storage_container_error.xml +5 -5
- data/test/fixtures/delete_storage_error.xml +5 -5
- data/test/fixtures/deployment_error.xml +5 -5
- data/test/fixtures/get_storage_account_error.xml +5 -5
- data/test/fixtures/get_storage_account_properties.xml +31 -31
- data/test/fixtures/get_storage_account_properties_new.xml +31 -31
- data/test/fixtures/http_error.xml +5 -5
- data/test/fixtures/insert_entity_response_entry.xml +25 -25
- data/test/fixtures/list_affinity_groups.xml +22 -22
- data/test/fixtures/list_blobs.xml +120 -120
- data/test/fixtures/list_block_all_with_none_committed.xml +21 -21
- data/test/fixtures/list_blocks_all.xml +22 -22
- data/test/fixtures/list_blocks_committed.xml +12 -12
- data/test/fixtures/list_cloud_services.xml +38 -38
- data/test/fixtures/list_containers.xml +37 -37
- data/test/fixtures/list_firewall_management_endpoint.xml +27 -27
- data/test/fixtures/list_images.xml +110 -110
- data/test/fixtures/list_locations.xml +62 -62
- data/test/fixtures/list_page_ranges.xml +10 -10
- data/test/fixtures/list_sql_database.xml +36 -36
- data/test/fixtures/list_sql_server_firewall.xml +23 -23
- data/test/fixtures/list_storage_account_single.xml +24 -24
- data/test/fixtures/list_storage_accounts.xml +45 -45
- data/test/fixtures/list_virtual_networks.xml +92 -92
- data/test/fixtures/logging.xml +11 -11
- data/test/fixtures/management_certificate.pem +55 -55
- data/test/fixtures/messages.xml +12 -12
- data/test/fixtures/metrics.xml +10 -10
- data/test/fixtures/privatekey.key +28 -28
- data/test/fixtures/query_entities_empty_response.xml +7 -7
- data/test/fixtures/query_entities_response.xml +45 -45
- data/test/fixtures/queue_service_properties.xml +22 -22
- data/test/fixtures/queue_service_properties_original.xml +19 -19
- data/test/fixtures/queues.xml +16 -16
- data/test/fixtures/retention_policy.xml +5 -5
- data/test/fixtures/sb_default_create_queue_response.xml +23 -23
- data/test/fixtures/sb_default_create_relay_response.xml +15 -15
- data/test/fixtures/sb_default_create_topic_response.xml +18 -18
- data/test/fixtures/sb_get_access_token_response.txt +1 -1
- data/test/fixtures/sb_queues_runtime_peek_message_response_headers.txt +9 -9
- data/test/fixtures/storage_service_properties.xml +54 -54
- data/test/fixtures/update_storage_account.xml +16 -16
- data/test/fixtures/update_storage_error.xml +4 -4
- data/test/fixtures/updated_storage_accounts.xml +52 -52
- data/test/fixtures/virtual_machine.xml +113 -113
- data/test/fixtures/windows_virtual_machine.xml +106 -106
- data/test/integration/affinity_group/Affinity_test.rb +55 -55
- data/test/integration/affinity_group/Create_Affinity_test.rb +63 -63
- data/test/integration/affinity_group/Delete_Affinity_test.rb +56 -56
- data/test/integration/affinity_group/List_Affinity_test.rb +41 -41
- data/test/integration/affinity_group/Update_Affinity_test.rb +82 -82
- data/test/integration/blob/blob_gb18030_test.rb +199 -199
- data/test/integration/blob/blob_metadata_test.rb +75 -75
- data/test/integration/blob/blob_pages_test.rb +119 -119
- data/test/integration/blob/blob_properties_test.rb +77 -77
- data/test/integration/blob/block_blob_test.rb +254 -254
- data/test/integration/blob/container/container_acl_test.rb +69 -69
- data/test/integration/blob/container/container_metadata_test.rb +50 -50
- data/test/integration/blob/container/create_container_test.rb +60 -60
- data/test/integration/blob/container/delete_container_test.rb +39 -39
- data/test/integration/blob/container/get_container_properties_test.rb +48 -48
- data/test/integration/blob/container/list_containers_test.rb +79 -79
- data/test/integration/blob/container/root_container_test.rb +53 -53
- data/test/integration/blob/copy_blob_test.rb +113 -113
- data/test/integration/blob/create_blob_snapshot_test.rb +80 -80
- data/test/integration/blob/create_page_blob_test.rb +83 -83
- data/test/integration/blob/delete_blob_test.rb +159 -159
- data/test/integration/blob/get_blob_test.rb +65 -65
- data/test/integration/blob/informative_errors_test.rb +38 -38
- data/test/integration/blob/lease/acquire_lease_test.rb +36 -36
- data/test/integration/blob/lease/break_lease_test.rb +40 -40
- data/test/integration/blob/lease/release_lease_test.rb +40 -40
- data/test/integration/blob/lease/renew_lease_test.rb +42 -42
- data/test/integration/blob/list_blobs_test.rb +113 -113
- data/test/integration/cloud_service/Cloud_Create_test.rb +44 -44
- data/test/integration/cloud_service/Cloud_Delete_test.rb +44 -44
- data/test/integration/database/create_sql_server_firewall_test.rb +86 -86
- data/test/integration/database/create_sql_server_test.rb +53 -53
- data/test/integration/database/delete_sql_server_firewall_test.rb +70 -70
- data/test/integration/database/delete_sql_server_test.rb +58 -58
- data/test/integration/database/list_sql_server_firewall_test.rb +45 -45
- data/test/integration/database/list_sql_servers_test.rb +44 -44
- data/test/integration/database/reset_password_sql_server_test.rb +55 -55
- data/test/integration/location/Location_List_test.rb +39 -39
- data/test/integration/queue/clear_messages_test.rb +42 -42
- data/test/integration/queue/create_message_test.rb +75 -75
- data/test/integration/queue/create_queue_test.rb +50 -50
- data/test/integration/queue/delete_message_test.rb +67 -67
- data/test/integration/queue/delete_queue_test.rb +45 -45
- data/test/integration/queue/informative_errors_test.rb +41 -41
- data/test/integration/queue/list_messages_encoded_test.rb +79 -79
- data/test/integration/queue/list_messages_test.rb +79 -79
- data/test/integration/queue/list_queues_test.rb +44 -44
- data/test/integration/queue/peek_messages_test.rb +59 -59
- data/test/integration/queue/queue_gb18030_test.rb +131 -131
- data/test/integration/queue/queue_metadata_test.rb +40 -40
- data/test/integration/queue/update_message_test.rb +74 -74
- data/test/integration/service_bus/informative_errors_test.rb +36 -36
- data/test/integration/service_bus/queues_scenario_test.rb +200 -200
- data/test/integration/service_bus/queues_test.rb +265 -265
- data/test/integration/service_bus/relay_test.rb +131 -131
- data/test/integration/service_bus/rules_test.rb +144 -144
- data/test/integration/service_bus/sb_queue_gb18030_test.rb +182 -182
- data/test/integration/service_bus/scenario_test.rb +101 -101
- data/test/integration/service_bus/subscriptions_test.rb +211 -211
- data/test/integration/service_bus/topics_scenario_test.rb +406 -406
- data/test/integration/service_bus/topics_test.rb +129 -129
- data/test/integration/storage_management/storage_management_test.rb +160 -160
- data/test/integration/table/create_table_test.rb +35 -35
- data/test/integration/table/delete_entity_batch_test.rb +106 -106
- data/test/integration/table/delete_entity_test.rb +93 -93
- data/test/integration/table/delete_table_test.rb +39 -39
- data/test/integration/table/get_table_test.rb +36 -36
- data/test/integration/table/informative_errors_test.rb +38 -38
- data/test/integration/table/insert_entity_batch_test.rb +99 -99
- data/test/integration/table/insert_entity_test.rb +87 -87
- data/test/integration/table/insert_or_merge_entity_batch_test.rb +158 -158
- data/test/integration/table/insert_or_merge_entity_test.rb +142 -142
- data/test/integration/table/insert_or_replace_entity_batch_test.rb +151 -151
- data/test/integration/table/insert_or_replace_entity_test.rb +136 -136
- data/test/integration/table/merge_entity_batch_test.rb +127 -127
- data/test/integration/table/merge_entity_test.rb +112 -112
- data/test/integration/table/query_entities_test.rb +194 -194
- data/test/integration/table/query_tables_test.rb +42 -42
- data/test/integration/table/query_test.rb +250 -250
- data/test/integration/table/table_acl_test.rb +51 -51
- data/test/integration/table/table_gb18030_test.rb +355 -355
- data/test/integration/table/update_entity_batch_test.rb +148 -148
- data/test/integration/table/update_entity_test.rb +130 -130
- data/test/integration/test_helper.rb +42 -42
- data/test/integration/vm/VM_Create_test.rb +260 -260
- data/test/integration/vm/VM_Delete_test.rb +55 -55
- data/test/integration/vm/VM_Operations_test.rb +173 -173
- data/test/integration/vm_image/virtual_machine_disk_test.rb +37 -37
- data/test/integration/vm_image/virtual_machine_image_test.rb +36 -36
- data/test/integration/vnet/Virtual_Network_Create_test.rb +122 -122
- data/test/integration/vnet/Virtual_Network_list_test.rb +53 -53
- data/test/support/env.rb +19 -19
- data/test/support/fixtures.rb +36 -36
- data/test/support/name_generator.rb +168 -168
- data/test/support/stubs.rb +42 -42
- data/test/support/virtual_machine_name_generator.rb +102 -102
- data/test/support/virtual_network_helper.rb +73 -73
- data/test/test_helper.rb +53 -53
- data/test/unit/affinity_group/affinity_group_test.rb +192 -192
- data/test/unit/affinity_group/serialization_test.rb +88 -88
- data/test/unit/base_management/location_test.rb +57 -57
- data/test/unit/blob/blob_service_test.rb +1946 -1946
- data/test/unit/cloud_service_management/cloud_service_management_service_test.rb +94 -94
- data/test/unit/cloud_service_management/serialization_test.rb +169 -169
- data/test/unit/core/auth/shared_key_lite_test.rb +51 -51
- data/test/unit/core/auth/shared_key_test.rb +58 -58
- data/test/unit/core/auth/signer_test.rb +30 -30
- data/test/unit/core/http/http_error_test.rb +57 -57
- data/test/unit/core/http/http_request_test.rb +66 -66
- data/test/unit/core/http/http_response_test.rb +45 -45
- data/test/unit/core/http/retry_policy_test.rb +23 -23
- data/test/unit/database/serialization_test.rb +97 -97
- data/test/unit/database/sql_database_server_service_test.rb +288 -288
- data/test/unit/service/serialization_test.rb +532 -532
- data/test/unit/service/storage_service_test.rb +292 -292
- data/test/unit/storage_management/serialization_test.rb +232 -232
- data/test/unit/storage_management/storage_management_service_test.rb +261 -261
- data/test/unit/table/edmtype_test.rb +107 -107
- data/test/unit/virtual_machine_image_management/serialization_test.rb +35 -35
- data/test/unit/virtual_machine_image_management/virtual_machine_image_management_service_test.rb +65 -65
- data/test/unit/virtual_machine_management/serialization_test.rb +258 -258
- data/test/unit/virtual_machine_management/virtual_machine_management_service_test.rb +440 -440
- data/test/unit/vnet/serialization_test.rb +187 -187
- data/test/unit/vnet/virtual_network_management_service_test.rb +131 -131
- metadata +34 -27
@@ -1,32 +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 BaseManagement
|
17
|
-
# Represents an AffinityGroup
|
18
|
-
class AffinityGroup
|
19
|
-
def initialize
|
20
|
-
yield self if block_given?
|
21
|
-
end
|
22
|
-
|
23
|
-
attr_accessor :name
|
24
|
-
attr_accessor :label
|
25
|
-
attr_accessor :description
|
26
|
-
attr_accessor :location
|
27
|
-
attr_accessor :hosted_services
|
28
|
-
attr_accessor :storage_services
|
29
|
-
attr_accessor :capability
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
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 BaseManagement
|
17
|
+
# Represents an AffinityGroup
|
18
|
+
class AffinityGroup
|
19
|
+
def initialize
|
20
|
+
yield self if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_accessor :name
|
24
|
+
attr_accessor :label
|
25
|
+
attr_accessor :description
|
26
|
+
attr_accessor :location
|
27
|
+
attr_accessor :hosted_services
|
28
|
+
attr_accessor :storage_services
|
29
|
+
attr_accessor :capability
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,304 +1,304 @@
|
|
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 'rubygems'
|
16
|
-
require 'nokogiri'
|
17
|
-
require 'base64'
|
18
|
-
require 'openssl'
|
19
|
-
require 'uri'
|
20
|
-
require 'rexml/document'
|
21
|
-
require 'azure/base_management/serialization'
|
22
|
-
require 'azure/base_management/location'
|
23
|
-
require 'azure/base_management/affinity_group'
|
24
|
-
|
25
|
-
include Azure::BaseManagement
|
26
|
-
include Azure::Core::Utility
|
27
|
-
Loggerx = Azure::Core::Logger
|
28
|
-
|
29
|
-
module Azure
|
30
|
-
module BaseManagement
|
31
|
-
class BaseManagementService
|
32
|
-
def initialize
|
33
|
-
validate_configuration
|
34
|
-
certificate_key, private_key = read_management_certificate(Azure.config.management_certificate)
|
35
|
-
Azure.configure do |config|
|
36
|
-
config.http_certificate_key = certificate_key
|
37
|
-
config.http_private_key = private_key
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def validate_configuration
|
42
|
-
subs_id = Azure.config.subscription_id
|
43
|
-
error_message = 'Subscription ID not valid.'
|
44
|
-
raise error_message if subs_id.nil? || subs_id.empty?
|
45
|
-
|
46
|
-
m_ep = Azure.config.management_endpoint
|
47
|
-
error_message = 'Management endpoint not valid.'
|
48
|
-
raise error_message if m_ep.nil? || m_ep.empty?
|
49
|
-
|
50
|
-
m_cert = Azure.config.management_certificate
|
51
|
-
if m_cert.is_a?(Hash)
|
52
|
-
error_message = "Management certificate hash #{m_cert} does not have key :type! If specifying a hash, you must specify :type => <:pem, :pfx or :publishsettings>!"
|
53
|
-
raise error_message unless m_cert.has_key?(:type) && %w(pem pfx publishsettings).include?(m_cert[:type].to_s)
|
54
|
-
|
55
|
-
error_message = "Management certificate hash #{m_cert} does not have the certificate data! If specifying a hash, you must specify either :data => String, :io => <IO object> or :path => <path>!"
|
56
|
-
raise error_message unless [ :data, :io, :path ].any? { |k| m_cert.has_key?(k) }
|
57
|
-
|
58
|
-
unexpected_keys = m_cert.keys - [ :type, :data, :io, :path ]
|
59
|
-
error_message = "Management certificate hash #{m_cert} has unexpected keys #{unexpected_keys.join(", ")}! Only :type, :data, :io and :path are accepted values when specifying a hash."
|
60
|
-
raise error_message unless unexpected_keys.empty?
|
61
|
-
|
62
|
-
if m_cert[:data]
|
63
|
-
error_message= "Management certificate :data in #{m_cert} is not a String! Must be a String."
|
64
|
-
raise error_message unless m_cert[:data].is_a?(String)
|
65
|
-
end
|
66
|
-
if m_cert[:io]
|
67
|
-
error_message= "Management certificate :io in #{m_cert} is not an IO object! Must be an IO object."
|
68
|
-
raise error_message unless m_cert[:io].is_a?(IO)
|
69
|
-
end
|
70
|
-
if m_cert[:path]
|
71
|
-
error_message= "Management certificate :path in #{m_cert} is not a String! Must be a String."
|
72
|
-
raise error_message unless m_cert[:path].is_a?(String)
|
73
|
-
unless m_cert[:data] || m_cert[:io] # :path is only used to print information out if data or IO is there
|
74
|
-
error_message = "Could not read from file '#{m_cert[:path]}'."
|
75
|
-
raise error_message unless test('r', m_cert[:data])
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
else
|
80
|
-
m_cert_ext = File.extname(m_cert)
|
81
|
-
error_message = "Management certificate path '#{m_cert}' must have extension .pem, .pfx or .publishsettings"
|
82
|
-
raise error_message unless %w(.pem .pfx .publishsettings).include?(m_cert_ext)
|
83
|
-
|
84
|
-
error_message = "Could not read from file '#{m_cert}'."
|
85
|
-
raise error_message unless test('r', m_cert)
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
# Public: Gets a list of regional data center locations from the server
|
91
|
-
#
|
92
|
-
# Returns an array of Azure::BaseManagement::Location objects
|
93
|
-
def list_locations
|
94
|
-
request = ManagementHttpRequest.new(:get, '/locations')
|
95
|
-
response = request.call
|
96
|
-
Serialization.locations_from_xml(response)
|
97
|
-
end
|
98
|
-
|
99
|
-
# Public: Gets a lists the affinity groups associated with
|
100
|
-
# the specified subscription.
|
101
|
-
#
|
102
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460797.aspx
|
103
|
-
#
|
104
|
-
# Returns an array of Azure::BaseManagement::AffinityGroup objects
|
105
|
-
def list_affinity_groups
|
106
|
-
request_path = '/affinitygroups'
|
107
|
-
request = ManagementHttpRequest.new(:get, request_path, nil)
|
108
|
-
response = request.call
|
109
|
-
Serialization.affinity_groups_from_xml(response)
|
110
|
-
end
|
111
|
-
|
112
|
-
# Public: Creates a new affinity group for the specified subscription.
|
113
|
-
#
|
114
|
-
# ==== Attributes
|
115
|
-
#
|
116
|
-
# * +name+ - String. Affinity Group name.
|
117
|
-
# * +location+ - String. The location where the affinity group will
|
118
|
-
# be created.
|
119
|
-
# * +label+ - String. Name for the affinity specified as a
|
120
|
-
# base-64 encoded string.
|
121
|
-
#
|
122
|
-
# ==== Options
|
123
|
-
#
|
124
|
-
# Accepted key/value pairs are:
|
125
|
-
# * +:description+ - String. A description for the affinity group.
|
126
|
-
# (optional)
|
127
|
-
#
|
128
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715317.aspx
|
129
|
-
#
|
130
|
-
# Returns: None
|
131
|
-
def create_affinity_group(name, location, label, options = {})
|
132
|
-
if name.nil? || name.strip.empty?
|
133
|
-
raise 'Affinity Group name cannot be empty'
|
134
|
-
elsif list_affinity_groups.map(&:name).include?(name)
|
135
|
-
raise Azure::Error::Error.new(
|
136
|
-
'ConflictError',
|
137
|
-
409,
|
138
|
-
"An affinity group #{name}"\
|
139
|
-
" already exists in the current subscription."
|
140
|
-
)
|
141
|
-
else
|
142
|
-
validate_location(location)
|
143
|
-
body = Serialization.affinity_group_to_xml(name,
|
144
|
-
location,
|
145
|
-
label,
|
146
|
-
options)
|
147
|
-
request_path = '/affinitygroups'
|
148
|
-
request = ManagementHttpRequest.new(:post, request_path, body)
|
149
|
-
request.call
|
150
|
-
Loggerx.info "Affinity Group #{name} is created."
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
# Public: updates the label and/or the description for an affinity group
|
155
|
-
# for the specified subscription.
|
156
|
-
#
|
157
|
-
# ==== Attributes
|
158
|
-
#
|
159
|
-
# * +name+ - String. Affinity Group name.
|
160
|
-
# * +label+ - String. Name for the affinity specified as a
|
161
|
-
# base-64 encoded string.
|
162
|
-
#
|
163
|
-
# ==== Options
|
164
|
-
#
|
165
|
-
# Accepted key/value pairs are:
|
166
|
-
# * +:description+ - String. A description for the affinity group.
|
167
|
-
# (optional)
|
168
|
-
#
|
169
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715316.aspx
|
170
|
-
#
|
171
|
-
# Returns: None
|
172
|
-
def update_affinity_group(name, label, options = {})
|
173
|
-
raise 'Label name cannot be empty' if label.nil? || label.empty?
|
174
|
-
if affinity_group(name)
|
175
|
-
body = Serialization.resource_to_xml(label, options)
|
176
|
-
request_path = "/affinitygroups/#{name}"
|
177
|
-
request = ManagementHttpRequest.new(:put, request_path, body)
|
178
|
-
request.call
|
179
|
-
Loggerx.info "Affinity Group #{name} is updated."
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
# Public: Deletes an affinity group in the specified subscription
|
184
|
-
#
|
185
|
-
# ==== Attributes
|
186
|
-
#
|
187
|
-
# * +name+ - String. Affinity Group name.
|
188
|
-
#
|
189
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715314.aspx
|
190
|
-
#
|
191
|
-
# Returns: None
|
192
|
-
def delete_affinity_group(name)
|
193
|
-
if affinity_group(name)
|
194
|
-
request_path = "/affinitygroups/#{name}"
|
195
|
-
request = ManagementHttpRequest.new(:delete, request_path)
|
196
|
-
request.call
|
197
|
-
Loggerx.info "Deleted affinity group #{name}."
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
# Public: returns the system properties associated with the specified
|
202
|
-
# affinity group.
|
203
|
-
#
|
204
|
-
# ==== Attributes
|
205
|
-
#
|
206
|
-
# * +name+ - String. Affinity Group name.
|
207
|
-
#
|
208
|
-
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460789.aspx
|
209
|
-
#
|
210
|
-
# Returns: Azure::BaseManagement::AffinityGroup object
|
211
|
-
def get_affinity_group(name)
|
212
|
-
if affinity_group(name)
|
213
|
-
request_path = "/affinitygroups/#{name}"
|
214
|
-
request = ManagementHttpRequest.new(:get, request_path)
|
215
|
-
response = request.call
|
216
|
-
Serialization.affinity_group_from_xml(response)
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
private
|
221
|
-
|
222
|
-
def affinity_group(affinity_group_name)
|
223
|
-
if affinity_group_name.nil? ||\
|
224
|
-
affinity_group_name.empty? ||\
|
225
|
-
!list_affinity_groups.map { |x| x.name.downcase }.include?(
|
226
|
-
affinity_group_name.downcase
|
227
|
-
)
|
228
|
-
error = Azure::Error::Error.new('AffinityGroupNotFound',
|
229
|
-
404,
|
230
|
-
'The affinity group does not exist.')
|
231
|
-
raise error
|
232
|
-
else
|
233
|
-
true
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
def validate_location(location_name)
|
238
|
-
base_mgmt_service = Azure::BaseManagementService.new
|
239
|
-
locations = base_mgmt_service.list_locations.map(&:name)
|
240
|
-
unless locations.map(&:downcase).include?(location_name.downcase)
|
241
|
-
error = "Value '#{location_name}' specified for parameter"\
|
242
|
-
" 'location' is invalid."\
|
243
|
-
" Allowed values are #{locations.join(',')}"
|
244
|
-
raise error
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
def read_management_certificate(cert)
|
249
|
-
cert_file = nil
|
250
|
-
begin
|
251
|
-
# If it's a String, the type is the extension (.pem, .pfx, .publishsettings)
|
252
|
-
if cert.is_a?(String)
|
253
|
-
cert = {
|
254
|
-
type: File.extname(cert).split('.').last,
|
255
|
-
path: cert
|
256
|
-
}
|
257
|
-
end
|
258
|
-
|
259
|
-
case cert[:type].to_sym
|
260
|
-
when :pem
|
261
|
-
read_pem(cert)
|
262
|
-
when :pfx
|
263
|
-
read_pfx(cert)
|
264
|
-
when :publishsettings
|
265
|
-
read_publishsettings(cert)
|
266
|
-
else
|
267
|
-
raise ArgumentError, "Unknown type #{type} on Azure.config.management_certificate #{cert}"
|
268
|
-
end
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
def read_pem(cert)
|
273
|
-
cert[:data] ||= cert[:io] ? cert[:io].read : File.open(cert[:path], "r") { |f| f.read }
|
274
|
-
|
275
|
-
certificate_key = OpenSSL::X509::Certificate.new(cert[:data])
|
276
|
-
private_key = OpenSSL::PKey::RSA.new(cert[:data])
|
277
|
-
[ certificate_key, private_key ]
|
278
|
-
end
|
279
|
-
|
280
|
-
def read_pfx(cert)
|
281
|
-
cert[:data] ||= cert[:io] ? cert[:io].read : File.open(cert[:path], "rb") { |f| f.read }
|
282
|
-
|
283
|
-
cert_content = OpenSSL::PKCS12.new(Base64.decode64(cert[:data]))
|
284
|
-
certificate_key = OpenSSL::X509::Certificate.new(
|
285
|
-
cert_content.certificate.to_pem
|
286
|
-
)
|
287
|
-
private_key = OpenSSL::PKey::RSA.new(cert_content.key.to_pem)
|
288
|
-
[ certificate_key, private_key ]
|
289
|
-
end
|
290
|
-
|
291
|
-
def read_publishsettings(cert)
|
292
|
-
cert[:io] ||= cert[:data] ? StringIO.new(cert[:data]) : File.open(cert[:path], "r")
|
293
|
-
|
294
|
-
# Parse publishsettings content
|
295
|
-
publish_settings = Nokogiri::XML(cert[:io])
|
296
|
-
subscription_id = Azure.config.subscription_id
|
297
|
-
xpath = "//PublishData/PublishProfile/Subscription[@Id='#{subscription_id}']/@ManagementCertificate"
|
298
|
-
cert_file = publish_settings.xpath(xpath).text
|
299
|
-
|
300
|
-
read_pfx(data: cert_file, path: cert[:path])
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
end
|
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 'rubygems'
|
16
|
+
require 'nokogiri'
|
17
|
+
require 'base64'
|
18
|
+
require 'openssl'
|
19
|
+
require 'uri'
|
20
|
+
require 'rexml/document'
|
21
|
+
require 'azure/base_management/serialization'
|
22
|
+
require 'azure/base_management/location'
|
23
|
+
require 'azure/base_management/affinity_group'
|
24
|
+
|
25
|
+
include Azure::BaseManagement
|
26
|
+
include Azure::Core::Utility
|
27
|
+
Loggerx = Azure::Core::Logger
|
28
|
+
|
29
|
+
module Azure
|
30
|
+
module BaseManagement
|
31
|
+
class BaseManagementService
|
32
|
+
def initialize
|
33
|
+
validate_configuration
|
34
|
+
certificate_key, private_key = read_management_certificate(Azure.config.management_certificate)
|
35
|
+
Azure.configure do |config|
|
36
|
+
config.http_certificate_key = certificate_key
|
37
|
+
config.http_private_key = private_key
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate_configuration
|
42
|
+
subs_id = Azure.config.subscription_id
|
43
|
+
error_message = 'Subscription ID not valid.'
|
44
|
+
raise error_message if subs_id.nil? || subs_id.empty?
|
45
|
+
|
46
|
+
m_ep = Azure.config.management_endpoint
|
47
|
+
error_message = 'Management endpoint not valid.'
|
48
|
+
raise error_message if m_ep.nil? || m_ep.empty?
|
49
|
+
|
50
|
+
m_cert = Azure.config.management_certificate
|
51
|
+
if m_cert.is_a?(Hash)
|
52
|
+
error_message = "Management certificate hash #{m_cert} does not have key :type! If specifying a hash, you must specify :type => <:pem, :pfx or :publishsettings>!"
|
53
|
+
raise error_message unless m_cert.has_key?(:type) && %w(pem pfx publishsettings).include?(m_cert[:type].to_s)
|
54
|
+
|
55
|
+
error_message = "Management certificate hash #{m_cert} does not have the certificate data! If specifying a hash, you must specify either :data => String, :io => <IO object> or :path => <path>!"
|
56
|
+
raise error_message unless [ :data, :io, :path ].any? { |k| m_cert.has_key?(k) }
|
57
|
+
|
58
|
+
unexpected_keys = m_cert.keys - [ :type, :data, :io, :path ]
|
59
|
+
error_message = "Management certificate hash #{m_cert} has unexpected keys #{unexpected_keys.join(", ")}! Only :type, :data, :io and :path are accepted values when specifying a hash."
|
60
|
+
raise error_message unless unexpected_keys.empty?
|
61
|
+
|
62
|
+
if m_cert[:data]
|
63
|
+
error_message= "Management certificate :data in #{m_cert} is not a String! Must be a String."
|
64
|
+
raise error_message unless m_cert[:data].is_a?(String)
|
65
|
+
end
|
66
|
+
if m_cert[:io]
|
67
|
+
error_message= "Management certificate :io in #{m_cert} is not an IO object! Must be an IO object."
|
68
|
+
raise error_message unless m_cert[:io].is_a?(IO)
|
69
|
+
end
|
70
|
+
if m_cert[:path]
|
71
|
+
error_message= "Management certificate :path in #{m_cert} is not a String! Must be a String."
|
72
|
+
raise error_message unless m_cert[:path].is_a?(String)
|
73
|
+
unless m_cert[:data] || m_cert[:io] # :path is only used to print information out if data or IO is there
|
74
|
+
error_message = "Could not read from file '#{m_cert[:path]}'."
|
75
|
+
raise error_message unless test('r', m_cert[:data])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
else
|
80
|
+
m_cert_ext = File.extname(m_cert)
|
81
|
+
error_message = "Management certificate path '#{m_cert}' must have extension .pem, .pfx or .publishsettings"
|
82
|
+
raise error_message unless %w(.pem .pfx .publishsettings).include?(m_cert_ext)
|
83
|
+
|
84
|
+
error_message = "Could not read from file '#{m_cert}'."
|
85
|
+
raise error_message unless test('r', m_cert)
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
# Public: Gets a list of regional data center locations from the server
|
91
|
+
#
|
92
|
+
# Returns an array of Azure::BaseManagement::Location objects
|
93
|
+
def list_locations
|
94
|
+
request = ManagementHttpRequest.new(:get, '/locations')
|
95
|
+
response = request.call
|
96
|
+
Serialization.locations_from_xml(response)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Public: Gets a lists the affinity groups associated with
|
100
|
+
# the specified subscription.
|
101
|
+
#
|
102
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460797.aspx
|
103
|
+
#
|
104
|
+
# Returns an array of Azure::BaseManagement::AffinityGroup objects
|
105
|
+
def list_affinity_groups
|
106
|
+
request_path = '/affinitygroups'
|
107
|
+
request = ManagementHttpRequest.new(:get, request_path, nil)
|
108
|
+
response = request.call
|
109
|
+
Serialization.affinity_groups_from_xml(response)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Public: Creates a new affinity group for the specified subscription.
|
113
|
+
#
|
114
|
+
# ==== Attributes
|
115
|
+
#
|
116
|
+
# * +name+ - String. Affinity Group name.
|
117
|
+
# * +location+ - String. The location where the affinity group will
|
118
|
+
# be created.
|
119
|
+
# * +label+ - String. Name for the affinity specified as a
|
120
|
+
# base-64 encoded string.
|
121
|
+
#
|
122
|
+
# ==== Options
|
123
|
+
#
|
124
|
+
# Accepted key/value pairs are:
|
125
|
+
# * +:description+ - String. A description for the affinity group.
|
126
|
+
# (optional)
|
127
|
+
#
|
128
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715317.aspx
|
129
|
+
#
|
130
|
+
# Returns: None
|
131
|
+
def create_affinity_group(name, location, label, options = {})
|
132
|
+
if name.nil? || name.strip.empty?
|
133
|
+
raise 'Affinity Group name cannot be empty'
|
134
|
+
elsif list_affinity_groups.map(&:name).include?(name)
|
135
|
+
raise Azure::Error::Error.new(
|
136
|
+
'ConflictError',
|
137
|
+
409,
|
138
|
+
"An affinity group #{name}"\
|
139
|
+
" already exists in the current subscription."
|
140
|
+
)
|
141
|
+
else
|
142
|
+
validate_location(location)
|
143
|
+
body = Serialization.affinity_group_to_xml(name,
|
144
|
+
location,
|
145
|
+
label,
|
146
|
+
options)
|
147
|
+
request_path = '/affinitygroups'
|
148
|
+
request = ManagementHttpRequest.new(:post, request_path, body)
|
149
|
+
request.call
|
150
|
+
Loggerx.info "Affinity Group #{name} is created."
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# Public: updates the label and/or the description for an affinity group
|
155
|
+
# for the specified subscription.
|
156
|
+
#
|
157
|
+
# ==== Attributes
|
158
|
+
#
|
159
|
+
# * +name+ - String. Affinity Group name.
|
160
|
+
# * +label+ - String. Name for the affinity specified as a
|
161
|
+
# base-64 encoded string.
|
162
|
+
#
|
163
|
+
# ==== Options
|
164
|
+
#
|
165
|
+
# Accepted key/value pairs are:
|
166
|
+
# * +:description+ - String. A description for the affinity group.
|
167
|
+
# (optional)
|
168
|
+
#
|
169
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715316.aspx
|
170
|
+
#
|
171
|
+
# Returns: None
|
172
|
+
def update_affinity_group(name, label, options = {})
|
173
|
+
raise 'Label name cannot be empty' if label.nil? || label.empty?
|
174
|
+
if affinity_group(name)
|
175
|
+
body = Serialization.resource_to_xml(label, options)
|
176
|
+
request_path = "/affinitygroups/#{name}"
|
177
|
+
request = ManagementHttpRequest.new(:put, request_path, body)
|
178
|
+
request.call
|
179
|
+
Loggerx.info "Affinity Group #{name} is updated."
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
# Public: Deletes an affinity group in the specified subscription
|
184
|
+
#
|
185
|
+
# ==== Attributes
|
186
|
+
#
|
187
|
+
# * +name+ - String. Affinity Group name.
|
188
|
+
#
|
189
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/gg715314.aspx
|
190
|
+
#
|
191
|
+
# Returns: None
|
192
|
+
def delete_affinity_group(name)
|
193
|
+
if affinity_group(name)
|
194
|
+
request_path = "/affinitygroups/#{name}"
|
195
|
+
request = ManagementHttpRequest.new(:delete, request_path)
|
196
|
+
request.call
|
197
|
+
Loggerx.info "Deleted affinity group #{name}."
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Public: returns the system properties associated with the specified
|
202
|
+
# affinity group.
|
203
|
+
#
|
204
|
+
# ==== Attributes
|
205
|
+
#
|
206
|
+
# * +name+ - String. Affinity Group name.
|
207
|
+
#
|
208
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/ee460789.aspx
|
209
|
+
#
|
210
|
+
# Returns: Azure::BaseManagement::AffinityGroup object
|
211
|
+
def get_affinity_group(name)
|
212
|
+
if affinity_group(name)
|
213
|
+
request_path = "/affinitygroups/#{name}"
|
214
|
+
request = ManagementHttpRequest.new(:get, request_path)
|
215
|
+
response = request.call
|
216
|
+
Serialization.affinity_group_from_xml(response)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
private
|
221
|
+
|
222
|
+
def affinity_group(affinity_group_name)
|
223
|
+
if affinity_group_name.nil? ||\
|
224
|
+
affinity_group_name.empty? ||\
|
225
|
+
!list_affinity_groups.map { |x| x.name.downcase }.include?(
|
226
|
+
affinity_group_name.downcase
|
227
|
+
)
|
228
|
+
error = Azure::Error::Error.new('AffinityGroupNotFound',
|
229
|
+
404,
|
230
|
+
'The affinity group does not exist.')
|
231
|
+
raise error
|
232
|
+
else
|
233
|
+
true
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def validate_location(location_name)
|
238
|
+
base_mgmt_service = Azure::BaseManagementService.new
|
239
|
+
locations = base_mgmt_service.list_locations.map(&:name)
|
240
|
+
unless locations.map(&:downcase).include?(location_name.downcase)
|
241
|
+
error = "Value '#{location_name}' specified for parameter"\
|
242
|
+
" 'location' is invalid."\
|
243
|
+
" Allowed values are #{locations.join(',')}"
|
244
|
+
raise error
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def read_management_certificate(cert)
|
249
|
+
cert_file = nil
|
250
|
+
begin
|
251
|
+
# If it's a String, the type is the extension (.pem, .pfx, .publishsettings)
|
252
|
+
if cert.is_a?(String)
|
253
|
+
cert = {
|
254
|
+
type: File.extname(cert).split('.').last,
|
255
|
+
path: cert
|
256
|
+
}
|
257
|
+
end
|
258
|
+
|
259
|
+
case cert[:type].to_sym
|
260
|
+
when :pem
|
261
|
+
read_pem(cert)
|
262
|
+
when :pfx
|
263
|
+
read_pfx(cert)
|
264
|
+
when :publishsettings
|
265
|
+
read_publishsettings(cert)
|
266
|
+
else
|
267
|
+
raise ArgumentError, "Unknown type #{type} on Azure.config.management_certificate #{cert}"
|
268
|
+
end
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
def read_pem(cert)
|
273
|
+
cert[:data] ||= cert[:io] ? cert[:io].read : File.open(cert[:path], "r") { |f| f.read }
|
274
|
+
|
275
|
+
certificate_key = OpenSSL::X509::Certificate.new(cert[:data])
|
276
|
+
private_key = OpenSSL::PKey::RSA.new(cert[:data])
|
277
|
+
[ certificate_key, private_key ]
|
278
|
+
end
|
279
|
+
|
280
|
+
def read_pfx(cert)
|
281
|
+
cert[:data] ||= cert[:io] ? cert[:io].read : File.open(cert[:path], "rb") { |f| f.read }
|
282
|
+
|
283
|
+
cert_content = OpenSSL::PKCS12.new(Base64.decode64(cert[:data]))
|
284
|
+
certificate_key = OpenSSL::X509::Certificate.new(
|
285
|
+
cert_content.certificate.to_pem
|
286
|
+
)
|
287
|
+
private_key = OpenSSL::PKey::RSA.new(cert_content.key.to_pem)
|
288
|
+
[ certificate_key, private_key ]
|
289
|
+
end
|
290
|
+
|
291
|
+
def read_publishsettings(cert)
|
292
|
+
cert[:io] ||= cert[:data] ? StringIO.new(cert[:data]) : File.open(cert[:path], "r")
|
293
|
+
|
294
|
+
# Parse publishsettings content
|
295
|
+
publish_settings = Nokogiri::XML(cert[:io])
|
296
|
+
subscription_id = Azure.config.subscription_id
|
297
|
+
xpath = "//PublishData/PublishProfile/Subscription[@Id='#{subscription_id}']/@ManagementCertificate"
|
298
|
+
cert_file = publish_settings.xpath(xpath).text
|
299
|
+
|
300
|
+
read_pfx(data: cert_file, path: cert[:path])
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|