aws/hhvm1/lambdas/health_check.py (29 lines of code) (raw):
# Copyright (c) 2017-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import boto3
from activities import Activity
from common import all_execution_events, skip_ec2
def lambda_handler(event, context=None):
if skip_ec2(event):
# Nothing to check if this is a test run with no EC2 -- quit (and don't
# repeat).
return False
events = all_execution_events(event['execution'])
# Quit (and don't repeat) if we've reached the end state.
for e in events:
if e.get('stateEnteredEventDetails', {}).get('name') == event['endState']:
return False
# The actual health check: Find any activities that are scheduled but not
# started and make sure there's a worker ready for each.
ec2 = boto3.client('ec2')
for activity_class in get_pending_activities(events):
activity = activity_class(event)
if activity.needs_ec2_worker():
ec2.run_instances(**activity.ec2_params())
# Wait and repeat.
return True
def get_pending_activities(events):
started_event_ids = {
e['previousEventId'] for e in events if e['type'] == 'ActivityStarted'
}
pending_arns = {
e['activityScheduledEventDetails']['resource'] for e in events
if e['type'] == 'ActivityScheduled' and not e['id'] in started_event_ids
}
if not pending_arns:
return []
return [
a for a in Activity.__subclasses__() if a.activity_arn in pending_arns
]