Callback handlers are now idempotent.
The sandbox demo now uses a list of callback handlers with separate trigger and commit phases. Idempotent work should only be done during the commit() call. Temporary work can be stored in the callback's 'scratchpad' dictionary until commit() is called.
This commit is contained in:
parent
c988c39988
commit
f4839a6b28
@ -6,25 +6,73 @@ from oahu import pipeline_callback
|
||||
from oahu import criteria
|
||||
|
||||
|
||||
class Callback(pipeline_callback.PipelineCallback):
|
||||
def on_trigger(self, stream):
|
||||
print "Processing", stream
|
||||
# We determine which operation this is by the first of these we see.
|
||||
OPERATIONS = [
|
||||
'compute.instance.shutdown.start',
|
||||
'compute.instance.delete.start',
|
||||
'compute.instance.snapshot.start',
|
||||
'compute.instance.create.start',
|
||||
'compute.instance.reboot.start',
|
||||
'compute.instance.rebuild.start',
|
||||
'compute.instance.resize.start',
|
||||
'compute.instance.finish_resize.start',
|
||||
'compute.instance.resize.confirm.start',
|
||||
'compute.instance.resize.prep.start',
|
||||
'compute.instance.power_off.start',
|
||||
'compute.instance.rescue.start',
|
||||
'compute.instance.unrescue.start',
|
||||
]
|
||||
|
||||
|
||||
class RequestIdCallback(pipeline_callback.PipelineCallback):
|
||||
def on_trigger(self, stream, scratchpad):
|
||||
if not len(stream.events):
|
||||
return
|
||||
|
||||
# Try to guess the operation by the first know event_type ...
|
||||
operation = None
|
||||
for e in stream.events:
|
||||
if e['event_type'] in OPERATIONS:
|
||||
operation = e['event_type']
|
||||
break
|
||||
scratchpad['operation'] = operation
|
||||
|
||||
# How long did this operation take?
|
||||
first = stream.events[0]
|
||||
last = stream.events[-1]
|
||||
delta = last['timestamp'] - first['timestamp']
|
||||
|
||||
scratchpad['request_id'] = first['_context_request_id']
|
||||
scratchpad['delta'] = delta
|
||||
|
||||
def commit(self, stream, scratchpad):
|
||||
print "Req: %s %s time delta = %s" % (scratchpad['request_id'],
|
||||
scratchpad['operation'],
|
||||
scratchpad['delta'])
|
||||
|
||||
|
||||
class EodExistsCallback(pipeline_callback.PipelineCallback):
|
||||
def on_trigger(self, stream, scratchpad):
|
||||
print "EOD-Exists:", stream
|
||||
#for event in stream.events:
|
||||
# print event['timestamp'], event['event_type']
|
||||
|
||||
def commit(self, stream, scratchpad):
|
||||
pass
|
||||
|
||||
|
||||
class Config(oahu.config.Config):
|
||||
def get_driver(self, callback=None):
|
||||
if not callback:
|
||||
self.callback = Callback()
|
||||
else:
|
||||
self.callback = callback
|
||||
def get_driver(self):
|
||||
self.request_id_callback = RequestIdCallback()
|
||||
self.eod_exists_callback = EodExistsCallback()
|
||||
|
||||
# Trigger names have to be consistent across all workers
|
||||
# (yagi and daemons).
|
||||
by_request = trigger_definition.TriggerDefinition("request-id",
|
||||
["_context_request_id", ],
|
||||
criteria.Inactive(60),
|
||||
self.callback,
|
||||
debug=True)
|
||||
["_context_request_id", ],
|
||||
criteria.Inactive(60),
|
||||
[self.request_id_callback,],
|
||||
debug=True)
|
||||
|
||||
# This trigger requires a Trait called "when_date" which is
|
||||
# the date-only portion of the "when" trait. We will create
|
||||
@ -34,7 +82,8 @@ class Config(oahu.config.Config):
|
||||
["payload/instance_id", "audit_bucket"],
|
||||
criteria.EndOfDayExists(
|
||||
'compute.instance.exists'),
|
||||
self.callback, debug=True,
|
||||
[self.eod_exists_callback,],
|
||||
debug=True,
|
||||
dumper=debugging.DetailedDumper())
|
||||
|
||||
triggers = [by_request, instance_usage]
|
||||
|
Loading…
x
Reference in New Issue
Block a user