cirrocumulus 0.4.6 → 0.5.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.
- data/Gemfile +1 -1
- data/LICENSE.txt +502 -0
- data/VERSION +1 -1
- data/cirrocumulus.gemspec +14 -15
- data/lib/cirrocumulus/agent.rb +97 -37
- data/lib/cirrocumulus/agent_wrapper.rb +68 -0
- data/lib/cirrocumulus/engine.rb +142 -63
- data/lib/cirrocumulus/ontology.rb +7 -2
- data/lib/cirrocumulus/rule_engine.rb +2 -259
- data/lib/cirrocumulus/rules/engine.rb +314 -0
- data/lib/cirrocumulus/rules/run_queue.rb +108 -0
- metadata +100 -156
- data/Gemfile.lock +0 -33
- data/lib/cirrocumulus/master_agent.rb +0 -205
- data/lib/test.rb +0 -56
@@ -1,205 +0,0 @@
|
|
1
|
-
module Agent
|
2
|
-
class AgentInfo
|
3
|
-
attr_accessor :identifier
|
4
|
-
attr_accessor :default_ontology
|
5
|
-
attr_accessor :last_seen_at
|
6
|
-
|
7
|
-
def initialize
|
8
|
-
@identifier = @default_ontology = @last_seen_at = nil
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class NetworkMap
|
13
|
-
|
14
|
-
INVALIDATE_PERIOD = 600*2
|
15
|
-
|
16
|
-
attr_reader :agents
|
17
|
-
attr_accessor :version
|
18
|
-
attr_reader :valid
|
19
|
-
|
20
|
-
def initialize(agent)
|
21
|
-
Log4r::Logger['agent'].debug "initializing empty network map"
|
22
|
-
@agent = agent
|
23
|
-
@agents = []
|
24
|
-
@version = 0
|
25
|
-
@valid = 0
|
26
|
-
end
|
27
|
-
|
28
|
-
def tick(cm)
|
29
|
-
@valid -= 1
|
30
|
-
if @valid <= 0
|
31
|
-
Log4r::Logger['agent'].debug "invalidating network map"
|
32
|
-
msg = Cirrocumulus::Message.new(nil, 'request', [:update, [:map, @version.to_s]])
|
33
|
-
msg.ontology = 'cirrocumulus-map'
|
34
|
-
cm.send(msg)
|
35
|
-
@valid = INVALIDATE_PERIOD
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def handle_message(message, cm)
|
40
|
-
if message.ontology == 'cirrocumulus-map'
|
41
|
-
return if !message.receiver.blank? && (message.receiver != @agent.identifier)
|
42
|
-
#p message
|
43
|
-
|
44
|
-
if message.act == 'inform'
|
45
|
-
if message.content.first == :"="
|
46
|
-
ontology = message.content[2].first
|
47
|
-
agent = @agents.find {|a| a.identifier == message.sender}
|
48
|
-
if agent
|
49
|
-
agent.default_ontology = ontology
|
50
|
-
agent.last_seen_at = Time.now.to_i
|
51
|
-
@version = Time.now.to_i
|
52
|
-
Log4r::Logger['agent'].info "got neighbour details: #{agent.inspect}"
|
53
|
-
end
|
54
|
-
else
|
55
|
-
agent_info = message.content
|
56
|
-
agent = AgentInfo.new
|
57
|
-
agent_info.each do |param|
|
58
|
-
if param.first == :identifier
|
59
|
-
agent.identifier = param.second
|
60
|
-
elsif param.first == :default_ontology
|
61
|
-
agent.default_ontology = param.second
|
62
|
-
elsif param.first == :last_seen_at
|
63
|
-
agent.last_seen_at = param.second.to_i
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
my_agent = @agents.find {|a| a.identifier == agent.identifier}
|
68
|
-
if my_agent.nil?
|
69
|
-
my_agent = agent
|
70
|
-
@agents << agent
|
71
|
-
else
|
72
|
-
my_agent.last_seen_at = [my_agent.last_seen_at, agent.last_seen_at].max
|
73
|
-
my_agent.default_ontology = agent.default_ontology || my_agent.default_ontology
|
74
|
-
end
|
75
|
-
|
76
|
-
Log4r::Logger['agent'].info "neighbour updated: #{my_agent.inspect}"
|
77
|
-
@version = Time.now.to_i
|
78
|
-
end
|
79
|
-
elsif message.act == 'request'
|
80
|
-
map_request = message.content
|
81
|
-
foreign_map = map_request.second
|
82
|
-
foreign_map_version = foreign_map.second.to_i
|
83
|
-
if @version >= foreign_map_version
|
84
|
-
@agents.each do |agent|
|
85
|
-
next if agent.default_ontology.blank?
|
86
|
-
msg = Cirrocumulus::Message.new(nil, 'inform', [
|
87
|
-
[:identifier, agent.identifier],
|
88
|
-
[:default_ontology, agent.default_ontology],
|
89
|
-
[:last_seen_at, agent.last_seen_at.to_s]
|
90
|
-
])
|
91
|
-
msg.receiver = message.sender
|
92
|
-
msg.ontology = 'cirrocumulus-map'
|
93
|
-
cm.send(msg)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
process_agent(message, cm)
|
98
|
-
elsif message.act == 'query-ref'
|
99
|
-
#p message.content
|
100
|
-
if message.content.first == :default_ontology
|
101
|
-
msg = Cirrocumulus::Message.new(nil, 'inform', [:'=', [:default_ontology], [@agent.default_ontology]])
|
102
|
-
msg.receiver = message.sender
|
103
|
-
msg.ontology = 'cirrocumulus-map'
|
104
|
-
cm.send(msg)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
else
|
108
|
-
process_agent(message, cm)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def process_agent(message, cm)
|
115
|
-
agent_id = message.sender
|
116
|
-
return if agent_id == @agent.identifier
|
117
|
-
|
118
|
-
agent = @agents.find {|a| a.identifier == agent_id}
|
119
|
-
if agent
|
120
|
-
agent.last_seen_at = Time.now.to_i
|
121
|
-
@version = Time.now.to_i
|
122
|
-
else
|
123
|
-
agent = AgentInfo.new
|
124
|
-
agent.identifier = agent_id
|
125
|
-
agent.last_seen_at = Time.now.to_i
|
126
|
-
Log4r::Logger['agent'].info "discovered neighbour: #{agent.identifier}"
|
127
|
-
@agents << agent
|
128
|
-
@version = Time.now.to_i
|
129
|
-
|
130
|
-
msg = Cirrocumulus::Message.new(nil, 'query-ref', [:default_ontology])
|
131
|
-
msg.receiver = agent.identifier
|
132
|
-
msg.ontology = 'cirrocumulus-map'
|
133
|
-
cm.send(msg)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
class Base
|
139
|
-
attr_reader :identifier
|
140
|
-
attr_reader :network_map
|
141
|
-
|
142
|
-
def initialize(cm)
|
143
|
-
Log4r::Logger['agent'].info('Initializing new agent')
|
144
|
-
|
145
|
-
@cm = cm
|
146
|
-
@identifier = cm.jid
|
147
|
-
@ontologies = []
|
148
|
-
@network_map = NetworkMap.new(self)
|
149
|
-
end
|
150
|
-
|
151
|
-
def load_ontologies(ontologies_list)
|
152
|
-
ontologies_list.each do |ontology_name|
|
153
|
-
ontology = eval("#{ontology_name}.new(self)")
|
154
|
-
self.ontologies << ontology
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def default_ontology
|
159
|
-
self.ontologies.size == 1 ? self.ontologies.first.name : nil
|
160
|
-
end
|
161
|
-
|
162
|
-
def handles_ontology?(ontology_name)
|
163
|
-
self.ontologies.any? {|ontology| ontology.name == ontology_name}
|
164
|
-
end
|
165
|
-
|
166
|
-
def restore_state()
|
167
|
-
self.ontologies.each do |ontology|
|
168
|
-
begin
|
169
|
-
ontology.restore_state()
|
170
|
-
rescue Exception => e
|
171
|
-
Log4r::Logger['agent'].warn "failed to restore state for ontology %s" % ontology.name
|
172
|
-
Log4r::Logger['agent'].warn e.backtrace.to_s
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def send_message(message)
|
178
|
-
@cm.send(message)
|
179
|
-
end
|
180
|
-
|
181
|
-
def tick()
|
182
|
-
@network_map.tick(@cm)
|
183
|
-
|
184
|
-
self.ontologies.each {|ontology| ontology.tick() }
|
185
|
-
end
|
186
|
-
|
187
|
-
def handle_message(message, kb)
|
188
|
-
@network_map.handle_message(message, @cm)
|
189
|
-
self.ontologies.each {|ontology|
|
190
|
-
if message.ontology == ontology.name || ontology.sagas.any? {|saga| saga.id == message.in_reply_to}
|
191
|
-
ontology.handle_incoming_message(message, kb)
|
192
|
-
end
|
193
|
-
}
|
194
|
-
rescue Exception => e
|
195
|
-
Log4r::Logger['agent'].warn "failed to handle incoming message: %s" % e.to_s
|
196
|
-
puts e.backtrace.to_s
|
197
|
-
end
|
198
|
-
|
199
|
-
protected
|
200
|
-
|
201
|
-
attr_reader :cm
|
202
|
-
attr_reader :ontologies
|
203
|
-
|
204
|
-
end
|
205
|
-
end
|
data/lib/test.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'cirrocumulus/rule_engine.rb'
|
2
|
-
require 'cirrocumulus/rule_server.rb'
|
3
|
-
|
4
|
-
class Test < RuleEngine::Base
|
5
|
-
rule 'convert', [[:temperature, :X, 'F']] do |engine, params|
|
6
|
-
puts "qqq"
|
7
|
-
x = params[:X].to_i
|
8
|
-
engine.retract([:temperature, x, 'F'])
|
9
|
-
y = 5*(x - 32)/9
|
10
|
-
engine.assert([:temperature, y, 'C'])
|
11
|
-
end
|
12
|
-
|
13
|
-
rule 'guest_powered_off', [[:guest, :X, :powered_off]] do |engine, params|
|
14
|
-
puts "guest_powered_off"
|
15
|
-
end
|
16
|
-
|
17
|
-
rule 'monitor_md', [[:virtual_disk, :X, :active], [:mdraid, :X, :failed]] do |engine, params|
|
18
|
-
# md devices is failed, but virtual disk should be up
|
19
|
-
p params
|
20
|
-
puts "virtual disk #{params[:X]} should be up, but corresponding md devices is failed!"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
#RuleEngine::Server.run()
|
25
|
-
|
26
|
-
e = Test.new
|
27
|
-
e.assert [:guest, "233bed174ab0802fd908f981d64d185b", :powered_off]
|
28
|
-
e.assert [:guest, "233bed174ab0802fd908f981d64d185b", :running]
|
29
|
-
e.assert [:guest, "233bed174ab0802fd908f981d64d185b", :state, :powered_on]
|
30
|
-
e.replace [:guest, "233bed174ab0802fd908f981d64d185b", :state, :STATE], :powered_off
|
31
|
-
|
32
|
-
p e.match [:guest, "233bed174ab0802fd908f981d64d185b", :running]
|
33
|
-
gets
|
34
|
-
exit(0)
|
35
|
-
e.assert [:virtual_disk, 163, :active]
|
36
|
-
#e.assert [:virtual_disk, 139, :active]
|
37
|
-
#e.assert [:virtual_disk, 145, :active]
|
38
|
-
#e.assert [:virtual_disk, 146, :active]
|
39
|
-
#e.assert [:virtual_disk, 149, :active]
|
40
|
-
e.assert [:virtual_disk, 153, :active]
|
41
|
-
#e.assert [:virtual_disk, 154, :active]
|
42
|
-
#e.assert [:virtual_disk, 156, :active]
|
43
|
-
e.assert [:virtual_disk, 158, :active]
|
44
|
-
#e.assert [:virtual_disk, 137, :active]
|
45
|
-
#e.assert [:virtual_disk, 135, :active]
|
46
|
-
#e.assert [:virtual_disk, 159, :active]
|
47
|
-
#e.assert [:virtual_disk, 103, :active]
|
48
|
-
#e.assert [:virtual_disk, 102, :active]
|
49
|
-
#e.assert [:virtual_disk, 20, :active]
|
50
|
-
#e.assert [:virtual_disk, 2, :active]
|
51
|
-
#e.assert [:virtual_disk, 777, :active]
|
52
|
-
#e.assert [:virtual_disk, 90, :active]
|
53
|
-
e.assert [:mdraid, 153, :failed], true
|
54
|
-
e.assert [:mdraid, 158, :failed], true
|
55
|
-
e.execute()
|
56
|
-
gets
|