cirrocumulus 0.4.6 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,108 @@
1
+ require 'thread'
2
+
3
+ module RuleEngine
4
+ class QueueEntry
5
+ attr_reader :rule
6
+ attr_reader :params
7
+ attr_reader :run_at
8
+ attr_accessor :state
9
+
10
+ def initialize(rule, params, run_at = nil)
11
+ @rule = rule
12
+ @params = params
13
+ @run_at = run_at
14
+ @state = :queued
15
+ end
16
+ end
17
+
18
+ class RunQueue
19
+ def initialize(engine)
20
+ @engine = engine
21
+ @queue = []
22
+ @running_rules = []
23
+ @mutex = Mutex.new
24
+ end
25
+
26
+ def enqueue(rule, params)
27
+ @mutex.synchronize do
28
+ if !already_queued?(rule, params)
29
+ debug "Enqueueing rule #{rule.name}#{params.inspect}"
30
+
31
+ if !rule.options.blank? && rule.options.include?(:for)
32
+ delay = rule.options[:for]
33
+ run_at = Time.now + delay
34
+ debug "Will run this rule after #{delay.to_s} sec (at #{run_at.strftime("%H:%M:%S %d.%m.%Y")})"
35
+ @queue << QueueEntry.new(rule, params, run_at)
36
+ else
37
+ @queue << QueueEntry.new(rule, params)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ def run_queued_rules()
44
+ rules_for_running = Queue.new
45
+ @mutex.synchronize do
46
+ count = @queue.count {|entry| entry.state == :queued}
47
+
48
+ if count > 0
49
+ debug "There are #{count} rules waiting, running.." if count > 1
50
+
51
+ idx = 0
52
+ while count > 0
53
+ entry = @queue[idx]
54
+
55
+ if entry.state != :queued
56
+ idx += 1
57
+ next
58
+ end
59
+
60
+ if entry.run_at.blank? || (entry.run_at <= Time.now)
61
+ rules_for_running << entry
62
+ entry.state = :running
63
+ end
64
+
65
+ count -= 1
66
+ end
67
+ end
68
+ end
69
+
70
+ while !rules_for_running.empty? do
71
+ entry = rules_for_running.pop
72
+ begin
73
+ debug "Executing #{entry.rule.name}#{entry.params.inspect}"
74
+ entry.rule.code.call(@engine, entry.params)
75
+ entry.state = :finished # TODO: cleanup @queue from this entries
76
+ rescue Exception => e
77
+ Log4r::Logger['kb'].warn "Exception while executing rule: %s\n%s" % [e.to_s, e.backtrace.to_s]
78
+ end
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def already_queued?(rule, params)
85
+ return false if @queue.empty?
86
+
87
+ @queue.each do |queued_rule|
88
+ next if queued_rule.rule.name != rule.name
89
+ return true if params === queued_rule.params && queued_rule.state != :finished
90
+ end
91
+
92
+ false
93
+ end
94
+
95
+ def log(msg)
96
+ Log4r::Logger['kb'].info(msg)
97
+ rescue
98
+ puts "[INFO] %s" % msg
99
+ end
100
+
101
+ def debug(msg)
102
+ Log4r::Logger['kb'].debug(msg)
103
+ rescue
104
+ puts "[DEBUG] %s" % msg
105
+ end
106
+
107
+ end
108
+ end
metadata CHANGED
@@ -1,187 +1,137 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: cirrocumulus
3
- version: !ruby/object:Gem::Version
4
- hash: 3
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 4
9
- - 6
10
- version: 0.4.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.2
5
+ prerelease:
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Anton Kosyakin
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-10-27 00:00:00 +04:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
12
+ date: 2011-12-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: &77891350 !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
18
+ requirements:
25
19
  - - ~>
26
- - !ruby/object:Gem::Version
27
- hash: 21
28
- segments:
29
- - 2
30
- - 3
31
- - 11
20
+ - !ruby/object:Gem::Version
32
21
  version: 2.3.11
33
- requirement: *id001
34
22
  type: :runtime
35
- name: activesupport
36
23
  prerelease: false
37
- - !ruby/object:Gem::Dependency
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *77891350
25
+ - !ruby/object:Gem::Dependency
26
+ name: log4r
27
+ requirement: &77890270 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
29
+ requirements:
41
30
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 1
44
- segments:
45
- - 1
46
- - 1
47
- - 9
31
+ - !ruby/object:Gem::Version
48
32
  version: 1.1.9
49
- requirement: *id002
50
33
  type: :runtime
51
- name: log4r
52
34
  prerelease: false
53
- - !ruby/object:Gem::Dependency
54
- version_requirements: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *77890270
36
+ - !ruby/object:Gem::Dependency
37
+ name: systemu
38
+ requirement: &77888870 !ruby/object:Gem::Requirement
55
39
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
63
- requirement: *id003
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
64
44
  type: :runtime
65
- name: systemu
66
45
  prerelease: false
67
- - !ruby/object:Gem::Dependency
68
- version_requirements: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *77888870
47
+ - !ruby/object:Gem::Dependency
48
+ name: xmpp4r
49
+ requirement: &77888390 !ruby/object:Gem::Requirement
69
50
  none: false
70
- requirements:
51
+ requirements:
71
52
  - - ~>
72
- - !ruby/object:Gem::Version
73
- hash: 1
74
- segments:
75
- - 0
76
- - 5
77
- version: "0.5"
78
- requirement: *id004
53
+ - !ruby/object:Gem::Version
54
+ version: '0.5'
79
55
  type: :runtime
80
- name: xmpp4r
81
56
  prerelease: false
82
- - !ruby/object:Gem::Dependency
83
- version_requirements: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *77888390
58
+ - !ruby/object:Gem::Dependency
59
+ name: xmpp4r-simple
60
+ requirement: &77887740 !ruby/object:Gem::Requirement
84
61
  none: false
85
- requirements:
86
- - - ~>
87
- - !ruby/object:Gem::Version
88
- hash: 47
89
- segments:
90
- - 0
91
- - 8
92
- - 8
93
- version: 0.8.8
94
- requirement: *id005
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
95
66
  type: :runtime
96
- name: xmpp4r-simple
97
67
  prerelease: false
98
- - !ruby/object:Gem::Dependency
99
- version_requirements: &id006 !ruby/object:Gem::Requirement
68
+ version_requirements: *77887740
69
+ - !ruby/object:Gem::Dependency
70
+ name: eventmachine
71
+ requirement: &77886600 !ruby/object:Gem::Requirement
100
72
  none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
108
- requirement: *id006
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
109
77
  type: :runtime
110
- name: eventmachine
111
78
  prerelease: false
112
- - !ruby/object:Gem::Dependency
113
- version_requirements: &id007 !ruby/object:Gem::Requirement
79
+ version_requirements: *77886600
80
+ - !ruby/object:Gem::Dependency
81
+ name: deil_sexpistol
82
+ requirement: &77885090 !ruby/object:Gem::Requirement
114
83
  none: false
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- hash: 3
119
- segments:
120
- - 0
121
- version: "0"
122
- requirement: *id007
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
123
88
  type: :runtime
124
- name: deil_sexpistol
125
89
  prerelease: false
126
- - !ruby/object:Gem::Dependency
127
- version_requirements: &id008 !ruby/object:Gem::Requirement
90
+ version_requirements: *77885090
91
+ - !ruby/object:Gem::Dependency
92
+ name: bundler
93
+ requirement: &78301580 !ruby/object:Gem::Requirement
128
94
  none: false
129
- requirements:
95
+ requirements:
130
96
  - - ~>
131
- - !ruby/object:Gem::Version
132
- hash: 23
133
- segments:
134
- - 1
135
- - 0
136
- - 0
97
+ - !ruby/object:Gem::Version
137
98
  version: 1.0.0
138
- requirement: *id008
139
99
  type: :development
140
- name: bundler
141
100
  prerelease: false
142
- - !ruby/object:Gem::Dependency
143
- version_requirements: &id009 !ruby/object:Gem::Requirement
101
+ version_requirements: *78301580
102
+ - !ruby/object:Gem::Dependency
103
+ name: jeweler
104
+ requirement: &78300700 !ruby/object:Gem::Requirement
144
105
  none: false
145
- requirements:
106
+ requirements:
146
107
  - - ~>
147
- - !ruby/object:Gem::Version
148
- hash: 7
149
- segments:
150
- - 1
151
- - 6
152
- - 4
108
+ - !ruby/object:Gem::Version
153
109
  version: 1.6.4
154
- requirement: *id009
155
110
  type: :development
156
- name: jeweler
157
111
  prerelease: false
158
- - !ruby/object:Gem::Dependency
159
- version_requirements: &id010 !ruby/object:Gem::Requirement
112
+ version_requirements: *78300700
113
+ - !ruby/object:Gem::Dependency
114
+ name: rcov
115
+ requirement: &78299830 !ruby/object:Gem::Requirement
160
116
  none: false
161
- requirements:
162
- - - ">="
163
- - !ruby/object:Gem::Version
164
- hash: 3
165
- segments:
166
- - 0
167
- version: "0"
168
- requirement: *id010
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
169
121
  type: :development
170
- name: rcov
171
122
  prerelease: false
172
- description: Engine for building your own agents, providing you base functionality for loading ontologies, communicating with other agents and parsing FIPA-ACL messages
123
+ version_requirements: *78299830
124
+ description: Engine for building your own agents, providing you base functionality
125
+ for loading ontologies, communicating with other agents and parsing FIPA-ACL messages
173
126
  email: deil@mneko.net
174
127
  executables: []
175
-
176
128
  extensions: []
177
-
178
- extra_rdoc_files:
129
+ extra_rdoc_files:
179
130
  - LICENSE.txt
180
131
  - README.rdoc
181
- files:
132
+ files:
182
133
  - .document
183
134
  - Gemfile
184
- - Gemfile.lock
185
135
  - LICENSE.txt
186
136
  - README.rdoc
187
137
  - Rakefile
@@ -189,50 +139,44 @@ files:
189
139
  - cirrocumulus.gemspec
190
140
  - lib/cirrocumulus.rb
191
141
  - lib/cirrocumulus/agent.rb
142
+ - lib/cirrocumulus/agent_wrapper.rb
192
143
  - lib/cirrocumulus/engine.rb
193
144
  - lib/cirrocumulus/kb.rb
194
145
  - lib/cirrocumulus/logger.rb
195
- - lib/cirrocumulus/master_agent.rb
196
146
  - lib/cirrocumulus/ontology.rb
197
147
  - lib/cirrocumulus/rule_engine.rb
198
148
  - lib/cirrocumulus/rule_server.rb
149
+ - lib/cirrocumulus/rules/engine.rb
150
+ - lib/cirrocumulus/rules/run_queue.rb
199
151
  - lib/cirrocumulus/saga.rb
200
- - lib/test.rb
201
152
  - test/helper.rb
202
153
  - test/test_cirrocumulus.rb
203
- has_rdoc: true
204
154
  homepage: http://github.com/deil/cirrocumulus
205
- licenses:
155
+ licenses:
206
156
  - GPL-2
207
157
  post_install_message:
208
158
  rdoc_options: []
209
-
210
- require_paths:
159
+ require_paths:
211
160
  - lib
212
- required_ruby_version: !ruby/object:Gem::Requirement
161
+ required_ruby_version: !ruby/object:Gem::Requirement
213
162
  none: false
214
- requirements:
215
- - - ">="
216
- - !ruby/object:Gem::Version
217
- hash: 3
218
- segments:
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ segments:
219
168
  - 0
220
- version: "0"
221
- required_rubygems_version: !ruby/object:Gem::Requirement
169
+ hash: 821784403
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
222
171
  none: false
223
- requirements:
224
- - - ">="
225
- - !ruby/object:Gem::Version
226
- hash: 3
227
- segments:
228
- - 0
229
- version: "0"
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
230
176
  requirements: []
231
-
232
177
  rubyforge_project:
233
- rubygems_version: 1.3.7
178
+ rubygems_version: 1.8.10
234
179
  signing_key:
235
180
  specification_version: 3
236
181
  summary: Agent-based infrastructure management system
237
182
  test_files: []
238
-
@@ -1,33 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- activesupport (2.3.14)
5
- deil_sexpistol (0.0.8)
6
- eventmachine (0.12.10)
7
- git (1.2.5)
8
- jeweler (1.6.4)
9
- bundler (~> 1.0)
10
- git (>= 1.2.5)
11
- rake
12
- log4r (1.1.9)
13
- rake (0.9.2)
14
- rcov (0.9.10)
15
- systemu (2.3.0)
16
- xmpp4r (0.5)
17
- xmpp4r-simple (0.8.8)
18
- xmpp4r (>= 0.3.2)
19
-
20
- PLATFORMS
21
- ruby
22
-
23
- DEPENDENCIES
24
- activesupport (~> 2.3.11)
25
- bundler (~> 1.0.0)
26
- deil_sexpistol
27
- eventmachine
28
- jeweler (~> 1.6.4)
29
- log4r (~> 1.1.9)
30
- rcov
31
- systemu
32
- xmpp4r (~> 0.5)
33
- xmpp4r-simple (~> 0.8.8)