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,113 +1,113 @@
|
|
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 "integration/test_helper"
|
16
|
-
require "azure/blob/blob_service"
|
17
|
-
|
18
|
-
describe Azure::Blob::BlobService do
|
19
|
-
subject { Azure::Blob::BlobService.new }
|
20
|
-
after { TableNameHelper.clean }
|
21
|
-
|
22
|
-
describe '#list_blobs' do
|
23
|
-
let(:container_name) { ContainerNameHelper.name }
|
24
|
-
let(:blob_names) { ["blobname0","blobname1","blobname2","blobname3"] }
|
25
|
-
let(:content) { content = ""; 1024.times.each{|i| content << "@" }; content }
|
26
|
-
let(:metadata) { { "CustomMetadataProperty"=>"CustomMetadataValue" } }
|
27
|
-
let(:options) { { :blob_content_type=>"application/foo", :metadata => metadata } }
|
28
|
-
|
29
|
-
before {
|
30
|
-
subject.create_container container_name
|
31
|
-
blob_names.each { |blob_name|
|
32
|
-
subject.create_block_blob container_name, blob_name, content, options
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
it 'lists the available blobs' do
|
37
|
-
result = subject.list_blobs container_name
|
38
|
-
result.length.must_equal blob_names.length
|
39
|
-
expected_blob_names = blob_names.each
|
40
|
-
result.each { |blob|
|
41
|
-
blob.name.must_equal expected_blob_names.next
|
42
|
-
blob.properties[:content_length].must_equal content.length
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'lists the available blobs with prefix' do
|
47
|
-
result = subject.list_blobs container_name, { :prefix => "blobname0" }
|
48
|
-
result.length.must_equal 1
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'lists the available blobs with max results and marker ' do
|
52
|
-
result = subject.list_blobs container_name, { :max_results => 2 }
|
53
|
-
result.length.must_equal 2
|
54
|
-
first_blob = result[0]
|
55
|
-
result.continuation_token.wont_equal("")
|
56
|
-
|
57
|
-
result = subject.list_blobs container_name, { :max_results => 2, :marker => result.continuation_token }
|
58
|
-
result.length.must_equal 2
|
59
|
-
result[0].name.wont_equal first_blob.name
|
60
|
-
end
|
61
|
-
|
62
|
-
describe 'when options hash is used' do
|
63
|
-
it 'if :metadata is set true, also returns custom metadata for the blobs' do
|
64
|
-
result = subject.list_blobs container_name, { :metadata => true }
|
65
|
-
result.length.must_equal blob_names.length
|
66
|
-
expected_blob_names = blob_names.each
|
67
|
-
|
68
|
-
result.each { |blob|
|
69
|
-
blob.name.must_equal expected_blob_names.next
|
70
|
-
blob.properties[:content_length].must_equal content.length
|
71
|
-
|
72
|
-
metadata.each { |k,v|
|
73
|
-
blob.metadata.must_include k.downcase
|
74
|
-
blob.metadata[k.downcase].must_equal v
|
75
|
-
}
|
76
|
-
}
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'if :snapshots is set true, also returns snapshots' do
|
80
|
-
snapshot = subject.create_blob_snapshot container_name, blob_names[0]
|
81
|
-
|
82
|
-
# verify snapshots aren't returned on a normal call
|
83
|
-
result = subject.list_blobs container_name
|
84
|
-
result.length.must_equal blob_names.length
|
85
|
-
|
86
|
-
result = subject.list_blobs container_name, { :snapshots => true }
|
87
|
-
result.length.must_equal blob_names.length + 1
|
88
|
-
found_snapshot = false
|
89
|
-
result.each { |blob|
|
90
|
-
found_snapshot = true if blob.name == blob_names[0] and blob.snapshot == snapshot
|
91
|
-
}
|
92
|
-
found_snapshot.must_equal true
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'if :uncommittedblobs is set true, also returns blobs with uploaded, uncommitted blocks' do
|
96
|
-
# uncommited blob/block
|
97
|
-
subject.create_blob_block container_name, "blockblobname", "blockid", content
|
98
|
-
|
99
|
-
# verify uncommitted blobs aren't returned on a normal call
|
100
|
-
result = subject.list_blobs container_name
|
101
|
-
result.length.must_equal blob_names.length
|
102
|
-
|
103
|
-
result = subject.list_blobs container_name, { :uncommittedblobs => true }
|
104
|
-
result.length.must_equal blob_names.length + 1
|
105
|
-
found_uncommitted = true
|
106
|
-
result.each { |blob|
|
107
|
-
found_uncommitted = true if blob.name == "blockblobname"
|
108
|
-
}
|
109
|
-
found_uncommitted.must_equal true
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
1
|
+
#-------------------------------------------------------------------------
|
2
|
+
# # Copyright (c) Microsoft and contributors. All rights reserved.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
#--------------------------------------------------------------------------
|
15
|
+
require "integration/test_helper"
|
16
|
+
require "azure/blob/blob_service"
|
17
|
+
|
18
|
+
describe Azure::Blob::BlobService do
|
19
|
+
subject { Azure::Blob::BlobService.new }
|
20
|
+
after { TableNameHelper.clean }
|
21
|
+
|
22
|
+
describe '#list_blobs' do
|
23
|
+
let(:container_name) { ContainerNameHelper.name }
|
24
|
+
let(:blob_names) { ["blobname0","blobname1","blobname2","blobname3"] }
|
25
|
+
let(:content) { content = ""; 1024.times.each{|i| content << "@" }; content }
|
26
|
+
let(:metadata) { { "CustomMetadataProperty"=>"CustomMetadataValue" } }
|
27
|
+
let(:options) { { :blob_content_type=>"application/foo", :metadata => metadata } }
|
28
|
+
|
29
|
+
before {
|
30
|
+
subject.create_container container_name
|
31
|
+
blob_names.each { |blob_name|
|
32
|
+
subject.create_block_blob container_name, blob_name, content, options
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
it 'lists the available blobs' do
|
37
|
+
result = subject.list_blobs container_name
|
38
|
+
result.length.must_equal blob_names.length
|
39
|
+
expected_blob_names = blob_names.each
|
40
|
+
result.each { |blob|
|
41
|
+
blob.name.must_equal expected_blob_names.next
|
42
|
+
blob.properties[:content_length].must_equal content.length
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'lists the available blobs with prefix' do
|
47
|
+
result = subject.list_blobs container_name, { :prefix => "blobname0" }
|
48
|
+
result.length.must_equal 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'lists the available blobs with max results and marker ' do
|
52
|
+
result = subject.list_blobs container_name, { :max_results => 2 }
|
53
|
+
result.length.must_equal 2
|
54
|
+
first_blob = result[0]
|
55
|
+
result.continuation_token.wont_equal("")
|
56
|
+
|
57
|
+
result = subject.list_blobs container_name, { :max_results => 2, :marker => result.continuation_token }
|
58
|
+
result.length.must_equal 2
|
59
|
+
result[0].name.wont_equal first_blob.name
|
60
|
+
end
|
61
|
+
|
62
|
+
describe 'when options hash is used' do
|
63
|
+
it 'if :metadata is set true, also returns custom metadata for the blobs' do
|
64
|
+
result = subject.list_blobs container_name, { :metadata => true }
|
65
|
+
result.length.must_equal blob_names.length
|
66
|
+
expected_blob_names = blob_names.each
|
67
|
+
|
68
|
+
result.each { |blob|
|
69
|
+
blob.name.must_equal expected_blob_names.next
|
70
|
+
blob.properties[:content_length].must_equal content.length
|
71
|
+
|
72
|
+
metadata.each { |k,v|
|
73
|
+
blob.metadata.must_include k.downcase
|
74
|
+
blob.metadata[k.downcase].must_equal v
|
75
|
+
}
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'if :snapshots is set true, also returns snapshots' do
|
80
|
+
snapshot = subject.create_blob_snapshot container_name, blob_names[0]
|
81
|
+
|
82
|
+
# verify snapshots aren't returned on a normal call
|
83
|
+
result = subject.list_blobs container_name
|
84
|
+
result.length.must_equal blob_names.length
|
85
|
+
|
86
|
+
result = subject.list_blobs container_name, { :snapshots => true }
|
87
|
+
result.length.must_equal blob_names.length + 1
|
88
|
+
found_snapshot = false
|
89
|
+
result.each { |blob|
|
90
|
+
found_snapshot = true if blob.name == blob_names[0] and blob.snapshot == snapshot
|
91
|
+
}
|
92
|
+
found_snapshot.must_equal true
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'if :uncommittedblobs is set true, also returns blobs with uploaded, uncommitted blocks' do
|
96
|
+
# uncommited blob/block
|
97
|
+
subject.create_blob_block container_name, "blockblobname", "blockid", content
|
98
|
+
|
99
|
+
# verify uncommitted blobs aren't returned on a normal call
|
100
|
+
result = subject.list_blobs container_name
|
101
|
+
result.length.must_equal blob_names.length
|
102
|
+
|
103
|
+
result = subject.list_blobs container_name, { :uncommittedblobs => true }
|
104
|
+
result.length.must_equal blob_names.length + 1
|
105
|
+
found_uncommitted = true
|
106
|
+
result.each { |blob|
|
107
|
+
found_uncommitted = true if blob.name == "blockblobname"
|
108
|
+
}
|
109
|
+
found_uncommitted.must_equal true
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,44 +1,44 @@
|
|
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 'integration/test_helper'
|
16
|
-
|
17
|
-
describe Azure::CloudServiceManagementService do
|
18
|
-
|
19
|
-
subject { Azure::CloudServiceManagementService.new }
|
20
|
-
let(:options) do
|
21
|
-
{
|
22
|
-
location: 'West US',
|
23
|
-
description: 'Test'
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
before do
|
28
|
-
Loggerx.expects(:puts).returns(nil).at_least(0)
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#create_cloud_service' do
|
32
|
-
before do
|
33
|
-
@cloud_name = random_string('test-service-cloud', 10)
|
34
|
-
subject.create_cloud_service(@cloud_name, options)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'Creates a new cloud service in Windows Azure.' do
|
38
|
-
cloud_service = subject.get_cloud_service_properties(@cloud_name)
|
39
|
-
assert cloud_service.name, @cloud_name
|
40
|
-
assert cloud_service.location, options[:location]
|
41
|
-
assert cloud_service.virtual_machines, Hash.new
|
42
|
-
end
|
43
|
-
end
|
44
|
-
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 'integration/test_helper'
|
16
|
+
|
17
|
+
describe Azure::CloudServiceManagementService do
|
18
|
+
|
19
|
+
subject { Azure::CloudServiceManagementService.new }
|
20
|
+
let(:options) do
|
21
|
+
{
|
22
|
+
location: 'West US',
|
23
|
+
description: 'Test'
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
before do
|
28
|
+
Loggerx.expects(:puts).returns(nil).at_least(0)
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#create_cloud_service' do
|
32
|
+
before do
|
33
|
+
@cloud_name = random_string('test-service-cloud', 10)
|
34
|
+
subject.create_cloud_service(@cloud_name, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'Creates a new cloud service in Windows Azure.' do
|
38
|
+
cloud_service = subject.get_cloud_service_properties(@cloud_name)
|
39
|
+
assert cloud_service.name, @cloud_name
|
40
|
+
assert cloud_service.location, options[:location]
|
41
|
+
assert cloud_service.virtual_machines, Hash.new
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,44 +1,44 @@
|
|
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 'integration/test_helper'
|
16
|
-
|
17
|
-
describe Azure::CloudServiceManagementService do
|
18
|
-
|
19
|
-
subject { Azure::CloudServiceManagementService.new }
|
20
|
-
|
21
|
-
let(:options) do
|
22
|
-
{
|
23
|
-
location: 'West US',
|
24
|
-
description: 'Test'
|
25
|
-
}
|
26
|
-
end
|
27
|
-
|
28
|
-
before do
|
29
|
-
Loggerx.expects(:puts).returns(nil).at_least(0)
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#delete_cloud_service' do
|
33
|
-
before do
|
34
|
-
@cloud_name = random_string('test-service-cloud', 10)
|
35
|
-
subject.create_cloud_service(@cloud_name, options)
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'Deletes the cloud service in Windows Azure.' do
|
39
|
-
subject.delete_cloud_service(@cloud_name)
|
40
|
-
present = subject.get_cloud_service(@cloud_name)
|
41
|
-
assert_equal present, false
|
42
|
-
end
|
43
|
-
end
|
44
|
-
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 'integration/test_helper'
|
16
|
+
|
17
|
+
describe Azure::CloudServiceManagementService do
|
18
|
+
|
19
|
+
subject { Azure::CloudServiceManagementService.new }
|
20
|
+
|
21
|
+
let(:options) do
|
22
|
+
{
|
23
|
+
location: 'West US',
|
24
|
+
description: 'Test'
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
before do
|
29
|
+
Loggerx.expects(:puts).returns(nil).at_least(0)
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#delete_cloud_service' do
|
33
|
+
before do
|
34
|
+
@cloud_name = random_string('test-service-cloud', 10)
|
35
|
+
subject.create_cloud_service(@cloud_name, options)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'Deletes the cloud service in Windows Azure.' do
|
39
|
+
subject.delete_cloud_service(@cloud_name)
|
40
|
+
present = subject.get_cloud_service(@cloud_name)
|
41
|
+
assert_equal present, false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,86 +1,86 @@
|
|
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 "integration/test_helper"
|
16
|
-
|
17
|
-
describe Azure::SqlDatabaseManagementService do
|
18
|
-
|
19
|
-
subject { Azure::SqlDatabaseManagementService.new }
|
20
|
-
let(:login_name) {'ms_open_tech'}
|
21
|
-
let(:sql_server) { subject.create_server(login_name, 'User1@123', WindowsImageLocation) }
|
22
|
-
|
23
|
-
describe "#set_sql_server_firewall_rule" do
|
24
|
-
|
25
|
-
before {
|
26
|
-
Loggerx.expects(:puts).returns(nil).at_least(0)
|
27
|
-
}
|
28
|
-
|
29
|
-
after {
|
30
|
-
subject.delete_server(sql_server.name)
|
31
|
-
}
|
32
|
-
|
33
|
-
it "should adds a new server-level firewall rule for a SQL Database server with requester's IP address." do
|
34
|
-
subject.set_sql_server_firewall_rule(sql_server.name, "rule1")
|
35
|
-
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
36
|
-
sql_server_firewalls.wont_be_nil
|
37
|
-
sql_server_firewalls.must_be_kind_of Array
|
38
|
-
sql_server_firewalls.first.must_be_kind_of Hash
|
39
|
-
sql_server_firewalls.size.must_equal 1
|
40
|
-
firewall = sql_server_firewalls.first
|
41
|
-
firewall[:rule].must_equal 'rule1'
|
42
|
-
firewall[:end_ip_address].wont_be_nil
|
43
|
-
firewall[:start_ip_address].wont_be_nil
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should adds a new server-level firewall rule for a SQL Database server with given IP range." do
|
47
|
-
ip_range = {:start_ip_address => "10.20.30.0", :end_ip_address => "10.20.30.255"}
|
48
|
-
subject.set_sql_server_firewall_rule(sql_server.name, "rule2", ip_range)
|
49
|
-
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
50
|
-
sql_server_firewalls.wont_be_nil
|
51
|
-
sql_server_firewalls.must_be_kind_of Array
|
52
|
-
sql_server_firewalls.first.must_be_kind_of Hash
|
53
|
-
sql_server_firewalls.size.must_equal 1
|
54
|
-
|
55
|
-
firewall = sql_server_firewalls.last
|
56
|
-
firewall[:rule].must_equal 'rule2'
|
57
|
-
firewall[:end_ip_address].must_equal "10.20.30.255"
|
58
|
-
firewall[:start_ip_address].must_equal "10.20.30.0"
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should updates an existing server-level firewall rule for a SQL Database server." do
|
62
|
-
ip_range = {:start_ip_address => "10.20.30.100", :end_ip_address => "10.20.30.150"}
|
63
|
-
subject.set_sql_server_firewall_rule(sql_server.name, "rule2", ip_range)
|
64
|
-
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
65
|
-
firewall = sql_server_firewalls.last
|
66
|
-
sql_server_firewalls.wont_be_nil
|
67
|
-
sql_server_firewalls.must_be_kind_of Array
|
68
|
-
sql_server_firewalls.first.must_be_kind_of Hash
|
69
|
-
sql_server_firewalls.size.must_equal 1
|
70
|
-
|
71
|
-
firewall = sql_server_firewalls.last
|
72
|
-
firewall[:rule].must_equal 'rule2'
|
73
|
-
firewall[:end_ip_address].must_equal "10.20.30.150"
|
74
|
-
firewall[:start_ip_address].must_equal "10.20.30.100"
|
75
|
-
end
|
76
|
-
|
77
|
-
it "errors if the sql server does not exist" do
|
78
|
-
server_name = "unknown-server"
|
79
|
-
exception = assert_raises(Azure::Error::Error) do
|
80
|
-
subject.set_sql_server_firewall_rule(server_name, "rule1")
|
81
|
-
end
|
82
|
-
assert_match(/does not have server #{server_name}./i, exception.message)
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
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 "integration/test_helper"
|
16
|
+
|
17
|
+
describe Azure::SqlDatabaseManagementService do
|
18
|
+
|
19
|
+
subject { Azure::SqlDatabaseManagementService.new }
|
20
|
+
let(:login_name) {'ms_open_tech'}
|
21
|
+
let(:sql_server) { subject.create_server(login_name, 'User1@123', WindowsImageLocation) }
|
22
|
+
|
23
|
+
describe "#set_sql_server_firewall_rule" do
|
24
|
+
|
25
|
+
before {
|
26
|
+
Loggerx.expects(:puts).returns(nil).at_least(0)
|
27
|
+
}
|
28
|
+
|
29
|
+
after {
|
30
|
+
subject.delete_server(sql_server.name)
|
31
|
+
}
|
32
|
+
|
33
|
+
it "should adds a new server-level firewall rule for a SQL Database server with requester's IP address." do
|
34
|
+
subject.set_sql_server_firewall_rule(sql_server.name, "rule1")
|
35
|
+
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
36
|
+
sql_server_firewalls.wont_be_nil
|
37
|
+
sql_server_firewalls.must_be_kind_of Array
|
38
|
+
sql_server_firewalls.first.must_be_kind_of Hash
|
39
|
+
sql_server_firewalls.size.must_equal 1
|
40
|
+
firewall = sql_server_firewalls.first
|
41
|
+
firewall[:rule].must_equal 'rule1'
|
42
|
+
firewall[:end_ip_address].wont_be_nil
|
43
|
+
firewall[:start_ip_address].wont_be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should adds a new server-level firewall rule for a SQL Database server with given IP range." do
|
47
|
+
ip_range = {:start_ip_address => "10.20.30.0", :end_ip_address => "10.20.30.255"}
|
48
|
+
subject.set_sql_server_firewall_rule(sql_server.name, "rule2", ip_range)
|
49
|
+
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
50
|
+
sql_server_firewalls.wont_be_nil
|
51
|
+
sql_server_firewalls.must_be_kind_of Array
|
52
|
+
sql_server_firewalls.first.must_be_kind_of Hash
|
53
|
+
sql_server_firewalls.size.must_equal 1
|
54
|
+
|
55
|
+
firewall = sql_server_firewalls.last
|
56
|
+
firewall[:rule].must_equal 'rule2'
|
57
|
+
firewall[:end_ip_address].must_equal "10.20.30.255"
|
58
|
+
firewall[:start_ip_address].must_equal "10.20.30.0"
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should updates an existing server-level firewall rule for a SQL Database server." do
|
62
|
+
ip_range = {:start_ip_address => "10.20.30.100", :end_ip_address => "10.20.30.150"}
|
63
|
+
subject.set_sql_server_firewall_rule(sql_server.name, "rule2", ip_range)
|
64
|
+
sql_server_firewalls = subject.list_sql_server_firewall_rules(sql_server.name)
|
65
|
+
firewall = sql_server_firewalls.last
|
66
|
+
sql_server_firewalls.wont_be_nil
|
67
|
+
sql_server_firewalls.must_be_kind_of Array
|
68
|
+
sql_server_firewalls.first.must_be_kind_of Hash
|
69
|
+
sql_server_firewalls.size.must_equal 1
|
70
|
+
|
71
|
+
firewall = sql_server_firewalls.last
|
72
|
+
firewall[:rule].must_equal 'rule2'
|
73
|
+
firewall[:end_ip_address].must_equal "10.20.30.150"
|
74
|
+
firewall[:start_ip_address].must_equal "10.20.30.100"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "errors if the sql server does not exist" do
|
78
|
+
server_name = "unknown-server"
|
79
|
+
exception = assert_raises(Azure::Error::Error) do
|
80
|
+
subject.set_sql_server_firewall_rule(server_name, "rule1")
|
81
|
+
end
|
82
|
+
assert_match(/does not have server #{server_name}./i, exception.message)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|