36
37
alarm = "DummyAction"
39
@attr(tag=['unit', 'watchrule'])
41
class WatchRuleTest(unittest.TestCase):
40
class WatchRuleTest(HeatTestCase):
44
def setUpDatabase(cls):
45
if cls.stack_id is not None:
45
47
# Create a dummy stack in the DB as WatchRule instances
46
48
# must be associated with a stack
49
utils.setup_dummy_db()
47
50
ctx = context.get_admin_context()
48
51
ctx.username = 'dummyuser'
49
52
ctx.tenant_id = '123456'
50
53
empty_tmpl = {"template": {}}
51
54
tmpl = parser.Template(empty_tmpl)
52
55
stack_name = 'dummystack'
53
params = parser.Parameters(stack_name, tmpl, {'foo': 'bar'})
54
dummy_stack = parser.Stack(ctx, stack_name, tmpl, params)
55
dummy_stack.state_set(dummy_stack.CREATE_COMPLETE, 'Testing')
56
dummy_stack = parser.Stack(ctx, stack_name, tmpl)
57
dummy_stack.state_set(dummy_stack.CREATE, dummy_stack.COMPLETE,
56
59
dummy_stack.store()
58
61
cls.stack_id = dummy_stack.id
64
super(WatchRuleTest, self).setUp()
61
66
self.username = 'watchrule_test_user'
65
68
self.ctx = context.get_admin_context()
66
69
self.ctx.username = self.username
67
70
self.ctx.tenant_id = u'123456'
74
74
def _action_set_stubs(self, now, action_expected=True):
75
75
# Setup stubs for the action tests
76
76
self.m.StubOutWithMock(timeutils, 'utcnow')
98
98
data.append(WatchData(53, now - datetime.timedelta(seconds=150)))
100
100
# all > 50 -> NORMAL
101
watcher = watchrule.WatchRule(context=self.ctx,
101
self.wr = watchrule.WatchRule(context=self.ctx,
102
102
watch_name="testwatch",
105
105
stack_id=self.stack_id,
106
106
last_evaluated=last)
107
new_state = watcher.get_alarm_state()
107
new_state = self.wr.get_alarm_state()
108
108
self.assertEqual(new_state, 'NORMAL')
110
110
data.append(WatchData(25, now - datetime.timedelta(seconds=250)))
111
watcher = watchrule.WatchRule(context=self.ctx,
111
self.wr = watchrule.WatchRule(context=self.ctx,
112
112
watch_name="testwatch",
115
115
stack_id=self.stack_id,
116
116
last_evaluated=last)
117
new_state = watcher.get_alarm_state()
117
new_state = self.wr.get_alarm_state()
118
118
self.assertEqual(new_state, 'ALARM')
120
120
def test_maximum(self):
131
131
data.append(WatchData(23, now - datetime.timedelta(seconds=150)))
133
133
# all < 30 -> NORMAL
134
watcher = watchrule.WatchRule(context=self.ctx,
134
self.wr = watchrule.WatchRule(context=self.ctx,
135
135
watch_name="testwatch",
138
138
stack_id=self.stack_id,
139
139
last_evaluated=last)
141
new_state = watcher.get_alarm_state()
141
new_state = self.wr.get_alarm_state()
142
142
self.assertEqual(new_state, 'NORMAL')
144
144
data.append(WatchData(35, now - datetime.timedelta(seconds=150)))
145
watcher = watchrule.WatchRule(context=self.ctx,
145
self.wr = watchrule.WatchRule(context=self.ctx,
146
146
watch_name="testwatch",
149
149
stack_id=self.stack_id,
150
150
last_evaluated=last)
152
new_state = watcher.get_alarm_state()
152
new_state = self.wr.get_alarm_state()
153
153
self.assertEqual(new_state, 'ALARM')
155
155
def test_samplecount(self):
167
167
data.append(WatchData(1, now - datetime.timedelta(seconds=150)))
169
169
# only 2 samples -> NORMAL
170
watcher = watchrule.WatchRule(context=self.ctx,
170
self.wr = watchrule.WatchRule(context=self.ctx,
171
171
watch_name="testwatch",
174
174
stack_id=self.stack_id,
175
175
last_evaluated=last)
177
new_state = watcher.get_alarm_state()
177
new_state = self.wr.get_alarm_state()
178
178
self.assertEqual(new_state, 'NORMAL')
180
180
# only 3 samples -> ALARM
181
181
data.append(WatchData(1, now - datetime.timedelta(seconds=200)))
182
watcher = watchrule.WatchRule(context=self.ctx,
182
self.wr = watchrule.WatchRule(context=self.ctx,
183
183
watch_name="testwatch",
186
186
stack_id=self.stack_id,
187
187
last_evaluated=last)
189
new_state = watcher.get_alarm_state()
189
new_state = self.wr.get_alarm_state()
190
190
self.assertEqual(new_state, 'ALARM')
192
192
# only 3 samples (one old) -> NORMAL
194
194
data.append(WatchData(1, now - datetime.timedelta(seconds=400)))
195
watcher = watchrule.WatchRule(context=self.ctx,
195
self.wr = watchrule.WatchRule(context=self.ctx,
196
196
watch_name="testwatch",
199
199
stack_id=self.stack_id,
200
200
last_evaluated=last)
202
new_state = watcher.get_alarm_state()
202
new_state = self.wr.get_alarm_state()
203
203
self.assertEqual(new_state, 'NORMAL')
205
205
def test_sum(self):
216
216
data.append(WatchData(23, now - datetime.timedelta(seconds=150)))
218
218
# all < 40 -> NORMAL
219
watcher = watchrule.WatchRule(context=self.ctx,
219
self.wr = watchrule.WatchRule(context=self.ctx,
220
220
watch_name="testwatch",
223
223
stack_id=self.stack_id,
224
224
last_evaluated=last)
226
new_state = watcher.get_alarm_state()
226
new_state = self.wr.get_alarm_state()
227
227
self.assertEqual(new_state, 'NORMAL')
229
229
# sum > 100 -> ALARM
230
230
data.append(WatchData(85, now - datetime.timedelta(seconds=150)))
231
watcher = watchrule.WatchRule(context=self.ctx,
231
self.wr = watchrule.WatchRule(context=self.ctx,
232
232
watch_name="testwatch",
235
235
stack_id=self.stack_id,
236
236
last_evaluated=last)
238
new_state = watcher.get_alarm_state()
238
new_state = self.wr.get_alarm_state()
239
239
self.assertEqual(new_state, 'ALARM')
241
241
def test_ave(self):
251
251
data = [WatchData(117, now - datetime.timedelta(seconds=100))]
252
252
data.append(WatchData(23, now - datetime.timedelta(seconds=150)))
254
watcher = watchrule.WatchRule(context=self.ctx,
254
self.wr = watchrule.WatchRule(context=self.ctx,
255
255
watch_name="testwatch",
258
258
stack_id=self.stack_id,
259
259
last_evaluated=last)
261
new_state = watcher.get_alarm_state()
261
new_state = self.wr.get_alarm_state()
262
262
self.assertEqual(new_state, 'NORMAL')
264
264
data.append(WatchData(195, now - datetime.timedelta(seconds=250)))
265
watcher = watchrule.WatchRule(context=self.ctx,
265
self.wr = watchrule.WatchRule(context=self.ctx,
266
266
watch_name="testwatch",
269
269
stack_id=self.stack_id,
270
270
last_evaluated=last)
272
new_state = watcher.get_alarm_state()
272
new_state = self.wr.get_alarm_state()
273
273
self.assertEqual(new_state, 'ALARM')
275
@utils.wr_delete_after
275
276
def test_load(self):
276
277
# Insert two dummy watch rules into the DB
277
values = {'stack_id': self.stack_id,
279
'name': u'HttpFailureAlarm',
280
'rule': {u'EvaluationPeriods': u'1',
281
u'AlarmActions': [u'WebServerRestartPolicy'],
282
u'AlarmDescription': u'Restart the WikiDatabase',
283
u'Namespace': u'system/linux',
285
u'ComparisonOperator': u'GreaterThanThreshold',
286
u'Statistic': u'SampleCount',
288
u'MetricName': u'ServiceFailure'}}
289
db_ret = db_api.watch_rule_create(self.ctx, values)
290
self.assertNotEqual(db_ret, None)
291
values['name'] = 'AnotherWatch'
292
db_ret = db_api.watch_rule_create(self.ctx, values)
293
self.assertNotEqual(db_ret, None)
278
rule = {u'EvaluationPeriods': u'1',
279
u'AlarmActions': [u'WebServerRestartPolicy'],
280
u'AlarmDescription': u'Restart the WikiDatabase',
281
u'Namespace': u'system/linux',
283
u'ComparisonOperator': u'GreaterThanThreshold',
284
u'Statistic': u'SampleCount',
286
u'MetricName': u'ServiceFailure'}
288
self.wr.append(watchrule.WatchRule(context=self.ctx,
289
watch_name='HttpFailureAlarm',
292
stack_id=self.stack_id,
296
self.wr.append(watchrule.WatchRule(context=self.ctx,
297
watch_name='AnotherWatch',
300
stack_id=self.stack_id,
295
304
# Then use WatchRule.load() to retrieve each by name
296
305
# and check that the object properties match the data above
298
307
wr = watchrule.WatchRule.load(self.ctx, wn)
299
308
self.assertEqual(type(wr), watchrule.WatchRule)
300
309
self.assertEqual(wr.name, wn)
301
self.assertEqual(wr.state, values['state'])
302
self.assertEqual(wr.rule, values['rule'])
310
self.assertEqual(wr.state, 'NORMAL')
311
self.assertEqual(wr.rule, rule)
303
312
self.assertEqual(wr.timeperiod, datetime.timedelta(
304
seconds=int(values['rule']['Period'])))
307
db_api.watch_rule_delete(self.ctx, 'HttpFailureAlarm')
308
db_api.watch_rule_delete(self.ctx, 'AnotherWatch')
313
seconds=int(rule['Period'])))
315
@utils.wr_delete_after
310
316
def test_store(self):
311
317
rule = {u'EvaluationPeriods': u'1',
312
318
u'AlarmActions': [u'WebServerRestartPolicy'],
317
323
u'Statistic': u'SampleCount',
318
324
u'Threshold': u'2',
319
325
u'MetricName': u'ServiceFailure'}
320
wr = watchrule.WatchRule(context=self.ctx, watch_name='storetest',
321
stack_id=self.stack_id, rule=rule)
326
self.wr = watchrule.WatchRule(context=self.ctx, watch_name='storetest',
327
stack_id=self.stack_id, rule=rule)
324
330
dbwr = db_api.watch_rule_get_by_name(self.ctx, 'storetest')
325
331
self.assertNotEqual(dbwr, None)
346
350
# It's not time to evaluate, so should stay NODATA
347
351
last = now - datetime.timedelta(seconds=299)
348
352
data = WatchData(25, now - datetime.timedelta(seconds=150))
349
watcher = watchrule.WatchRule(context=self.ctx,
353
self.wr = watchrule.WatchRule(context=self.ctx,
350
354
watch_name="testwatch",
352
356
watch_data=[data],
353
357
stack_id=self.stack_id,
354
358
last_evaluated=last)
356
actions = watcher.evaluate()
357
self.assertEqual(watcher.state, 'NODATA')
360
actions = self.wr.evaluate()
361
self.assertEqual(self.wr.state, 'NODATA')
358
362
self.assertEqual(actions, [])
360
364
# now - last == Period, so should set NORMAL
361
365
last = now - datetime.timedelta(seconds=300)
362
366
data = WatchData(25, now - datetime.timedelta(seconds=150))
363
watcher = watchrule.WatchRule(context=self.ctx,
367
self.wr = watchrule.WatchRule(context=self.ctx,
364
368
watch_name="testwatch",
366
370
watch_data=[data],
367
371
stack_id=self.stack_id,
368
372
last_evaluated=last)
370
actions = watcher.evaluate()
371
self.assertEqual(watcher.state, 'NORMAL')
372
self.assertEqual(watcher.last_evaluated, now)
374
actions = self.wr.evaluate()
375
self.assertEqual(self.wr.state, 'NORMAL')
376
self.assertEqual(self.wr.last_evaluated, now)
373
377
self.assertEqual(actions, [])
375
379
# Now data breaches Threshold, so should set ALARM
376
380
last = now - datetime.timedelta(seconds=300)
377
381
data = WatchData(35, now - datetime.timedelta(seconds=150))
378
watcher = watchrule.WatchRule(context=self.ctx,
379
watch_name="testwatch",
382
stack_id=self.stack_id,
385
actions = watcher.evaluate()
386
self.assertEqual(watcher.state, 'ALARM')
387
self.assertEqual(watcher.last_evaluated, now)
388
self.assertEqual(actions, [])
382
self.wr = watchrule.WatchRule(context=self.ctx,
383
watch_name="testwatch",
386
stack_id=self.stack_id,
389
actions = self.wr.evaluate()
390
self.assertEqual(self.wr.state, 'ALARM')
391
self.assertEqual(self.wr.last_evaluated, now)
392
self.assertEqual(actions, [])
394
@utils.wr_delete_after
395
def test_evaluate_suspend(self):
396
rule = {'EvaluationPeriods': '1',
397
'MetricName': 'test_metric',
399
'Statistic': 'Maximum',
400
'ComparisonOperator': 'GreaterThanOrEqualToThreshold',
403
now = timeutils.utcnow()
404
self.m.StubOutWithMock(timeutils, 'utcnow')
405
timeutils.utcnow().MultipleTimes().AndReturn(now)
408
# Now data breaches Threshold, but we're suspended
409
last = now - datetime.timedelta(seconds=300)
410
data = WatchData(35, now - datetime.timedelta(seconds=150))
411
self.wr = watchrule.WatchRule(context=self.ctx,
412
watch_name="testwatch",
415
stack_id=self.stack_id,
418
self.wr.state_set(self.wr.SUSPENDED)
420
actions = self.wr.evaluate()
421
self.assertEqual(self.wr.state, self.wr.SUSPENDED)
422
self.assertEqual(actions, [])
424
@utils.wr_delete_after
390
425
def test_rule_actions_alarm_normal(self):
391
426
rule = {'EvaluationPeriods': '1',
392
427
'MetricName': 'test_metric',
402
437
# Set data so rule evaluates to NORMAL state
403
438
last = now - datetime.timedelta(seconds=300)
404
439
data = WatchData(25, now - datetime.timedelta(seconds=150))
405
watcher = watchrule.WatchRule(context=self.ctx,
440
self.wr = watchrule.WatchRule(context=self.ctx,
406
441
watch_name="testwatch",
408
443
watch_data=[data],
409
444
stack_id=self.stack_id,
410
445
last_evaluated=last)
412
actions = watcher.evaluate()
413
self.assertEqual(watcher.state, 'NORMAL')
447
actions = self.wr.evaluate()
448
self.assertEqual(self.wr.state, 'NORMAL')
414
449
self.assertEqual(actions, [])
415
450
self.m.VerifyAll()
452
@utils.wr_delete_after
417
453
def test_rule_actions_alarm_alarm(self):
418
454
rule = {'EvaluationPeriods': '1',
419
455
'MetricName': 'test_metric',
429
465
# Set data so rule evaluates to ALARM state
430
466
last = now - datetime.timedelta(seconds=300)
431
467
data = WatchData(35, now - datetime.timedelta(seconds=150))
432
watcher = watchrule.WatchRule(context=self.ctx,
468
self.wr = watchrule.WatchRule(context=self.ctx,
433
469
watch_name="testwatch",
435
471
watch_data=[data],
436
472
stack_id=self.stack_id,
437
473
last_evaluated=last)
439
actions = watcher.evaluate()
440
self.assertEqual(watcher.state, 'ALARM')
475
actions = self.wr.evaluate()
476
self.assertEqual(self.wr.state, 'ALARM')
441
477
self.assertEqual(actions, ['DummyAction'])
443
# re-set last_evaluated so the rule will be evaluated again,
444
# but since we're already in ALARM state, we should not generate
445
# any additional actions
479
# re-set last_evaluated so the rule will be evaluated again.
446
480
last = now - datetime.timedelta(seconds=300)
447
watcher.last_evaluated = last
448
actions = watcher.evaluate()
449
self.assertEqual(watcher.state, 'ALARM')
450
self.assertEqual(actions, [])
481
self.wr.last_evaluated = last
482
actions = self.wr.evaluate()
483
self.assertEqual(self.wr.state, 'ALARM')
484
self.assertEqual(actions, ['DummyAction'])
451
485
self.m.VerifyAll()
487
@utils.wr_delete_after
453
488
def test_rule_actions_alarm_two_actions(self):
454
489
rule = {'EvaluationPeriods': '1',
455
490
'MetricName': 'test_metric',
465
500
# Set data so rule evaluates to ALARM state
466
501
last = now - datetime.timedelta(seconds=300)
467
502
data = WatchData(35, now - datetime.timedelta(seconds=150))
468
watcher = watchrule.WatchRule(context=self.ctx,
503
self.wr = watchrule.WatchRule(context=self.ctx,
469
504
watch_name="testwatch",
471
506
watch_data=[data],
472
507
stack_id=self.stack_id,
473
508
last_evaluated=last)
475
actions = watcher.evaluate()
476
self.assertEqual(watcher.state, 'ALARM')
510
actions = self.wr.evaluate()
511
self.assertEqual(self.wr.state, 'ALARM')
477
512
self.assertEqual(actions, ['DummyAction', 'DummyAction'])
478
513
self.m.VerifyAll()
515
@utils.wr_delete_after
480
516
def test_rule_actions_ok_alarm(self):
481
517
rule = {'EvaluationPeriods': '1',
482
518
'MetricName': 'test_metric',
492
528
# On creation the rule evaluates to NODATA state
493
529
last = now - datetime.timedelta(seconds=300)
494
watcher = watchrule.WatchRule(context=self.ctx,
530
self.wr = watchrule.WatchRule(context=self.ctx,
495
531
watch_name="testwatch",
498
534
stack_id=self.stack_id,
499
535
last_evaluated=last)
501
actions = watcher.evaluate()
502
self.assertEqual(watcher.state, 'NODATA')
537
actions = self.wr.evaluate()
538
self.assertEqual(self.wr.state, 'NODATA')
503
539
self.assertEqual(actions, [])
505
541
# Move time forward and add data below threshold so we transition from
510
546
self._action_set_stubs(now)
512
548
data = WatchData(25, now - datetime.timedelta(seconds=150))
513
watcher.watch_data = [data]
549
self.wr.watch_data = [data]
515
actions = watcher.evaluate()
516
self.assertEqual(watcher.state, 'NORMAL')
551
actions = self.wr.evaluate()
552
self.assertEqual(self.wr.state, 'NORMAL')
517
553
self.assertEqual(actions, ['DummyAction'])
518
554
self.m.VerifyAll()
556
@utils.wr_delete_after
520
557
def test_rule_actions_nodata(self):
521
558
rule = {'EvaluationPeriods': '1',
522
559
'MetricName': 'test_metric',
532
569
# Set data so rule evaluates to ALARM state
533
570
last = now - datetime.timedelta(seconds=300)
534
571
data = WatchData(35, now - datetime.timedelta(seconds=150))
535
watcher = watchrule.WatchRule(context=self.ctx,
572
self.wr = watchrule.WatchRule(context=self.ctx,
536
573
watch_name="testwatch",
538
575
watch_data=[data],
539
576
stack_id=self.stack_id,
540
577
last_evaluated=last)
542
actions = watcher.evaluate()
543
self.assertEqual(watcher.state, 'ALARM')
579
actions = self.wr.evaluate()
580
self.assertEqual(self.wr.state, 'ALARM')
544
581
self.assertEqual(actions, [])
546
583
# Move time forward and don't add data so we transition from
550
587
self.m.UnsetStubs()
551
588
self._action_set_stubs(now)
553
actions = watcher.evaluate()
554
self.assertEqual(watcher.state, 'NODATA')
590
actions = self.wr.evaluate()
591
self.assertEqual(self.wr.state, 'NODATA')
555
592
self.assertEqual(actions, ['DummyAction'])
556
593
self.m.VerifyAll()
595
@utils.wr_delete_after
558
596
def test_create_watch_data(self):
559
597
rule = {u'EvaluationPeriods': u'1',
560
598
u'AlarmDescription': u'test alarm',
563
601
u'Statistic': u'SampleCount',
564
602
u'Threshold': u'2',
565
603
u'MetricName': u'CreateDataMetric'}
566
wr = watchrule.WatchRule(context=self.ctx,
567
watch_name='create_data_test',
568
stack_id=self.stack_id, rule=rule)
604
self.wr = watchrule.WatchRule(context=self.ctx,
605
watch_name='create_data_test',
606
stack_id=self.stack_id, rule=rule)
572
610
data = {u'CreateDataMetric': {"Unit": "Counter",
574
612
"Dimensions": []}}
575
wr.create_watch_data(data)
613
self.wr.create_watch_data(data)
577
615
dbwr = db_api.watch_rule_get_by_name(self.ctx, 'create_data_test')
578
616
self.assertEqual(dbwr.watch_data[0].data, data)
584
622
# correctly get a list of all datapoints where watch_rule_id ==
585
623
# watch_rule.id, so leave it as a single-datapoint test for now.
588
db_api.watch_rule_delete(self.ctx, 'create_data_test')
625
@utils.wr_delete_after
626
def test_create_watch_data_suspended(self):
627
rule = {u'EvaluationPeriods': u'1',
628
u'AlarmDescription': u'test alarm',
630
u'ComparisonOperator': u'GreaterThanThreshold',
631
u'Statistic': u'SampleCount',
633
u'MetricName': u'CreateDataMetric'}
634
self.wr = watchrule.WatchRule(context=self.ctx,
635
watch_name='create_data_test',
636
stack_id=self.stack_id, rule=rule,
637
state=watchrule.WatchRule.SUSPENDED)
641
data = {u'CreateDataMetric': {"Unit": "Counter",
644
self.wr.create_watch_data(data)
646
dbwr = db_api.watch_rule_get_by_name(self.ctx, 'create_data_test')
647
self.assertEqual(dbwr.watch_data, [])
649
def test_destroy(self):
650
rule = {'EvaluationPeriods': '1',
651
'MetricName': 'test_metric',
652
'AlarmActions': ['DummyAction'],
654
'Statistic': 'Maximum',
655
'ComparisonOperator': 'GreaterThanOrEqualToThreshold',
658
last = timeutils.utcnow()
659
self.wr = watchrule.WatchRule(context=self.ctx,
660
watch_name="testwatch_destroy",
663
stack_id=self.stack_id,
668
check = watchrule.WatchRule.load(context=self.ctx,
669
watch_name="testwatch_destroy")
670
self.assertTrue(isinstance(check, watchrule.WatchRule))
673
self.assertRaises(exception.WatchRuleNotFound,
674
watchrule.WatchRule.load, context=self.ctx,
675
watch_name="testwatch_destroy")
677
def test_state_set(self):
678
rule = {'EvaluationPeriods': '1',
679
'MetricName': 'test_metric',
680
'AlarmActions': ['DummyAction'],
682
'Statistic': 'Maximum',
683
'ComparisonOperator': 'GreaterThanOrEqualToThreshold',
686
last = timeutils.utcnow()
687
watcher = watchrule.WatchRule(context=self.ctx,
688
watch_name="testwatch_set_state",
691
stack_id=self.stack_id,
694
watcher.state_set(watcher.SUSPENDED)
695
self.assertEqual(watcher.state, watcher.SUSPENDED)
697
check = watchrule.WatchRule.load(context=self.ctx,
698
watch_name="testwatch_set_state")
699
self.assertEqual(check.state, watchrule.WatchRule.SUSPENDED)
590
701
def test_set_watch_state(self):
591
702
rule = {'EvaluationPeriods': '1',
602
713
# Set data so rule evaluates to ALARM state
603
714
last = now - datetime.timedelta(seconds=200)
604
watcher = watchrule.WatchRule(context=self.ctx,
715
self.wr = watchrule.WatchRule(context=self.ctx,
605
716
watch_name="testwatch",
608
719
stack_id=self.stack_id,
609
720
last_evaluated=last)
611
actions = watcher.set_watch_state(watchrule.WatchRule.NODATA)
612
self.assertEqual(actions, [])
614
actions = watcher.set_watch_state(watchrule.WatchRule.NORMAL)
615
self.assertEqual(actions, [])
617
actions = watcher.set_watch_state(watchrule.WatchRule.ALARM)
722
actions = self.wr.set_watch_state(watchrule.WatchRule.NODATA)
723
self.assertEqual(actions, [])
725
actions = self.wr.set_watch_state(watchrule.WatchRule.NORMAL)
726
self.assertEqual(actions, [])
728
actions = self.wr.set_watch_state(watchrule.WatchRule.ALARM)
618
729
self.assertEqual(actions, ['DummyAction'])
619
730
self.m.VerifyAll()
630
741
now = timeutils.utcnow()
632
743
last = now - datetime.timedelta(seconds=200)
633
watcher = watchrule.WatchRule(context=self.ctx,
744
self.wr = watchrule.WatchRule(context=self.ctx,
634
745
watch_name="testwatch",
637
748
stack_id=self.stack_id,
638
749
last_evaluated=last)
640
self.assertRaises(ValueError, watcher.set_watch_state, None)
751
self.assertRaises(ValueError, self.wr.set_watch_state, None)
642
self.assertRaises(ValueError, watcher.set_watch_state, "BADSTATE")
753
self.assertRaises(ValueError, self.wr.set_watch_state, "BADSTATE")