Skip to content

Instantly share code, notes, and snippets.

@TimSimmons
Last active February 8, 2016 18:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TimSimmons/cb8fbba9b1c3c73a1ba4 to your computer and use it in GitHub Desktop.
Save TimSimmons/cb8fbba9b1c3c73a1ba4 to your computer and use it in GitHub Desktop.
$ python task.py
Starting Task Task
Starting Task PeriodicRecovery
Starting Task RecoverZone
Starting Task CreateZone
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone midcycle.com. on ns1.foo.com.
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone midcycle.com. on ns2.foo.com.
Finished Task: CreateZone
Finished Task: RecoverZone
recovered zone midcycle.com.
Starting Task RecoverZone
Starting Task CreateZone
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone poo.com. on ns1.foo.com.
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone poo.com. on ns2.foo.com.
Finished Task: CreateZone
Finished Task: RecoverZone
recovered zone poo.com.
Starting Task RecoverZone
Starting Task CreateZone
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone blah.com. on ns1.foo.com.
Starting Task CreateZoneOnTarget
Finished Task: CreateZoneOnTarget
created zone blah.com. on ns2.foo.com.
Finished Task: CreateZone
Finished Task: RecoverZone
recovered zone blah.com.
Finished Task: PeriodicRecovery
Finished Task: Task
class Task(object):
def __init__(self, inherited_state=None, **kwargs):
self.__name__ = self.__class__.__name__ # hack
self.state = inherited_state or {}
self.required_state = {}
self.run_list = []
self.options = {}
self.pre(**kwargs)
def __call__(self):
# DO NOT EDIT
return self.run()
def pre(self, **kwargs):
pass
def post(self):
print("Finished Task: %s" % self.__name__)
pass
def validate_state(self):
# DO NOT EDIT
for validation_function in self.required_state.keys():
validation_function(self.state)
def run(self):
# DO NOT EDIT
print("Starting Task %s" % self.__name__)
self.validate_state()
ret = None
for step in self.run_list:
ret = step()
if ret:
self.state[step.func_name] = ret
self.post()
return ret
class PeriodicRecovery(Task):
def pre(self):
self.run_list = [
self.get_errored_zones,
self.recover_zones
]
def get_errored_zones(self):
self.state['recover_zones'] = [
'midcycle.com.',
'poo.com.',
'blah.com.'
]
def recover_zones(self):
for zone in self.state['recover_zones']:
RecoverZone(zone=zone)()
print("recovered zone %s" % zone)
class RecoverZone(Task):
def pre(self, **kwargs):
self.zone = kwargs['zone']
self.run_list = [
self.recover_zone
]
def recover_zone(self):
# In threads
# check action (CREATE|UPDATE|DELETE)
CreateZone(zone=self.zone)()
class CreateZone(Task):
def pre(self, **kwargs):
# assert_kwargs validator
self.zone = kwargs['zone']
self.run_list = [
self.get_targets,
self.create_zone
]
def get_targets(self):
self.state['targets'] = [
'ns1.foo.com.',
'ns2.foo.com.'
]
def create_zone(self):
for target in self.state['targets']:
CreateZoneOnTarget(zone=self.zone, target=target)()
print("created zone %s on %s" % (self.zone, target))
class CreateZoneOnTarget(Task):
def pre(self, **kwargs):
self.target = kwargs['target']
self.zone = kwargs['zone']
self.run_list = [
self.create_zone
]
def create_zone(self):
try:
result = True # self.target.backend.create_zone(self.zone)
except Exception:
result = False
return result
t = Task()
t.run_list = [PeriodicRecovery()]
t.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment