def instances_restart_cmd(args): if not are_you_sure('restart version {}'.format(describe_current_release(args)), args): return # Store old motd events = get_events(args) old_motd = events['motd'] events['motd'] = old_motd if args['motd'] == '' else args['motd'] save_events(args, events) modified_groups = {} failed = False for instance in pick_instances(args): logger.info("Restarting {}...".format(instance)) as_instance_status = instance.describe_autoscale() as_group_name = as_instance_status['AutoScalingGroupName'] if as_instance_status['LifecycleState'] != 'InService': logger.error("Skipping {} as it is not InService ({})".format(instance, as_instance_status)) continue try: restart_one_instance(as_group_name, instance, modified_groups) except Exception as e: logger.error("Failed restarting {} - skipping: {}".format(instance, e)) failed = True # TODO, what here? for group, desired in iter(modified_groups.items()): logger.info("Putting desired instances for {} back to {}".format(group, desired)) as_client.update_auto_scaling_group(AutoScalingGroupName=group, DesiredCapacity=desired) # Events might have changed, re-fetch events = get_events(args) events['motd'] = old_motd save_events(args, events) sys.exit(1 if failed else 0)
def environment_stop(cfg: Config): """Stops an environment.""" if cfg.env == Environment.PROD: print('Operation aborted. This would bring down the site') print( 'If you know what you are doing, edit the code in bin/lib/ce.py, function environment_stop_cmd' ) elif are_you_sure('stop environment', cfg): for asg in get_autoscaling_groups_for(cfg): group_name = asg['AutoScalingGroupName'] if asg['MinSize'] > 0: print( f"Skipping ASG {group_name} as it has a non-zero min size") continue prev = asg['DesiredCapacity'] if not prev: print( f"Skipping ASG {group_name} as it already zero desired capacity" ) continue print( f"Updating {group_name} to have desired capacity 0 (from {prev})" ) as_client.update_auto_scaling_group( AutoScalingGroupName=group_name, DesiredCapacity=0)
def environment_stop_cmd(args): for asg in get_autoscaling_groups_for(args): group_name = asg['AutoScalingGroupName'] if asg['MinSize'] > 0: print(f"Skipping ASG {group_name} as it has a non-zero min size") continue prev = asg['DesiredCapacity'] if not prev: print(f"Skipping ASG {group_name} as it already zero desired capacity") continue print(f"Updating {group_name} to have desired capacity 0 (from {prev})") as_client.update_auto_scaling_group(AutoScalingGroupName=group_name, DesiredCapacity=0)
def instances_restart_cmd(args): if not are_you_sure( 'restart all instances with version {}'.format( describe_current_release(args)), args): return # Store old motd begin_time = datetime.datetime.now() events = get_events(args) old_motd = events['motd'] events['motd'] = old_motd if args['motd'] == '' else args['motd'] save_events(args, events) modified_groups = {} failed = False for instance in pick_instances(args): logger.info("Restarting %s...", instance) as_instance_status = instance.describe_autoscale() if not as_instance_status: logger.warning("Skipping %s as it is no longer in the ASG", instance) continue as_group_name = as_instance_status['AutoScalingGroupName'] if as_instance_status['LifecycleState'] != 'InService': logger.warning("Skipping %s as it is not InService (%s)", instance, as_instance_status) continue try: restart_one_instance(as_group_name, instance, modified_groups) except RuntimeError as e: logger.error("Failed restarting %s - skipping: %s", instance, e) failed = True # TODO, what here? for group, desired in iter(modified_groups.items()): logger.info("Putting desired instances for %s back to %s", group, desired) as_client.update_auto_scaling_group(AutoScalingGroupName=group, DesiredCapacity=desired) # Events might have changed, re-fetch events = get_events(args) events['motd'] = old_motd save_events(args, events) end_time = datetime.datetime.now() delta_time = end_time - begin_time print(f'Instances restarted in {delta_time.total_seconds()} seconds') sys.exit(1 if failed else 0)
def environment_start(cfg: Config): """Starts up an environment by ensure its ASGs have capacity.""" for asg in get_autoscaling_groups_for(cfg): group_name = asg['AutoScalingGroupName'] if asg['MinSize'] > 0: print(f"Skipping ASG {group_name} as it has a non-zero min size") continue prev = asg['DesiredCapacity'] if prev: print( f"Skipping ASG {group_name} as it has non-zero desired capacity" ) continue print( f"Updating {group_name} to have desired capacity 1 (from {prev})") as_client.update_auto_scaling_group(AutoScalingGroupName=group_name, DesiredCapacity=1)
def instances_restart(cfg: Config, motd: str): """Restart the instances, picking up new code.""" if not are_you_sure( 'restart all instances with version {}'.format( describe_current_release(cfg)), cfg): return begin_time = datetime.datetime.now() # Store old motd old_motd = update_motd(cfg, motd) modified_groups: Dict[str, int] = {} failed = False to_restart = pick_instances(cfg) for index, instance in enumerate(to_restart): logger.info("Restarting %s (%d of %d)...", instance, index + 1, len(to_restart)) as_instance_status = instance.describe_autoscale() if not as_instance_status: logger.warning("Skipping %s as it is no longer in the ASG", instance) continue as_group_name = as_instance_status['AutoScalingGroupName'] if as_instance_status['LifecycleState'] != 'InService': logger.warning("Skipping %s as it is not InService (%s)", instance, as_instance_status) continue try: restart_one_instance(as_group_name, instance, modified_groups) except RuntimeError as e: logger.error("Failed restarting %s - skipping: %s", instance, e) failed = True # TODO, what here? for group, desired in iter(modified_groups.items()): logger.info("Putting desired instances for %s back to %d", group, desired) as_client.update_auto_scaling_group(AutoScalingGroupName=group, DesiredCapacity=desired) update_motd(cfg, old_motd) end_time = datetime.datetime.now() delta_time = end_time - begin_time print(f'Instances restarted in {delta_time.total_seconds()} seconds') sys.exit(1 if failed else 0)