Example #1
0
def _create_cloud_watch_rule_from_meta(name, meta, region):
    # validation depends on rule type
    required_parameters = ['rule_type']
    rule_type = meta.get('rule_type')
    if rule_type:
        if rule_type == 'schedule':
            required_parameters.append('expression')
    validate_params(name, meta, required_parameters)

    event_buses = meta.get('event_bus_accounts')
    response = CONN.cw_events(region).get_rule(name)
    if response:
        _LOG.warn('%s rule exists in %s.', name, region)
        return describe_rule(name=name, meta=meta, region=region,
                             response=response)
    try:
        func = RULE_TYPES[rule_type]
        func(name, meta, CONN.cw_events(region))
        if event_buses:
            time.sleep(5)
            _attach_tenant_rule_targets(name, region, event_buses)
        _LOG.info('Created cloud watch rule %s in %s.', name, region)
        response = CONN.cw_events(region).get_rule(name)
        time.sleep(5)
        return describe_rule(name=name, meta=meta, region=region,
                             response=response)
    except KeyError:
        raise AssertionError(
            'Invalid rule type: {0} for resource {1}. '
            'Please, change rule type with existing: '
            'schedule|ec2|api_call.'.format(rule_type, name))
Example #2
0
def _create_cloud_watch_trigger_from_meta(topic_name, trigger_meta, region):
    required_parameters = ['target_rule']
    validate_params(topic_name, trigger_meta, required_parameters)
    rule_name = trigger_meta['target_rule']

    topic_arn = CONN.sns(region).get_topic_arn(topic_name)
    CONN.cw_events(region).add_rule_target(rule_name, topic_arn)
    CONN.sns(region).allow_service_invoke(topic_arn, 'events.amazonaws.com')
    _LOG.info('SNS topic %s subscribed to cloudwatch rule %s', topic_name,
              rule_name)
Example #3
0
def _remove_cloud_watch_rule(arn, config):
    region = arn.split(':')[3]
    resource_name = config['resource_name']
    try:
        CONN.cw_events(region).remove_rule(resource_name)
        _LOG.info('Rule %s was removed', resource_name)
    except ClientError as e:
        exception_type = e.response['Error']['Code']
        if exception_type == 'ResourceNotFoundException':
            _LOG.warn('Rule %s is not found', resource_name)
        else:
            raise e
def _create_cloud_watch_trigger_from_meta(lambda_name, lambda_arn, role_name,
                                          trigger_meta):
    required_parameters = ['target_rule']
    validate_params(lambda_name, trigger_meta, required_parameters)
    rule_name = trigger_meta['target_rule']

    rule_arn = CONN.cw_events().get_rule_arn(rule_name)
    CONN.cw_events().add_rule_target(rule_name, lambda_arn)
    _LAMBDA_CONN.add_invocation_permission(lambda_arn, 'events.amazonaws.com',
                                           rule_arn)
    _LOG.info('Lambda %s subscribed to cloudwatch rule %s', lambda_name,
              rule_name)
Example #5
0
def _attach_tenant_rule_targets(rule_name, region, event_buses):
    for event_bus in event_buses:
        target_arn = 'arn:aws:events:{0}:{1}:event-bus/default'.format(region,
                                                                       event_bus)
        existing_targets = CONN.cw_events(region).list_targets_by_rule(
            rule_name=rule_name)
        for target in existing_targets:
            if target['Arn'] == target_arn:
                _LOG.debug('Target to event bus %s is already attached',
                           target_arn)
                return
        CONN.cw_events(region).add_rule_target(rule_name=rule_name,
                                               target_arn=target_arn)
def _create_cloud_watch_trigger_from_meta(name, trigger_meta):
    required_parameters = ['target_rule', 'input', 'iam_role']
    validate_params(name, trigger_meta, required_parameters)
    rule_name = trigger_meta['target_rule']
    input = trigger_meta['input']
    sf_role = trigger_meta['iam_role']

    sf_arn = _build_sm_arn(name, CONFIG.region)
    sf_description = _SF_CONN.describe_state_machine(arn=sf_arn)
    if sf_description.get('status') == 'ACTIVE':
        sf_role_arn = _IAM_CONN.check_if_role_exists(sf_role)
        if sf_role_arn:
            CONN.cw_events().add_rule_sf_target(rule_name, sf_arn, input,
                                                sf_role_arn)
            _LOG.info('State machine %s subscribed to cloudwatch rule %s',
                      name, rule_name)
Example #7
0
def describe_rule_from_meta(name, meta):
    new_region_args = create_args_for_multi_region(
        [
            {'name': name,
             'meta': meta}
        ],
        ALL_REGIONS)
    responses = []
    for arg in new_region_args:
        rule = CONN.cw_events(arg['region']).get_rule(name)
        if rule:
            responses.append(rule)

    description = []
    for rule in responses:
        arn = rule['Arn']
        del rule['Arn']
        description.append({arn: build_description_obj(rule, name, meta)})
    return description
Example #8
0
def describe_rule(name, meta, region, response=None):
    if not response:
        response = CONN.cw_events(region).get_rule(name)
    arn = response['Arn']
    del response['Arn']
    return {arn: build_description_obj(response, name, meta)}