def its_key_is_not_value(_step_obj, key, value, dict_value=None, address=Null):
    orig_key = key
    if key == 'reference':
        if address is not Null:
            key = Defaults.r_mount_addr_ptr
        elif address is Null:
            key = Defaults.r_mount_addr_ptr_list

    key = str(key).lower()
    found_list = []
    for obj in _step_obj.context.stash:
        object_key = obj.get(key, Null)

        if object_key is Null:
            object_key = obj.get('values', {})
            if isinstance(object_key, list):
                object_keys = []
                for object_key_element in object_key:
                    if str(object_key_element.get(key, Null)).lower() != str(value).lower():
                        object_keys.append(object_key_element.get(key, Null))

                object_key = [keys for keys in object_keys if keys is not Null]
            else:
                object_key = object_key.get(key, Null)

        if address is not Null and isinstance(object_key, dict) and address in object_key:
            object_key = object_key.get(address, Null)

        if isinstance(object_key, str):
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if object_key != value:
                found_list.append(obj)

        elif isinstance(object_key, (int, bool)) and str(object_key).lower() != str(value).lower():
            found_list.append(obj)

        elif isinstance(object_key, list) and value not in object_key:
            found_list.append(obj)

        elif isinstance(object_key, dict):
            if value not in object_key.keys() or (dict_value is not None and (str(object_key[value]).lower() != str(dict_value).lower())):
                found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(found_list)
    else:
        if object_key is Null:
            skip_step(_step_obj, message='Could not find {} in {}.'.format(key,
                                                                     ', '.join(_step_obj.context.addresses)))
        elif dict_value is None:
            skip_step(_step_obj, message='Found {} {} in {}.'.format(value, orig_key,
                                                                     ', '.join(_step_obj.context.addresses)))
        else:
            skip_step(_step_obj, message='Found {}={} {} in {}.'.format(value, dict_value, orig_key,
                                                                        ', '.join(_step_obj.context.addresses)))
예제 #2
0
def its_key_is_value(_step_obj, key, value):
    orig_key = key
    if key == 'reference':
        key = Defaults.address_pointer

    found_list = []
    for obj in _step_obj.context.stash:
        object_key = obj.get('values', {})
        if isinstance(object_key, list):
            object_keys = []
            for object_key_element in object_key:
                if isinstance(object_key_element, dict):
                    filtered_key = object_key_element.get(key)
                    filtered_key = str(filtered_key) if isinstance(
                        filtered_key, (int, bool)) else filtered_key

                    if isinstance(
                            filtered_key,
                            str) and filtered_key.lower() == value.lower():
                        found_list.append(object_key_element)
                else:
                    object_keys.append(object_key_element.get(key, Null))

            object_key = [keys for keys in object_keys if keys is not Null]
        else:
            object_key = object_key.get(key, Null)

        if object_key is Null:
            object_key = obj.get(key, Null)

        if isinstance(object_key, str):
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if object_key.lower() == value.lower():
                found_list.append(obj)

        elif isinstance(object_key, (int, bool)) and object_key == value:
            found_list.append(obj)

        elif isinstance(object_key, list) and value in object_key:
            found_list.append(obj)

        elif isinstance(object_key, dict) and (value in object_key.keys()):
            found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            found_list)
    else:
        skip_step(_step_obj,
                  message='Can not find {} {} in {}.'.format(
                      value, orig_key, ', '.join(_step_obj.context.addresses)))
예제 #3
0
def its_key_is_value(_step_obj, key, value):
    search_key = str(key).lower()
    found_list = []
    for obj in _step_obj.context.stash:
        object_key = obj.get(key, Null)

        if object_key is Null:
            object_key = obj.get('values', {})
            if type(object_key) is list:
                object_keys = []
                for object_key_element in object_key:
                    if type(object_key_element) is dict:
                        filtered_key = object_key_element.get(key)
                        if type(filtered_key) is str and filtered_key.lower() == value.lower():
                            found_list.append(object_key_element)
                    else:
                        object_keys.append(object_key_element.get(key, Null))

                object_key = [keys for keys in object_keys if keys is not Null]
            else:
                object_key = object_key.get(key, Null)

        if type(object_key) is str:
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if object_key.lower() == value.lower():
                found_list.append(obj)

        elif type(object_key) in (int, bool) and object_key == value:
            found_list.append(obj)

        elif type(object_key) is list and value in object_key:
            found_list.append(obj)

        elif type(object_key) is dict and (value in object_key.keys()):
            found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(found_list)
    else:
        skip_step(_step_obj, value)
예제 #4
0
def i_have_name_section_configured(_step_obj,
                                   name,
                                   type_name='resource',
                                   _terraform_config=world):
    '''
    Finds given resource or variable by name and returns it. Skips the step (and further steps) if it is not found.

    :param _step_obj: Internal, step object for radish.
    :param name: String of the name of the resource_type or variable.
    :param type_name: String of the type, either resource(s) or variable(s)
    :param _terraform_config: Internal, terraform configuration.
    :return:
    '''
    assert (type_name in ['resource', 'resources',
                          'variable', 'variables',
                          'output', 'outputs',
                          'provider', 'providers',
                          'data', 'datas']), \
        '{} configuration type does not exist or not implemented yet. ' \
        'Use resource(s), provider(s), variable(s), output(s) or data(s) instead.'.format(type_name)

    if type_name.endswith('s'):
        type_name = type_name[:-1]

    # Process the tags
    _step_obj = look_for_bdd_tags(_step_obj)

    if name in ('a resource', 'any resource', 'resources'):
        _step_obj.context.type = type_name
        _step_obj.context.name = name
        _step_obj.context.stash = recursive_jsonify([
            obj for key, obj in
            _terraform_config.config.terraform.resources_raw.items()
        ])
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            _step_obj.context.stash)
        _step_obj.context.property_name = type_name
        return True

    elif name in ('an output', 'any output', 'outputs'):
        _step_obj.context.type = 'output'
        _step_obj.context.name = name
        _step_obj.context.stash = recursive_jsonify([
            obj for key, obj in _terraform_config.config.terraform.
            configuration['outputs'].items()
        ])
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            _terraform_config.config.terraform.configuration['outputs'])
        _step_obj.context.property_name = 'output'
        return True

    elif name in ('a variable', 'any variable', 'variables'):
        _step_obj.context.type = 'variable'
        _step_obj.context.name = name
        _step_obj.context.stash = recursive_jsonify([
            obj for key, obj in _terraform_config.config.terraform.
            configuration['variables'].items()
        ])
        _step_obj.context.addresses = 'variable'
        _step_obj.context.property_name = 'variable'
        return True

    elif name.startswith('resource that supports'):
        filter_property = re.match(r'resource that supports (.*)',
                                   name).group(1)

        resource_types_supports_tags = find_root_by_key(
            _terraform_config.config.terraform.resources_raw,
            filter_property,
            return_key='type')
        resource_list = []
        for resource_type in resource_types_supports_tags:
            # Issue-168: Mounted resources causes problem on recursive searching for resources that supports tags
            #            We are removing all mounted resources here for future steps, since we don't need them for
            #            tags checking.
            found_resources = remove_mounted_resources(
                _terraform_config.config.terraform.find_resources_by_type(
                    resource_type))
            found_resources = transform_asg_style_tags(found_resources)
            resource_list.extend(found_resources)

        if resource_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(resource_list)
            _step_obj.context.addresses = get_resource_address_list_from_stash(
                resource_list)
            _step_obj.context.property_name = type_name
            return True

    elif type_name == 'resource':
        name = convert_resource_type(name)
        resource_list = _terraform_config.config.terraform.find_resources_by_type(
            name)

        if resource_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(resource_list)
            _step_obj.context.addresses = get_resource_address_list_from_stash(
                resource_list)
            _step_obj.context.property_name = type_name
            return True

    elif type_name == 'variable':
        found_variable = _terraform_config.config.terraform.variables.get(
            name, None)

        if found_variable:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(found_variable)
            _step_obj.context.addresses = name
            _step_obj.context.property_name = type_name
            return True

    elif type_name == 'output':
        found_output = _terraform_config.config.terraform.outputs.get(
            name, None)

        if found_output:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(found_output)
            _step_obj.context.addresses = name
            _step_obj.context.property_name = type_name
            return True

    elif type_name == 'provider':
        found_provider = _terraform_config.config.terraform.get_providers_from_configuration(
            name)

        if found_provider:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(found_provider)
            _step_obj.context.addresses = name
            _step_obj.context.address = name
            _step_obj.context.property_name = type_name
            return True

    elif type_name == 'data':
        name = convert_resource_type(name)
        data_list = _terraform_config.config.terraform.find_data_by_type(name)

        if data_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = recursive_jsonify(data_list)
            _step_obj.context.addresses = name
            _step_obj.context.address = name
            _step_obj.context.property_name = type_name
            return True

    skip_step(_step_obj, name)
예제 #5
0
def i_have_name_section_configured(_step_obj,
                                   name,
                                   type_name='resource',
                                   _terraform_config=world):
    '''
    Finds given resource or variable by name and returns it. Skips the step (and further steps) if it is not found.

    :param _step_obj: Internal, step object for radish.
    :param name: String of the name of the resource_type or variable.
    :param type_name: String of the type, either resource(s) or variable(s)
    :param _terraform_config: Internal, terraform configuration.
    :return:
    '''
    assert (type_name in ['resource', 'resources',
                          'variable', 'variables',
                          'provider', 'providers',
                          'data', 'datas']), \
        '{} configuration type does not exist or not implemented yet. ' \
        'Use resource(s), provider(s), variable(s) or data(s) instead.'.format(type_name)

    if type_name.endswith('s'):
        type_name = type_name[:-1]

    if name in ('a resource', 'any resource', 'a', 'any', 'anything'):
        _step_obj.context.type = type_name
        _step_obj.context.name = name
        _step_obj.context.stash = [
            obj for key, obj in
            _terraform_config.config.terraform.resources_raw.items()
        ]
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            _step_obj.context.stash)
        return True

    elif name == 'resource that supports tags':
        resource_types_supports_tags = find_root_by_key(
            _terraform_config.config.terraform.resources_raw,
            'tags',
            return_key='type')
        resource_list = []
        for resource_type in resource_types_supports_tags:
            resource_list.extend(
                _terraform_config.config.terraform.find_resources_by_type(
                    resource_type))

        if resource_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = resource_list
            _step_obj.context.addresses = get_resource_address_list_from_stash(
                resource_list)
            return True

    elif type_name == 'resource':
        name = convert_resource_type(name)
        resource_list = _terraform_config.config.terraform.find_resources_by_type(
            name)

        if resource_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = resource_list
            _step_obj.context.addresses = get_resource_address_list_from_stash(
                resource_list)
            return True

    elif type_name == 'variable':
        found_variable = _terraform_config.config.terraform.variables.get(
            name, None)

        if found_variable:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = found_variable
            _step_obj.context.addresses = name
            return True

    elif type_name == 'provider':
        found_provider = _terraform_config.config.terraform.configuration.get(
            'providers', {}).get(name, None)

        if found_provider:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = found_provider
            _step_obj.context.addresses = name
            return True

    elif type_name == 'data':
        name = convert_resource_type(name)
        data_list = _terraform_config.config.terraform.find_data_by_type(name)

        if data_list:
            _step_obj.context.type = type_name
            _step_obj.context.name = name
            _step_obj.context.stash = data_list
            _step_obj.context.addresses = name
            return True

    skip_step(_step_obj, name)
def its_key_is_value(_step_obj, key, value, dict_value=None, address=Null):
    def to_lower_key(d):
        return {str(k).lower(): v for k, v in d.items()}

    orig_key = key
    if key == 'reference':
        if address is not Null:
            key = Defaults.r_mount_addr_ptr
        elif address is Null:
            key = Defaults.r_mount_addr_ptr_list
    else:
        key = str(key).lower()

    found_list = []
    for obj in _step_obj.context.stash:
        obj = to_lower_key(obj)
        object_key = obj.get('values', {})
        if isinstance(object_key, list):
            for el in object_key:
                if isinstance(el, dict):
                    el = to_lower_key(el)
                    filtered_key = el.get(key)
                    if isinstance(filtered_key, (str, int, bool)) and str(filtered_key).lower() == str(value).lower():
                        found_list.append(el)
        else:
            object_key = to_lower_key(object_key)
            object_key = object_key.get(key, Null)

        if object_key is Null:
            object_key = obj.get(key, Null)
            if address is not Null and isinstance(object_key, dict) and address in object_key:
                object_key = object_key.get(address, Null)

        if isinstance(object_key, str):
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if object_key.lower() == value.lower():
                found_list.append(obj)

        elif isinstance(object_key, (int, bool)) and str(object_key).lower() == str(value).lower():
            found_list.append(obj)

        elif isinstance(object_key, list):
            object_key = [str(v).lower() for v in object_key]
            if str(value).lower() in object_key:
                found_list.append(obj)

        elif isinstance(object_key, dict):
            object_key = to_lower_key(object_key)
            candidate_value = object_key.get(str(value).lower())
            if candidate_value is not None and (
                    dict_value is None or (
                    str(candidate_value).lower() == str(dict_value).lower())
            ):
                found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(found_list)
    else:
        if dict_value is None:
            skip_step(_step_obj, message='Can not find {} {} in {}.'.format(value, orig_key,
                                                                            ', '.join(_step_obj.context.addresses)))
        else:
            skip_step(_step_obj, message='Can not find {}={} {} in {}.'.format(value, dict_value, orig_key,
                                                                               ', '.join(_step_obj.context.addresses)))
예제 #7
0
def its_key_is_not_value(_step_obj, key, value, dict_value=None, address=Null):
    match = _step_obj.context.match

    orig_key = key
    if key == 'reference':
        if address is not Null:
            key = Defaults.r_mount_addr_ptr
        elif address is Null:
            key = Defaults.r_mount_addr_ptr_list

    found_list = []
    for obj in _step_obj.context.stash:
        object_key = obj.get(key, Null)

        if object_key is Null:
            object_key = obj.get('values', {})
            if isinstance(object_key, list):
                object_keys = []
                for object_key_element in object_key:
                    if not match.equals(
                            match.get(object_key_element, key, Null), value):
                        object_keys.append(
                            match.get(object_key_element, key, Null))

                object_key = [keys for keys in object_keys if keys is not Null]
            else:
                object_key = match.get(object_key, key, Null)

        if address is not Null and isinstance(
                object_key, dict) and match.contains(object_key, address):
            object_key = match.get(object_key, address, Null)

        if isinstance(object_key, str):
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if not match.equals(object_key, value):
                found_list.append(obj)

        elif isinstance(object_key,
                        (int, bool)) and not match.equals(object_key, value):
            found_list.append(obj)

        elif isinstance(object_key,
                        list) and not match.contains(object_key, value):
            found_list.append(obj)

        elif isinstance(object_key, dict):
            if not match.contains(object_key, value) or (
                    dict_value is not None and not match.equals(
                        str(match.get(object_key, value)), dict_value)):
                found_list.append(obj)

        elif object_key is None and not match.equals('None', value):
            found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            found_list)
    else:
        if object_key is Null:
            skip_step(_step_obj,
                      message='Could not find {} in {}.'.format(
                          key, ', '.join(_step_obj.context.addresses)))
        elif dict_value is None:
            skip_step(_step_obj,
                      message='Found {} {} in {}.'.format(
                          value, orig_key,
                          ', '.join(_step_obj.context.addresses)))
        else:
            skip_step(_step_obj,
                      message='Found {}={} {} in {}.'.format(
                          value, dict_value, orig_key,
                          ', '.join(_step_obj.context.addresses)))
예제 #8
0
def its_key_is_value(_step_obj, key, value, dict_value=None, address=Null):
    match = _step_obj.context.match

    orig_key = key
    if key == 'reference':
        if address is not Null:
            key = Defaults.r_mount_addr_ptr
        elif address is Null:
            key = Defaults.r_mount_addr_ptr_list

    found_list = []
    for obj in _step_obj.context.stash:
        object_key = obj.get('values', {})
        if isinstance(object_key, list):
            for el in object_key:
                if isinstance(el, dict):
                    filtered_key = match.get(el, key)
                    if isinstance(filtered_key,
                                  (str, int, bool)) and match.equals(
                                      filtered_key, value):
                        found_list.append(el)
        else:
            object_key = match.get(object_key, key, Null)

        if object_key is Null:
            object_key = match.get(obj, key, Null)
            if address is not Null and isinstance(
                    object_key, dict) and match.contains(object_key, address):
                object_key = match.get(object_key, address, Null)

        if isinstance(object_key, str):
            if "[" in object_key:
                object_key = object_key.split('[')[0]

            if match.equals(object_key, value):
                found_list.append(obj)

        elif isinstance(object_key,
                        (int, bool)) and match.equals(object_key, value):
            found_list.append(obj)

        elif isinstance(object_key, list):
            object_key = [str(v) for v in object_key]
            if match.contains(object_key, value):
                found_list.append(obj)

        elif isinstance(object_key, dict):
            candidate_value = match.get(object_key, value)
            if candidate_value is not None and (
                    dict_value is None or
                (match.equals(candidate_value, dict_value))):
                found_list.append(obj)

    if found_list != []:
        _step_obj.context.stash = found_list
        _step_obj.context.addresses = get_resource_address_list_from_stash(
            found_list)
    else:
        if object_key is Null:
            skip_step(_step_obj,
                      message='Could not find {} in {}.'.format(
                          key, ', '.join(_step_obj.context.addresses)))
        elif dict_value is None:
            skip_step(_step_obj,
                      message='Can not find {} {} in {}.'.format(
                          value, orig_key,
                          ', '.join(_step_obj.context.addresses)))
        else:
            skip_step(_step_obj,
                      message='Can not find {}={} {} in {}.'.format(
                          value, dict_value, orig_key,
                          ', '.join(_step_obj.context.addresses)))