Class: Wildcloud::Router::Core
- Inherits:
-
Object
- Object
- Wildcloud::Router::Core
- Includes:
- Singleton
- Defined in:
- lib/wildcloud/router/core.rb
Instance Attribute Summary collapse
-
#amqp ⇒ Object
readonly
Returns the value of attribute amqp.
Instance Method Summary collapse
- #connect_amqp ⇒ Object
- #handle(metadata, message) ⇒ Object
- #handle_add_route(data) ⇒ Object
- #handle_remove_route(data) ⇒ Object
- #handle_sync(data) ⇒ Object
-
#initialize ⇒ Core
constructor
A new instance of Core.
- #parse_target(raw_target) ⇒ Object
- #publish(message) ⇒ Object
- #resolve(host) ⇒ Object
Constructor Details
#initialize ⇒ Core
26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/wildcloud/router/core.rb', line 26 def initialize @counter = {} @routes = {} Router.logger.info('Core') { "Starting" } connect_amqp Router.logger.info('Core') { "Requesting synchronization" } publish({ :node => Router.configuration["node"]["name"], :type => :sync }) @queue.subscribe do |, | handle(, ) end end |
Instance Attribute Details
#amqp ⇒ Object (readonly)
Returns the value of attribute amqp.
24 25 26 |
# File 'lib/wildcloud/router/core.rb', line 24 def amqp @amqp end |
Instance Method Details
#connect_amqp ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/wildcloud/router/core.rb', line 41 def connect_amqp Router.logger.info('Core') { "Connecting to broker" } @amqp = AMQP.connect(Router.configuration["amqp"]) Router.logger_add_amqp(@amqp) @channel = AMQP::Channel.new(@amqp) # Communication infrastructure @topic = @channel.topic('wildcloud.router') @queue = @channel.queue("wildcloud.router.#{Router.configuration["node"]["name"]}") @queue.bind(@topic, :routing_key => "nodes") @queue.bind(@topic, :routing_key => "node.#{Router.configuration["node"]["name"]}") end |
#handle(metadata, message) ⇒ Object
53 54 55 56 57 58 59 60 61 62 |
# File 'lib/wildcloud/router/core.rb', line 53 def handle(, ) Router.logger.debug('Core') { "Got message: #{}" } = ::JSON.parse() method = "handle_#{["type"]}".to_sym if respond_to?(method) send(method, ) else end end |
#handle_add_route(data) ⇒ Object
77 78 79 80 81 |
# File 'lib/wildcloud/router/core.rb', line 77 def handle_add_route(data) host = data['host'] ( @routes[host] ||= [] ) << parse_target(data['target']) Router.logger.debug('Core') { "Routes: #{@routes.inspect}" } end |
#handle_remove_route(data) ⇒ Object
83 84 85 86 87 88 |
# File 'lib/wildcloud/router/core.rb', line 83 def handle_remove_route(data) host = data['host'] return unless @routes[host] @routes[host].delete(parse_target(data['target'])) Router.logger.debug('Core') { "Routes: #{@routes.inspect}" } end |
#handle_sync(data) ⇒ Object
64 65 66 |
# File 'lib/wildcloud/router/core.rb', line 64 def handle_sync(data) @routes = data['routes'] end |
#parse_target(raw_target) ⇒ Object
68 69 70 71 72 73 74 75 |
# File 'lib/wildcloud/router/core.rb', line 68 def parse_target(raw_target) target = raw_target.split(':') if target.size == 1 { "socket" => target[0]} else { "address" => target[0], "port" => target[1]} end end |
#publish(message) ⇒ Object
100 101 102 103 |
# File 'lib/wildcloud/router/core.rb', line 100 def publish() Router.logger.debug('Core') { "Publishing #{.inspect}" } @topic.publish(::JSON.dump(), :routing_key => 'master') end |
#resolve(host) ⇒ Object
90 91 92 93 94 95 96 97 98 |
# File 'lib/wildcloud/router/core.rb', line 90 def resolve(host) host << ':80' unless host.index(':') return nil unless @routes[host] @counter[host] ||= 0 res = @routes[host][@counter[host]] @counter[host] += 1 @counter[host] = 0 if @counter[host] == @routes[host].size res end |