1 #!/usr/bin/env python2.6
4 # This file is used to test host- and service-downtimes.
17 sys
.path
.append("../shinken")
18 #sys.path.append("../bin")
19 #sys.path.append(os.path.abspath("bin"))
23 from shinken
.objects
.config
import Config
24 from shinken
.objects
.command
import Command
25 from shinken
.objects
.module
import Module
27 from shinken
.dispatcher
import Dispatcher
28 from shinken
.log
import logger
29 from shinken
.scheduler
import Scheduler
30 from shinken
.macroresolver
import MacroResolver
31 from shinken
.external_command
import ExternalCommandManager
, ExternalCommand
32 from shinken
.check
import Check
33 from shinken
.message
import Message
34 from shinken
.arbiterlink
import ArbiterLink
35 from shinken
.schedulerlink
import SchedulerLink
36 from shinken
.pollerlink
import PollerLink
37 from shinken
.reactionnerlink
import ReactionnerLink
38 from shinken
.brokerlink
import BrokerLink
39 from shinken
.satellitelink
import SatelliteLink
40 from shinken
.notification
import Notification
42 from shinken
.brok
import Brok
44 from shinken
.daemons
.schedulerdaemon
import Shinken
45 from shinken
.daemons
.brokerdaemon
import Broker
46 from shinken
.daemons
.arbiterdaemon
import Arbiter
48 class ShinkenTest(unittest
.TestCase
):
50 self
.setup_with_file('etc/nagios_1r_1h_1s.cfg')
52 def setup_with_file(self
, path
):
57 self
.log
.load_obj(self
)
58 self
.config_files
= [path
]
60 self
.conf
.read_config(self
.config_files
)
61 buf
= self
.conf
.read_config(self
.config_files
)
62 raw_objects
= self
.conf
.read_config_buf(buf
)
63 self
.conf
.create_objects_for_type(raw_objects
, 'arbiter')
64 self
.conf
.create_objects_for_type(raw_objects
, 'module')
65 self
.conf
.early_arbiter_linking()
66 self
.conf
.create_objects(raw_objects
)
67 self
.conf
.instance_id
= 0
68 self
.conf
.instance_name
= 'test'
69 self
.conf
.linkify_templates()
70 self
.conf
.apply_inheritance()
72 self
.conf
.create_reversed_list()
73 self
.conf
.remove_twins()
74 self
.conf
.apply_implicit_inheritance()
75 self
.conf
.fill_default()
76 self
.conf
.clean_useless()
79 self
.conf
.apply_dependancies()
80 self
.conf
.explode_global_conf()
81 self
.conf
.propagate_timezone_option()
82 self
.conf
.create_business_rules()
83 self
.conf
.create_business_rules_dependencies()
84 self
.conf
.is_correct()
85 self
.confs
= self
.conf
.cut_into_parts()
86 self
.dispatcher
= Dispatcher(self
.conf
, self
.me
)
88 scheddaemon
= Shinken(None, False, False, False, None)
89 self
.sched
= Scheduler(scheddaemon
)
91 scheddaemon
.sched
= self
.sched
95 self
.sched
.load_conf(self
.conf
)
96 e
= ExternalCommandManager(self
.conf
, 'applyer')
97 self
.sched
.external_command
= e
98 e
.load_scheduler(self
.sched
)
99 e2
= ExternalCommandManager(self
.conf
, 'dispatcher')
100 e2
.load_arbiter(self
)
101 self
.external_command_dispatcher
= e2
102 self
.sched
.schedule()
106 if isinstance(b
, Brok
):
109 if isinstance(b
, ExternalCommand
):
110 self
.sched
.run_external_command(b
.cmd_line
)
113 def fake_check(self
, ref
, exit_status
, output
="OK"):
116 ref
.schedule(force
=True)
117 #now checks are schedule and we get them in
119 check
= ref
.actions
.pop()
120 self
.sched
.add(check
) # check is now in sched.checks[]
122 check
.check_time
= now
124 elts_line1
= output
.split('|')
125 #First line before | is output
126 check
.output
= elts_line1
[0]
128 if len(elts_line1
) > 1:
129 check
.perf_data
= elts_line1
[1]
132 check
.exit_status
= exit_status
133 check
.execution_time
= 0.001
134 check
.status
= 'waitconsume'
135 self
.sched
.waiting_results
.append(check
)
138 def scheduler_loop(self
, count
, reflist
, do_sleep
=False, sleep_time
=61):
140 (obj
, exit_status
, output
) = ref
141 obj
.checks_in_progress
= []
142 for loop
in range(1, count
+ 1):
143 print "processing check", loop
145 (obj
, exit_status
, output
) = ref
146 obj
.update_in_checking()
147 self
.fake_check(obj
, exit_status
, output
)
148 self
.sched
.manage_internal_checks()
149 self
.sched
.consume_results()
150 self
.sched
.get_new_actions()
151 self
.sched
.get_new_broks()
154 (obj
, exit_status
, output
) = ref
155 obj
.checks_in_progress
= []
156 self
.sched
.update_downtimes_and_comments()
157 #time.sleep(ref.retry_interval * 60 + 1)
159 time
.sleep(sleep_time
)
162 def worker_loop(self
):
163 self
.sched
.delete_zombie_checks()
164 self
.sched
.delete_zombie_actions()
165 checks
= self
.sched
.get_to_run_checks(True, False, worker_name
='tester')
166 actions
= self
.sched
.get_to_run_checks(False, True, worker_name
='tester')
167 #print "------------ worker loop checks ----------------"
169 #print "------------ worker loop actions ----------------"
171 #print "------------ worker loop new ----------------"
173 a
.status
= 'inpoller'
174 a
.check_time
= time
.time()
176 self
.sched
.put_results(a
)
178 #print "------------ worker loop end ----------------"
182 print "--- logs <<<----------------------------------"
183 for brok
in sorted(self
.sched
.broks
.values(), lambda x
, y
: x
.id - y
.id):
184 if brok
.type == 'log':
185 print "LOG:", brok
.data
['log']
186 print "--- logs >>>----------------------------------"
189 def show_actions(self
):
190 print "--- actions <<<----------------------------------"
191 for a
in sorted(self
.sched
.actions
.values(), lambda x
, y
: x
.id - y
.id):
192 if a
.is_a
== 'notification':
193 if a
.ref
.my_type
== "host":
194 ref
= "host: %s" % a
.ref
.get_name()
196 ref
= "host: %s svc: %s" % (a
.ref
.host
.get_name(), a
.ref
.get_name())
197 print "NOTIFICATION %d %s %s %s %s" % (a
.id, ref
, a
.type, time
.asctime(time
.localtime(a
.t_to_go
)), a
.status
)
198 elif a
.is_a
== 'eventhandler':
199 print "EVENTHANDLER:", a
200 print "--- actions >>>----------------------------------"
203 def show_and_clear_logs(self
):
208 def show_and_clear_actions(self
):
213 def count_logs(self
):
214 return len([b
for b
in self
.sched
.broks
.values() if b
.type == 'log'])
217 def count_actions(self
):
218 return len(self
.sched
.actions
.values())
221 def clear_logs(self
):
223 for b
in self
.sched
.broks
.values():
225 id_to_del
.append(b
.id)
227 del self
.sched
.broks
[id]
230 def clear_actions(self
):
231 self
.sched
.actions
= {}
234 def log_match(self
, index
, pattern
):
235 # log messages are counted 1...n, so index=1 for the first message
236 if index
> self
.count_logs():
239 regex
= re
.compile(pattern
)
241 for brok
in sorted(self
.sched
.broks
.values(), lambda x
, y
: x
.id - y
.id):
242 if brok
.type == 'log':
244 if re
.search(regex
, brok
.data
['log']):
250 def any_log_match(self
, pattern
):
251 regex
= re
.compile(pattern
)
252 for brok
in sorted(self
.sched
.broks
.values(), lambda x
, y
: x
.id - y
.id):
253 if brok
.type == 'log':
254 if re
.search(regex
, brok
.data
['log']):
259 def get_log_match(self
, pattern
):
260 regex
= re
.compile(pattern
)
262 for brok
in sorted(self
.sched
.broks
.values(), lambda x
, y
: x
.id - y
.id):
263 if brok
.type == 'log':
264 if re
.search(regex
, brok
.data
['log']):
265 res
.append(brok
.data
['log'])
270 def print_header(self
):
271 print "#" * 80 + "\n" + "#" + " " * 78 + "#"
272 print "#" + string
.center(self
.id(), 78) + "#"
273 print "#" + " " * 78 + "#\n" + "#" * 80 + "\n"
278 def xtest_conf_is_correct(self
):
280 self
.assert_(self
.conf
.conf_is_correct
)
284 if __name__
== '__main__':