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)))
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)))
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)
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)
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)))
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)))
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)))