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.
@@ -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)