Class: Wildcloud::Router::Core

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/wildcloud/router/core.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCore



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 |, message|
    handle(, message)
  end
end

Instance Attribute Details

#amqpObject (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_amqpObject



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(, message)
  Router.logger.debug('Core') { "Got message: #{message}" }
  message = ::JSON.parse(message)
  method = "handle_#{message["type"]}".to_sym
  if respond_to?(method)
    send(method, message)
  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(message)
  Router.logger.debug('Core') { "Publishing #{message.inspect}" }
  @topic.publish(::JSON.dump(message), :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