in source/lambda/schedulers/ec2_service.py [0:0]
def start_instances(self, kwargs):
def is_in_starting_state(state):
return (state & 0xFF) in Ec2Service.EC2_STARTING_STATES
self._init_scheduler(kwargs)
instances_to_start = kwargs[schedulers.PARAM_STARTED_INSTANCES]
start_tags = kwargs[schedulers.PARAM_CONFIG].started_tags
if start_tags is None:
start_tags = []
start_tags_key_names = [t["Key"] for t in start_tags]
stop_tags_keys = [{"Key": t["Key"]} for t in kwargs[schedulers.PARAM_CONFIG].stopped_tags if
t["Key"] not in start_tags_key_names]
client = get_client_with_retries("ec2", ["start_instances", "describe_instances", "create_tags", "delete_tags"],
context=self._context, session=self._session, region=self._region)
if os.environ['START_EC2_BATCH_SIZE'] is not None:
try:
START_BATCH_SIZE = int(os.environ['START_EC2_BATCH_SIZE'])
except Exception as ex:
self._logger.info(ex)
for instance_batch in self.instance_batches(instances_to_start, START_BATCH_SIZE):
instance_ids = [i.id for i in list(instance_batch)]
try:
start_resp = client.start_instances_with_retries(InstanceIds=instance_ids)
instances_starting = [i["InstanceId"] for i in start_resp.get("StartingInstances", []) if
is_in_starting_state(i.get("CurrentState", {}).get("Code", ""))]
get_status_count = 0
if len(instances_starting) < len(instance_ids):
time.sleep(5)
instances_starting = [i["InstanceId"] for i in self.get_instance_status(client, instance_ids) if
is_in_starting_state(i.get("State", {}).get("Code", ""))]
if len(instances_starting) == len(instance_ids):
break
get_status_count += 1
if get_status_count > 3:
for i in instance_ids:
if i not in instances_starting:
self._logger.warning(WARNING_INSTANCE_NOT_STARTING, i)
break
if len(instances_starting) > 0:
try:
if stop_tags_keys is not None and len(stop_tags_keys) > 0:
self._logger.info(INFO_REMOVING_KEYS, "stop",
",".join(["\"{}\"".format(k["Key"]) for k in stop_tags_keys]),
",".join(instances_starting))
client.delete_tags_with_retries(Resources=instances_starting, Tags=stop_tags_keys)
if len(start_tags) > 0:
self._logger.info(INF_ADD_KEYS, "start", str(start_tags), ",".join(instances_starting))
client.create_tags_with_retries(Resources=instances_starting, Tags=start_tags)
except Exception as ex:
self._logger.warning(WARN_STARTED_INSTANCES_TAGGING, ','.join(instances_starting), str(ex))
for i in instances_starting:
yield i, InstanceSchedule.STATE_RUNNING
except Exception as ex:
self._logger.error(ERR_STARTING_INSTANCES, ",".join(instance_ids), str(ex))