Odyssey
sched.py
1 #!/usr/bin/env python
2 """
3 HomeCU tool for interacting with schedulers for stacks
4 """
5 
6 import boto3
7 import shellish
8 import subprocess
9 from . import s3, base, cloudformation
10 
11 
13  '''Manage stack scheduler'''
14  name = 'sched'
15  allowed_states = {'active'}
16 
17  def setup_args(self, parser):
18  self.add_subcommand(ReloadCommand)
19 
20 
22  """ Reload Scheduler of an Odyssey stack"""
23 
24  name = 'reload'
25  min_version = '0.8.0'
26  allowed_states = {'active'}
27 
28  def setup_args(self, parser):
29  self.add_stack_argument()
30  self.add_argument('--verbose', '-v', action='store_true')
31  self.add_argument('--passphrase', env='ODYSSEY_STACK_PASSPHRASE',
32  help='To avoid being prompted for a passphrase on '
33  'protected stacks, you can set it on the command '
34  'line or via the env.')
35 
36  def run(self, args):
37  stack = self.get_stack(args.stack)
38  if stack is None:
39  raise SystemExit('Stack not found: %s' % args.stack)
40  stack.check_passphrase(args.passphrase)
41  self.check_requirements(stack)
42  try:
43  shellish.vtmlprint("restarting scheduler for %s..." % stack.name)
44  self.restart_scheduler(args, stack)
45  shellish.vtmlprint("done.")
46  except Exception as ex:
47  if args.verbose:
48  print(ex)
49  stack.update_state('partial_deploy')
50  stack._save('Restart of scheduler resulted in errors')
51  raise
52  else:
53  stack.update_state('active')
54  stack._save('Restarted scheduler service')
55 
56  def restart_scheduler(self, args, stack):
57  '''Restart scheduler service for stack'''
58  client = boto3.client('ecs', region_name=stack.region)
59  cluster = stack.cluster
60  cfn_stack = cloudformation.describe_stack(stack)
61  services = [x['OutputValue'] for x in cfn_stack['Outputs']
62  if 'Service' in x['OutputKey']]
63  sched_service = [x for x in services if 'sched' in x.lower()][-1]
64  for task in self.get_service_task_arns(client, cluster, sched_service):
65  client.stop_task(
66  cluster=cluster,
67  task=task,
68  reason='Restarting scheduler, reloading crontab'
69  )
70 
71  def get_service_task_arns(self, client, cluster, service):
72  '''return task arns for service'''
73  response = client.list_tasks(cluster=cluster, serviceName=service)
74  if response['ResponseMetadata']['HTTPStatusCode'] != 200:
75  shellish.vtmlprint("<red>Error while getting tasks</red>")
76  return []
77  return response['taskArns']
78 
79 
80 def cmd(*args, verbose=False):
81  cmd = ' '.join(map(str, args))
82  shellish.vtmlprint("<b>Running:</b> <blue>%s</blue>" % cmd)
83  if not verbose:
84  cmd += ' >/dev/null'
85  subprocess.check_call(cmd, shell=True)
def get_service_task_arns(self, client, cluster, service)
Definition: sched.py:71
def restart_scheduler(self, args, stack)
Definition: sched.py:56
def add_stack_argument(self, *args, env=DEFAULT_STACK_ENV, help=None, metavar='STACK_NAME', **kwargs)
Definition: base.py:56
def get_stack(self, name)
Definition: s3.py:136
def check_requirements(self, stack)
Definition: base.py:65