azure 0.0.0 → 0.1.0
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.
- data/Gemfile +3 -0
- data/Gemfile.lock +36 -0
- data/README.md +3 -0
- data/Rakefile +81 -0
- data/azure.gemspec +20 -9
- data/lib/azure.rb +4 -0
- data/lib/azure/atom.rb +170 -0
- data/lib/azure/auth.rb +29 -0
- data/lib/azure/blobs.rb +620 -0
- data/lib/azure/blobs/blob.rb +360 -0
- data/lib/azure/blobs/container.rb +209 -0
- data/lib/azure/blobs/service.rb +396 -0
- data/lib/azure/blobs/shared_access_signature.rb +84 -0
- data/lib/azure/blobs/uri.rb +60 -0
- data/lib/azure/configuration.rb +121 -0
- data/lib/azure/core/auth/shared_key.rb +95 -0
- data/lib/azure/core/auth/shared_key_lite.rb +34 -0
- data/lib/azure/core/collection.rb +118 -0
- data/lib/azure/core/service.rb +43 -0
- data/lib/azure/core/signer.rb +32 -0
- data/lib/azure/core/utils/interval.rb +97 -0
- data/lib/azure/core/utils/queryable.rb +74 -0
- data/lib/azure/core/utils/storage_service_properties.rb +83 -0
- data/lib/azure/core/utils/string.rb +59 -0
- data/lib/azure/error.rb +72 -0
- data/lib/azure/queues.rb +272 -0
- data/lib/azure/queues/message.rb +174 -0
- data/lib/azure/queues/queue.rb +187 -0
- data/lib/azure/queues/service.rb +263 -0
- data/lib/azure/queues/service_properties.rb +152 -0
- data/lib/azure/queues/uri.rb +78 -0
- data/lib/azure/request.rb +102 -0
- data/lib/azure/response.rb +93 -0
- data/lib/azure/service_bus.rb +4 -0
- data/lib/azure/service_bus/auth/authorizer.rb +22 -0
- data/lib/azure/service_bus/auth/uri.rb +52 -0
- data/lib/azure/service_bus/auth/wrap.rb +37 -0
- data/lib/azure/service_bus/auth/wrap_service.rb +76 -0
- data/lib/azure/service_bus/auth/wrap_token.rb +45 -0
- data/lib/azure/service_bus/auth/wrap_token_manager.rb +46 -0
- data/lib/azure/service_bus/brokered_message.rb +139 -0
- data/lib/azure/service_bus/brokered_message_serializer.rb +113 -0
- data/lib/azure/service_bus/queues.rb +194 -0
- data/lib/azure/service_bus/queues/queue.rb +100 -0
- data/lib/azure/service_bus/queues/queue_serializer.rb +51 -0
- data/lib/azure/service_bus/queues/service.rb +154 -0
- data/lib/azure/service_bus/queues/uri.rb +80 -0
- data/lib/azure/service_bus/rules.rb +110 -0
- data/lib/azure/service_bus/rules/rule.rb +97 -0
- data/lib/azure/service_bus/rules/service.rb +122 -0
- data/lib/azure/service_bus/rules/uri.rb +39 -0
- data/lib/azure/service_bus/service_bus_service.rb +22 -0
- data/lib/azure/service_bus/subscriptions.rb +170 -0
- data/lib/azure/service_bus/subscriptions/service.rb +133 -0
- data/lib/azure/service_bus/subscriptions/subscription.rb +164 -0
- data/lib/azure/service_bus/subscriptions/subscription_serializer.rb +74 -0
- data/lib/azure/service_bus/subscriptions/uri.rb +71 -0
- data/lib/azure/service_bus/topics.rb +120 -0
- data/lib/azure/service_bus/topics/service.rb +98 -0
- data/lib/azure/service_bus/topics/topic.rb +122 -0
- data/lib/azure/service_bus/topics/topic_serializer.rb +44 -0
- data/lib/azure/service_bus/topics/uri.rb +58 -0
- data/lib/azure/service_runtime/client/goal_state_pipe_monitor.rb +21 -0
- data/lib/azure/service_runtime/client/goal_state_protocol.rb +18 -0
- data/lib/azure/service_runtime/client/runtime_client.rb +135 -0
- data/lib/azure/service_runtime/deployment.rb +24 -0
- data/lib/azure/service_runtime/local_resource.rb +15 -0
- data/lib/azure/service_runtime/role.rb +17 -0
- data/lib/azure/service_runtime/role_environment.rb +206 -0
- data/lib/azure/service_runtime/role_environment_change.rb +32 -0
- data/lib/azure/service_runtime/role_instance.rb +35 -0
- data/lib/azure/service_runtime/role_instance_endpoint.rb +14 -0
- data/lib/azure/tables.rb +215 -0
- data/lib/azure/tables/auth/shared_key.rb +71 -0
- data/lib/azure/tables/auth/shared_key_lite.rb +30 -0
- data/lib/azure/tables/entities_collection.rb +66 -0
- data/lib/azure/tables/entity.rb +127 -0
- data/lib/azure/tables/service.rb +211 -0
- data/lib/azure/tables/table.rb +129 -0
- data/lib/azure/tables/tables_collection.rb +62 -0
- data/lib/azure/tables/types.rb +65 -0
- data/lib/azure/tables/uri.rb +62 -0
- data/test/fixtures/32px-fulls-black.jpg +0 -0
- data/test/fixtures/all_containers.xml +20 -0
- data/test/fixtures/all_tables.xml +22 -0
- data/test/fixtures/create_table_response_entry.xml +15 -0
- data/test/fixtures/error.xml +5 -0
- data/test/fixtures/insert_entity_response_entry.xml +25 -0
- data/test/fixtures/messages.xml +12 -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/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/integration/blobs/auth_test.rb +19 -0
- data/test/integration/blobs/blob_test.rb +61 -0
- data/test/integration/blobs/clear_page_range_test.rb +19 -0
- data/test/integration/blobs/copy_test.rb +33 -0
- data/test/integration/blobs/create_blobs_test.rb +51 -0
- data/test/integration/blobs/create_container_test.rb +13 -0
- data/test/integration/blobs/create_snapshot_test.rb +17 -0
- data/test/integration/blobs/delete_blob_snapshots_test.rb +19 -0
- data/test/integration/blobs/delete_blobs_test.rb +25 -0
- data/test/integration/blobs/delete_container_test.rb +24 -0
- data/test/integration/blobs/delete_snapshot_test.rb +17 -0
- data/test/integration/blobs/get_blob_snapshot_test.rb +18 -0
- data/test/integration/blobs/get_blobs_test.rb +31 -0
- data/test/integration/blobs/get_page_range_test.rb +19 -0
- data/test/integration/blobs/list_blobs_test.rb +39 -0
- data/test/integration/blobs/list_containers_test.rb +28 -0
- data/test/integration/blobs/manage_blob_leases_test.rb +45 -0
- data/test/integration/blobs/manage_blob_metadata_test.rb +51 -0
- data/test/integration/blobs/manage_blob_properties_test.rb +25 -0
- data/test/integration/blobs/manage_blob_service_properties_test.rb +38 -0
- data/test/integration/blobs/manage_container_metadata_test.rb +46 -0
- data/test/integration/blobs/manage_container_permissions_test.rb +17 -0
- data/test/integration/blobs/update_page_range_test.rb +20 -0
- data/test/integration/queues/clear_messages_test.rb +22 -0
- data/test/integration/queues/create_queue_test.rb +13 -0
- data/test/integration/queues/delete_message_test.rb +42 -0
- data/test/integration/queues/delete_queue_test.rb +24 -0
- data/test/integration/queues/get_messages_test.rb +39 -0
- data/test/integration/queues/list_queues_test.rb +43 -0
- data/test/integration/queues/manage_queue_metadata_test.rb +45 -0
- data/test/integration/queues/manage_queue_service_properties_test.rb +27 -0
- data/test/integration/queues/peek_messages_test.rb +55 -0
- data/test/integration/queues/put_message_test.rb +31 -0
- data/test/integration/queues/update_message_test.rb +46 -0
- data/test/integration/service_bus/auth_test.rb +18 -0
- data/test/integration/service_bus/queues/create_queue_test.rb +25 -0
- data/test/integration/service_bus/queues/delete_message_from_queue_test.rb +29 -0
- data/test/integration/service_bus/queues/delete_queue_test.rb +25 -0
- data/test/integration/service_bus/queues/get_queue_test.rb +23 -0
- data/test/integration/service_bus/queues/list_queues_test.rb +39 -0
- data/test/integration/service_bus/queues/peek_message_from_queue_test.rb +34 -0
- data/test/integration/service_bus/queues/read_and_delete_message_from_queue_test.rb +31 -0
- data/test/integration/service_bus/queues/send_message_to_queue_test.rb +22 -0
- data/test/integration/service_bus/queues/unlock_message_from_queue_test.rb +36 -0
- data/test/integration/service_bus/rules/create_rule_test.rb +19 -0
- data/test/integration/service_bus/rules/delete_rule_test.rb +17 -0
- data/test/integration/service_bus/rules/get_rule_test.rb +21 -0
- data/test/integration/service_bus/rules/list_rules_test.rb +24 -0
- data/test/integration/service_bus/rules/rule_test.rb +16 -0
- data/test/integration/service_bus/subscriptions/create_subscription_test.rb +25 -0
- data/test/integration/service_bus/subscriptions/delete_message_from_subscription_test.rb +31 -0
- data/test/integration/service_bus/subscriptions/delete_subscription_test.rb +30 -0
- data/test/integration/service_bus/subscriptions/fetch_subscription_test.rb +28 -0
- data/test/integration/service_bus/subscriptions/list_subscriptions_test.rb +23 -0
- data/test/integration/service_bus/subscriptions/peek_lock_message_from_subscription_test.rb +42 -0
- data/test/integration/service_bus/subscriptions/read_delete_message_from_subscription_test.rb +36 -0
- data/test/integration/service_bus/subscriptions/subscription_test.rb +31 -0
- data/test/integration/service_bus/subscriptions/unlock_message_from_subscription_test.rb +43 -0
- data/test/integration/service_bus/topics/create_topic_test.rb +25 -0
- data/test/integration/service_bus/topics/delete_topic_test.rb +25 -0
- data/test/integration/service_bus/topics/get_topic_test.rb +23 -0
- data/test/integration/service_bus/topics/list_topics_test.rb +39 -0
- data/test/integration/service_bus/topics/send_message_to_topic_test.rb +23 -0
- data/test/integration/tables/auth_test.rb +29 -0
- data/test/integration/tables/creating_tables_test.rb +16 -0
- data/test/integration/tables/delete_entity_test.rb +39 -0
- data/test/integration/tables/deleting_table_test.rb +22 -0
- data/test/integration/tables/insert_entity_test.rb +23 -0
- data/test/integration/tables/merge_entity_test.rb +28 -0
- data/test/integration/tables/query_entities_test.rb +131 -0
- data/test/integration/tables/query_tables_test.rb +63 -0
- data/test/integration/tables/update_entity_test.rb +54 -0
- data/test/integration/test_helper.rb +14 -0
- data/test/support/blobs.rb +12 -0
- data/test/support/env.rb +5 -0
- data/test/support/fixtures.rb +22 -0
- data/test/support/stubs.rb +28 -0
- data/test/support/table_names.rb +44 -0
- data/test/test_helper.rb +10 -0
- data/test/unit/atom_test.rb +58 -0
- data/test/unit/auth_test.rb +24 -0
- data/test/unit/blobs/blob_test.rb +5 -0
- data/test/unit/blobs/container_test.rb +67 -0
- data/test/unit/blobs/service_test.rb +17 -0
- data/test/unit/blobs/shared_access_signature_test.rb +66 -0
- data/test/unit/blobs_test.rb +156 -0
- data/test/unit/core/service_test.rb +57 -0
- data/test/unit/core/utils/interval_test.rb +70 -0
- data/test/unit/core/utils/queryable_test.rb +69 -0
- data/test/unit/core/utils/storage_service_properties_test.rb +66 -0
- data/test/unit/error_test.rb +39 -0
- data/test/unit/queues/message_test.rb +40 -0
- data/test/unit/queues/queue_test.rb +64 -0
- data/test/unit/queues/service_properties.rb +35 -0
- data/test/unit/request_test.rb +38 -0
- data/test/unit/response_test.rb +43 -0
- data/test/unit/service_bus/auth/authorizer_test.rb +27 -0
- data/test/unit/service_bus/auth/wrap_token_test.rb +28 -0
- data/test/unit/service_bus/queues/queue_test.rb +38 -0
- data/test/unit/service_bus/topics/topic_test.rb +33 -0
- data/test/unit/service_runtime/data/goalstate.xml +9 -0
- data/test/unit/service_runtime/data/roleenvironmentdata.xml +29 -0
- data/test/unit/service_runtime/data/runtime.xml +6 -0
- data/test/unit/service_runtime/role_environment_test.rb +144 -0
- data/test/unit/tables/auth/shared_key_lite_test.rb +39 -0
- data/test/unit/tables/auth/shared_key_test.rb +45 -0
- data/test/unit/tables/entities_collection_test.rb +39 -0
- data/test/unit/tables/entity_test.rb +72 -0
- data/test/unit/tables/table_test.rb +57 -0
- data/test/unit/tables_test.rb +302 -0
- data/test/unit/types_test.rb +67 -0
- metadata +310 -47
- data/LICENSE +0 -0
- data/README +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
require "nokogiri"
|
|
2
|
+
require "azure/service_bus/subscriptions/subscription"
|
|
3
|
+
|
|
4
|
+
module Azure
|
|
5
|
+
module ServiceBus
|
|
6
|
+
module Subscriptions
|
|
7
|
+
# Public: Serialize a Subscription to/from XML.
|
|
8
|
+
#
|
|
9
|
+
# See http://msdn.microsoft.com/en-us/library/windowsazure/hh780763
|
|
10
|
+
class SubscriptionSerializer
|
|
11
|
+
MAPPINGS = {
|
|
12
|
+
LockDuration: :lock_duration,
|
|
13
|
+
RequiresSession: :requires_session,
|
|
14
|
+
DefaultMessageTimeToLive: :default_ttl,
|
|
15
|
+
DeadLetteringOnMessageExpiration: :keep_expired,
|
|
16
|
+
DeadLetteringOnFilterEvaluationExceptions: :keep_on_errors
|
|
17
|
+
}.freeze
|
|
18
|
+
|
|
19
|
+
# Public: Parse an AtomPub fragment and return a Subscription from it.
|
|
20
|
+
#
|
|
21
|
+
# xml - A String.
|
|
22
|
+
#
|
|
23
|
+
# Returns a Subscription.
|
|
24
|
+
def self.parse(xml)
|
|
25
|
+
body = Nokogiri::XML(xml)
|
|
26
|
+
body.remove_namespaces!
|
|
27
|
+
|
|
28
|
+
name = (body % "title").text
|
|
29
|
+
|
|
30
|
+
Subscription.new(name) do |sub|
|
|
31
|
+
MAPPINGS.each do |tag, method|
|
|
32
|
+
tag = (body % tag.to_s)
|
|
33
|
+
|
|
34
|
+
if sub.respond_to?("#{method}=") && tag
|
|
35
|
+
sub.send("#{method}=", tag.text)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
yield sub if block_given?
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
attr :object
|
|
44
|
+
|
|
45
|
+
# Public: Initialize the serializer
|
|
46
|
+
#
|
|
47
|
+
# subscription - A Subscription.
|
|
48
|
+
def initialize(subscription)
|
|
49
|
+
@subscription = subscription
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Public: Generate an XML that represents the subscription.
|
|
53
|
+
#
|
|
54
|
+
# xml - A Nokogiri::XML::Builder.
|
|
55
|
+
#
|
|
56
|
+
# Returns a String.
|
|
57
|
+
def to_xml(xml=Nokogiri::XML::Builder.new)
|
|
58
|
+
xml.entry(xmlns: "http://www.w3.org/2005/Atom") do |xml|
|
|
59
|
+
xml.content(type: "application/xml") do |xml|
|
|
60
|
+
xml.SubscriptionDescription("xmlns" => "http://schemas.microsoft.com/netservices/2010/10/servicebus/connect", "xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance") do |xml|
|
|
61
|
+
MAPPINGS.each do |tag, method|
|
|
62
|
+
property = @subscription.send(method)
|
|
63
|
+
xml.send(tag, property.to_s) unless property.nil?
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
xml.to_xml
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require "azure/configuration"
|
|
2
|
+
require "uri"
|
|
3
|
+
|
|
4
|
+
module Azure
|
|
5
|
+
module ServiceBus
|
|
6
|
+
module Subscriptions
|
|
7
|
+
module URI
|
|
8
|
+
# Public: Generate the URI for a given subscription.
|
|
9
|
+
#
|
|
10
|
+
# topic_name - The name of the topic.
|
|
11
|
+
# name - The name of the subscription.
|
|
12
|
+
# host - The host of the API.
|
|
13
|
+
#
|
|
14
|
+
# Returns a URI.
|
|
15
|
+
def self.subscription(topic_name, name, host=Azure.config.service_bus_host)
|
|
16
|
+
generate(host, File.join(topic_name, "Subscriptions", name))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Public: Generate the URI for the list of subscriptions.
|
|
20
|
+
#
|
|
21
|
+
# topic_name - The name of the topic.
|
|
22
|
+
# host - The host of the API.
|
|
23
|
+
#
|
|
24
|
+
# Returns a URI.
|
|
25
|
+
def self.collection(topic_name, host=Azure.config.service_bus_host)
|
|
26
|
+
generate(host, File.join(topic_name, "Subscriptions"))
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
#TODO: we need to move this method to other module to be mixedin here
|
|
30
|
+
#
|
|
31
|
+
# Utility method to generate the URI.
|
|
32
|
+
#
|
|
33
|
+
# host - A String with the URI's host.
|
|
34
|
+
# path - A String with the URI's path.
|
|
35
|
+
# query - A simple Hash with query parameters (default: {}).
|
|
36
|
+
#
|
|
37
|
+
# Returns a URI.
|
|
38
|
+
def self.generate(host, path, query={})
|
|
39
|
+
uri = ::URI.parse(File.join(host, path))
|
|
40
|
+
uri.query = ::URI.encode_www_form(query) unless query.empty?
|
|
41
|
+
uri
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Public: generate the URI for the given subscription's head
|
|
45
|
+
#
|
|
46
|
+
# topic_name - The topic's name
|
|
47
|
+
# subscription_name - The subscription's name
|
|
48
|
+
# options - Options for this query (optional, default: {})
|
|
49
|
+
# host - The host of the API.
|
|
50
|
+
#
|
|
51
|
+
# Returns a URI.
|
|
52
|
+
def self.messages_head(topic_name, subscription_name, options={}, host=Azure.config.service_bus_host)
|
|
53
|
+
generate(host, "#{topic_name}/Subscriptions/#{subscription_name}/messages/head", options)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Public: generate the URI to operate on the given message in the given subscription
|
|
57
|
+
#
|
|
58
|
+
# topic_name - The topic's name
|
|
59
|
+
# subscription_name - The subscription's name
|
|
60
|
+
# seq_number - The message's sequence_number
|
|
61
|
+
# lock_token - The message's lock_token
|
|
62
|
+
# host - The host of the API (optional).
|
|
63
|
+
#
|
|
64
|
+
# Returns a URI.
|
|
65
|
+
def self.message(topic_name, subscription_name, seq_number, lock_token, host=Azure.config.service_bus_host)
|
|
66
|
+
generate(host, "#{topic_name}/Subscriptions/#{subscription_name}/messages/#{seq_number}/#{lock_token}")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require "nokogiri"
|
|
2
|
+
require "azure/service_bus/topics/service"
|
|
3
|
+
require "azure/service_bus/topics/topic"
|
|
4
|
+
require "azure/service_bus/topics/topic_serializer"
|
|
5
|
+
require "azure/service_bus/brokered_message"
|
|
6
|
+
require "azure/service_bus/brokered_message_serializer"
|
|
7
|
+
|
|
8
|
+
module Azure
|
|
9
|
+
module ServiceBus
|
|
10
|
+
module Topics
|
|
11
|
+
# Public: Try to create a new topic. If the operation is unsuccessful,
|
|
12
|
+
# the resulting Topic object will have the error accessible through the
|
|
13
|
+
# #error method.
|
|
14
|
+
#
|
|
15
|
+
# name - The name of the topic.
|
|
16
|
+
# properties - Properties hash describing this topic (optional, default: {}).
|
|
17
|
+
# service - The backend service to implement this (optional).
|
|
18
|
+
#
|
|
19
|
+
# Returns a Topic.
|
|
20
|
+
def self.create(name, props={}, service=Services::Create.new)
|
|
21
|
+
serializer = TopicSerializer.new(props)
|
|
22
|
+
xml = serializer.to_xml
|
|
23
|
+
response = service.call(name, xml)
|
|
24
|
+
|
|
25
|
+
if response.success?
|
|
26
|
+
node = Nokogiri::XML(response.body)
|
|
27
|
+
Topic.from_node(node)
|
|
28
|
+
else
|
|
29
|
+
Topic.from_error(response.error)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Public: Delete a Topic from the server. If the delete operation fails,
|
|
34
|
+
# the topic is invalidated. Otherwise it's frozen.
|
|
35
|
+
#
|
|
36
|
+
# topic - An Azure::ServiceBus::Topics::Topic.
|
|
37
|
+
# service - The backend service to implement this (optional).
|
|
38
|
+
#
|
|
39
|
+
# Returns true|false to indicate success.
|
|
40
|
+
def self.delete(topic, service=Services::Delete.new)
|
|
41
|
+
response = service.call(topic.name)
|
|
42
|
+
|
|
43
|
+
if response.success?
|
|
44
|
+
topic.freeze
|
|
45
|
+
else
|
|
46
|
+
topic.error = response.error
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
response.success?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Public: Get a topic by name. If the operation fails,
|
|
53
|
+
# the resulting Topic object will have the error accessible through the
|
|
54
|
+
# #error method.
|
|
55
|
+
#
|
|
56
|
+
# service - The backend service to implement this (optional).
|
|
57
|
+
#
|
|
58
|
+
# Returns a Topic
|
|
59
|
+
def self.get(topic_name, service=Services::Get.new)
|
|
60
|
+
response = service.call(topic_name)
|
|
61
|
+
|
|
62
|
+
if response.success?
|
|
63
|
+
node = Nokogiri::XML(response.body).remove_namespaces!
|
|
64
|
+
if (node % 'entry')
|
|
65
|
+
Topic.from_node(node)
|
|
66
|
+
else
|
|
67
|
+
#FIXME: If the topic is not found, Azure returns an atom feed containing links to immediate child nodes
|
|
68
|
+
# What to do with this?
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
Topic.from_error(response.error)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Public: This operation enumerates the topics in the service namespace.
|
|
76
|
+
#
|
|
77
|
+
# options - Options for this query (default: {}):
|
|
78
|
+
# :skip - Integer: number of entries to skip
|
|
79
|
+
# :top - Integer: number of entries to retrieve
|
|
80
|
+
# service - The backend service to implement this (optional).
|
|
81
|
+
#
|
|
82
|
+
# Returns an Array of Query elements.
|
|
83
|
+
def self.list(options={}, service=Services::List.new)
|
|
84
|
+
response = service.call(options)
|
|
85
|
+
|
|
86
|
+
if response.success?
|
|
87
|
+
result = Nokogiri::XML(response.body).remove_namespaces!
|
|
88
|
+
(result / 'entry').map {|node| Topic.from_node(node) }
|
|
89
|
+
else
|
|
90
|
+
[]
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Public: This operation sends a message into the specified topic.
|
|
95
|
+
# If the operation is unsuccessful the resulting BrokeredMessage object will be invalidated
|
|
96
|
+
# and the error will be accessible through the #error method.
|
|
97
|
+
#
|
|
98
|
+
# queue - The Topic
|
|
99
|
+
# message - The Message
|
|
100
|
+
# service - The backend service to implement this (optional).
|
|
101
|
+
#
|
|
102
|
+
# Returns true|false to indicate success.
|
|
103
|
+
def self.send_message_to_topic(topic, message, service=Services::SendMessageToTopic.new)
|
|
104
|
+
serializer = BrokeredMessageSerializer.new(message)
|
|
105
|
+
broker_properties = serializer.to_json
|
|
106
|
+
message_properties = serializer.get_property_headers
|
|
107
|
+
|
|
108
|
+
content_type = message.content_type || 'text/plain'
|
|
109
|
+
response = service.call(topic.name, message.body, content_type, broker_properties, message_properties)
|
|
110
|
+
|
|
111
|
+
if !response.success?
|
|
112
|
+
message.error = response.error
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
response.success?
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require "azure/core/service"
|
|
2
|
+
require "azure/core/utils/queryable"
|
|
3
|
+
require "azure/service_bus/service_bus_service"
|
|
4
|
+
require "azure/service_bus/auth/wrap"
|
|
5
|
+
require "azure/service_bus/auth/authorizer"
|
|
6
|
+
require "azure/service_bus/topics/uri"
|
|
7
|
+
|
|
8
|
+
module Azure
|
|
9
|
+
module ServiceBus
|
|
10
|
+
module Topics
|
|
11
|
+
class Service < Core::Service
|
|
12
|
+
def initialize(signer=Azure::ServiceBus::Auth::Wrap.new)
|
|
13
|
+
super(signer, Azure::ServiceBus::Auth::Authorizer.new)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module Services
|
|
18
|
+
# Public: Create a topic.
|
|
19
|
+
class Create < Service
|
|
20
|
+
# Public: Invoke the service.
|
|
21
|
+
#
|
|
22
|
+
# name - A String with the topic name.
|
|
23
|
+
# xml - An xml String according to the Azure docs
|
|
24
|
+
#
|
|
25
|
+
# Returns a Response.
|
|
26
|
+
def call(name, xml)
|
|
27
|
+
super(:put, URI.topic(name), xml)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Public: Delete a topic.
|
|
32
|
+
class Delete < Service
|
|
33
|
+
# Public: Invoke the service.
|
|
34
|
+
#
|
|
35
|
+
# name - A String with the topic name.
|
|
36
|
+
#
|
|
37
|
+
# Returns a Response.
|
|
38
|
+
def call(name)
|
|
39
|
+
super(:delete, URI.topic(name))
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Public: Get a topic.
|
|
44
|
+
class Get < Service
|
|
45
|
+
# Public: Invoke the service.
|
|
46
|
+
#
|
|
47
|
+
# name - A String with the topic name.
|
|
48
|
+
#
|
|
49
|
+
# Returns a Response.
|
|
50
|
+
def call(name)
|
|
51
|
+
super(:get, URI.topic(name))
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Public: List topics
|
|
56
|
+
class List < Service
|
|
57
|
+
include Core::Utils::Queryable
|
|
58
|
+
|
|
59
|
+
# Public: Invoke the service.
|
|
60
|
+
#
|
|
61
|
+
# options - Options for this query (default: {}):
|
|
62
|
+
# :skip - Integer: number of entries to skip
|
|
63
|
+
# :top - Integer: number of entries to retrieve
|
|
64
|
+
#
|
|
65
|
+
# Returns a Response.
|
|
66
|
+
def call(options={})
|
|
67
|
+
options = translate_options_hash(options)
|
|
68
|
+
super(:get, URI.collection(options))
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
## Messages
|
|
73
|
+
|
|
74
|
+
# Public: Sends a message to a topic
|
|
75
|
+
class SendMessageToTopic < ServiceBusService
|
|
76
|
+
# Public: Invoke the service.
|
|
77
|
+
#
|
|
78
|
+
# topic_name - A String with the topic name
|
|
79
|
+
# body - A String with the message's body
|
|
80
|
+
# broker_properties_json - A JSON encoded String with the message's properties.
|
|
81
|
+
# content_type - A String with the desired Content-Type for the message body
|
|
82
|
+
# message_properties - A Hash with the user-defined message's properties.
|
|
83
|
+
#
|
|
84
|
+
# Returns a Response.
|
|
85
|
+
def call(topic_name, body, content_type, broker_properties_json, message_properties)
|
|
86
|
+
super(:post, URI.messages(topic_name), body) do |request|
|
|
87
|
+
request.headers['BrokerProperties'] = broker_properties_json
|
|
88
|
+
message_properties.each do |k,v|
|
|
89
|
+
request.headers[k.to_s] = v
|
|
90
|
+
end
|
|
91
|
+
request.headers["Content-Type"] = content_type
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require "azure/error"
|
|
2
|
+
require "azure/service_bus/topics"
|
|
3
|
+
require "azure/service_bus/subscriptions"
|
|
4
|
+
require "azure/service_bus/subscriptions/subscription"
|
|
5
|
+
require "azure/core/collection"
|
|
6
|
+
|
|
7
|
+
module Azure
|
|
8
|
+
module ServiceBus
|
|
9
|
+
module Topics
|
|
10
|
+
class Topic
|
|
11
|
+
include Azure::ErrorHandler
|
|
12
|
+
# Get the Topic's ID.
|
|
13
|
+
#
|
|
14
|
+
# Returns a URI.
|
|
15
|
+
attr_accessor :id
|
|
16
|
+
alias_method :url, :id
|
|
17
|
+
|
|
18
|
+
# Get the Topic's name.
|
|
19
|
+
#
|
|
20
|
+
# Returns a String.
|
|
21
|
+
attr_accessor :name
|
|
22
|
+
alias_method :title, :name
|
|
23
|
+
|
|
24
|
+
# Public: Get the published time
|
|
25
|
+
#
|
|
26
|
+
# Returns a Time
|
|
27
|
+
attr_accessor :published
|
|
28
|
+
|
|
29
|
+
# Public: Get the updated time
|
|
30
|
+
#
|
|
31
|
+
# Returns a Time
|
|
32
|
+
attr_accessor :updated
|
|
33
|
+
|
|
34
|
+
# Public: Get the author name
|
|
35
|
+
#
|
|
36
|
+
# Returns a String
|
|
37
|
+
attr_accessor :author_name
|
|
38
|
+
|
|
39
|
+
# Public: Topic description
|
|
40
|
+
#
|
|
41
|
+
# Returns a Hash
|
|
42
|
+
attr_accessor :description
|
|
43
|
+
|
|
44
|
+
# Public: Instantiate a topic from an XML entry.
|
|
45
|
+
#
|
|
46
|
+
# entry - An XML::Node element.
|
|
47
|
+
#
|
|
48
|
+
# Returns a Topic.
|
|
49
|
+
def self.from_node(node)
|
|
50
|
+
name = (node % "title").text
|
|
51
|
+
|
|
52
|
+
new(name) do |q|
|
|
53
|
+
q.id = URI((node % "id").text)
|
|
54
|
+
# q.title = (node % "title").text
|
|
55
|
+
q.published = Time.parse((node % "published").text)
|
|
56
|
+
q.updated = Time.parse((node % "updated").text)
|
|
57
|
+
q.author_name = (node % "author/name").text
|
|
58
|
+
# q.description = Description.from_node(node % 'content/TopicDescription')
|
|
59
|
+
|
|
60
|
+
q.description = (node / "content/TopicDescription *").each_with_object({}) do |el, desc|
|
|
61
|
+
desc[el.name] = el.text
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Public: Instantiate a topic from an error object.
|
|
67
|
+
#
|
|
68
|
+
# error - An Azure::Error.
|
|
69
|
+
#
|
|
70
|
+
# Returns a Topic.
|
|
71
|
+
def self.from_error(error)
|
|
72
|
+
topic = new(nil)
|
|
73
|
+
topic.error = error
|
|
74
|
+
topic
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Public: Initialize the topic.
|
|
78
|
+
#
|
|
79
|
+
# name - A String with the name of the topic.
|
|
80
|
+
# description - The topic description Hash
|
|
81
|
+
# topic_service - The Topic service to perform external calls
|
|
82
|
+
# (optional).
|
|
83
|
+
# subscription_service - The Subscription service to perform external
|
|
84
|
+
# calls (optional).
|
|
85
|
+
def initialize(name, description = {}, topic_service=Azure::ServiceBus::Topics,
|
|
86
|
+
subscription_service=Azure::ServiceBus::Subscriptions)
|
|
87
|
+
@name = name
|
|
88
|
+
@description = description
|
|
89
|
+
@topic_service = topic_service
|
|
90
|
+
@subscription_service = subscription_service
|
|
91
|
+
|
|
92
|
+
yield self if block_given?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Public: List subscriptions in this topic.
|
|
96
|
+
#
|
|
97
|
+
# Returns Azure::Core::Collection.
|
|
98
|
+
def subscriptions
|
|
99
|
+
@subscriptions ||= Core::Collection.new(
|
|
100
|
+
self,
|
|
101
|
+
:topic,
|
|
102
|
+
Subscriptions::Subscription,
|
|
103
|
+
@subscription_service
|
|
104
|
+
)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def delete
|
|
108
|
+
@topic_service.delete(self)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Public: Compare two topics to see if they are the same.
|
|
112
|
+
#
|
|
113
|
+
# other - A topic.
|
|
114
|
+
#
|
|
115
|
+
# Returns true|false.
|
|
116
|
+
def ==(other)
|
|
117
|
+
id == other.id
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|