-
-
Save TimSimmons/cb8fbba9b1c3c73a1ba4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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