def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # AddressFamilyAttributes for sub, attributes2 in attributes.mapping_values('address_family_attr', sort=True, keys=self.address_family_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) if apply: if configurations: self.device.configure(configurations) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_unconfig(self, devices=None, apply=True, attributes=None, **kwargs): cfgs = {} attributes = AttributesHelper(self, attributes) if devices is None: devices = self.devices devices = set(devices) for key, sub, attributes2 in attributes.mapping_items('device_attr', keys=devices, sort=True): cfgs[key] = sub.build_unconfig(apply=False, attributes=attributes2) if apply: self.testbed.config_on_devices(cfgs, fail_invalid=True) else: return cfgs
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) with configurations.submode_context( attributes.format('interface {intf}', force=True)): # lldp transmit # lldp receive if attributes.value('if_enabled'): configurations.append_line( attributes.format('lldp transmit')) configurations.append_line( attributes.format('lldp receive')) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # loop over all maxlength_range for sub, attributes2 in attributes.mapping_values( 'maxlength_range_attr', sort=True, keys=self.maxlength_range_attr.keys()): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig, **kwargs)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # dot1x system-auth-control if attributes.value('system_auth_control'): configurations.append_line('dot1x system-auth-control') # dot1x supplicant force-multicast if attributes.value('supplicant_force_mcast'): configurations.append_line('dot1x supplicant force-multicast') # credentials attributes for sub, attributes2 in attributes.mapping_values( 'credentials_attr', sort=True, keys=self.credentials_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) # interfaces attributes for sub, attributes2 in attributes.mapping_values( 'interface_attr', sort=True, keys=self.interface_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) if apply: if configurations: self.device.configure(configurations) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # enabled if attributes.value('enabled'): if unconfig is False: configurations.append_line(attributes.format( 'feature msdp')) elif unconfig is True and\ attributes.attributes == {'enabled': {True: None}} or \ attributes.iswildcard: configurations.append_line('no feature msdp', raw=True) if apply: if configurations: self.device.configure(configurations) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations) # VrfAttributes if unconfig and attributes.iswildcard: configurations.submode_unconfig() for sub, attributes2 in attributes.mapping_values('vrf_attr', sort=True, keys=self.vrf_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) if apply: if configurations: self.device.configure(configurations) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # =================================== # ssm_source_addr # ssm_group_policy # =================================== if attributes.value('ssm_source_addr') and \ attributes.value('ssm_group_policy'): configurations.append_line( attributes.format('ssm map static ' '{ssm_source_addr} {ssm_group_policy}')) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) with configurations.submode_context( attributes.format( 'vlan configuration {vlan_configuration_id}', force=True)): if unconfig and attributes.iswildcard: # Never reached! configurations.submode_unconfig() # iosxe: vlan configuration <vlan_configuration_id> / \ # egress port-channel load-balance random if attributes.value('egress_load_balance'): configurations.append_line( attributes.format( 'egress port-channel load-balance random')) # nxos: vlan configuration <vlan_configuration_id> / \ # device-tracking # nxos: vlan configuration <vlan_configuration_id> / action # nxos: vlan configuration <vlan_configuration_id> / exit # nxos: vlan configuration <vlan_configuration_id> / ip # nxos: vlan configuration <vlan_configuration_id> / ipv6 # nxos: vlan configuration <vlan_configuration_id> / no # nxos: vlan configuration <vlan_configuration_id> / egress # nxos: vlan configuration <vlan_configuration_id> /layer-2 # nxos: vlan configuration <vlan_configuration_id> / \ # service-policy # nxos: vlan configuration <vlan_configuration_id> / this # nxos: vlan configuration <vlan_configuration_id> / pop # nxos: vlan configuration <vlan_configuration_id> / push # nxos: vlan configuration <vlan_configuration_id> / where return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # spanning-tree mode {mode} if attributes.value('mode'): mode = 'mst' if 'mstp' in self.mode else self.mode configurations.append_line( attributes.format('spanning-tree mode {}'.format(mode), force=True)) # spanning-tree transmit hold-count {hold_count} configurations.append_line( attributes.format( 'spanning-tree transmit hold-count {hold_count}')) # mst_attr for sub, attributes2 in attributes.mapping_values( 'mst_attr', sort=True, keys=self.mst_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) # pvst_attr for sub, attributes2 in attributes.mapping_values( 'pvst_attr', sort=True, keys=self.pvst_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # iosxr: l2vpn / pbb (config-l2vpn) if attributes.value('enabled', force=True): with configurations.submode_context('pbb'): if unconfig and attributes.iswildcard: configurations.submode_unconfig() # iosxr: l2vpn / pbb / backbone-source-mac aaaa.bbbb.cccc configurations.append_line( attributes.format( 'backbone-source-mac {backbone_source_mac}')) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # =================================== # ipv4 # prefix_length # ipv4_secondary # secondary_vrf # =================================== if attributes.value('ipv4') and attributes.value('prefix_length'): # convert prefix_length to netmask ret = IPv4Network('1.1.1.1/{}'.format( attributes.value('prefix_length')), strict=False) mask = ret.with_netmask.split('/')[1] if attributes.value('ipv4_secondary'): configurations.append_line('ip address' ' {ipv4} {prefix_length} secondary' .format(ipv4=attributes.value('ipv4'), prefix_length=mask)) if attributes.value('secondary_vrf'): configurations.append_line('ip address' ' {ipv4} {prefix_length} secondary' ' vrf {secondary_vrf}' .format(ipv4=attributes.value('ipv4'), prefix_length=mask, secondary_vrf=attributes.value('secondary_vrf'))) else: configurations.append_line('ip address' ' {ipv4} {prefix_length}' .format(ipv4=attributes.value('ipv4'), prefix_length=mask)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # peer_address if not attributes.value('peer_address') and not unconfig: return str() conf_line = 'ntp peer {peer_address}' # peer_key_id if attributes.value('peer_key_id'): conf_line += ' key {peer_key_id}' # peer_maxpoll if attributes.value('peer_maxpoll'): conf_line += ' maxpoll {peer_maxpoll}' # peer_minpoll if attributes.value('peer_minpoll'): conf_line += ' minpoll {peer_minpoll}' # peer_prefer if attributes.value('peer_prefer'): conf_line += ' prefer' if self.vrf_name and self.vrf_name != 'default': conf_line += ' use-vrf {vrf_name}' # append the line configurations.append_line( attributes.format(conf_line, force=True)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # address_family for address_family_sub, address_family_attributes in \ attributes.mapping_values( 'address_family_attr', sort=True, keys = self.address_family_attr): configurations.append_block( address_family_sub.build_config( apply=False, attributes=address_family_attributes, unconfig=unconfig)) return str(configurations)
def build_config(self, devices=None, interfaces=None, links=None, apply=True, attributes=None, **kwargs): attributes = AttributesHelper(self, attributes) cfgs = {} devices, interfaces, links = \ consolidate_feature_args(self, devices, interfaces, links) for key, sub, attributes2 in attributes.mapping_items('device_attr', keys=devices, sort=True): cfgs[key] = sub.build_config(apply=False, attributes=attributes2) if apply: for device_name, cfg in sorted(cfgs.items()): self.testbed.config_on_devices(cfg, fail_invalid=True) else: return cfgs
def build_config(self, devices=None, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # loop over all prefixes for sub, attributes2 in attributes.mapping_values( 'prefix_attr', keys=self.prefix_attr.keys(), sort=True): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig, **kwargs)) return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # =================================== # join_group # join_group_source_addr # static_group # static_group_source_addr # =================================== if attributes.value('join_group'): cmd_str = 'ipv6 mld join-group {join_group}' # build up configuration string if attributes.value('join_group_source_addr') and \ attributes.value('join_group_source_addr') != '*': cmd_str += ' source {join_group_source_addr}' configurations.append_line(attributes.format(cmd_str)) elif attributes.value('static_group'): cmd_str = 'ipv6 mld static-oif {static_group}' # build up configuration string if attributes.value('static_group_source_addr') and \ attributes.value('static_group_source_addr') != '*': cmd_str += ' source {static_group_source_addr}' configurations.append_line(attributes.format(cmd_str)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # iosxe: l2vpn vfi context {name} with configurations.submode_context( attributes.format('l2vpn vfi context {name}', force=True)): if unconfig and attributes.iswildcard: configurations.submode_unconfig() # iosxr: l2vpn vfi context {name} / vpn id {vpn_id} assert self.vpn_id is not None configurations.append_line(attributes.format('vpn id {vpn_id}')) sub, attributes2 = attributes.namespace('autodiscovery_bgp') if sub is not None: configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) for sub, attributes2 in attributes.mapping_values( 'neighbor_attr', keys=self.pseudowire_neighbors, sort=True): configurations.append_block( str( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig))) return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) if attributes.value('if_proxy_enable') or \ attributes.value('if_local_proxy_enable') or\ attributes.value('if_expire_time'): with configurations.submode_context( attributes.format('interface {interface}', force=True)): if attributes.value('if_proxy_enable'): configurations.append_line( attributes.format('ip proxy-arp')) if attributes.value('if_local_proxy_enable'): configurations.append_line( attributes.format('ip local-proxy-arp')) if attributes.value('if_expire_time'): configurations.append_line( attributes.format( 'arp timeout {if_expire_time}')) for sub, attributes2 in attributes.mapping_values( 'static_arp_attr', sort=True, keys=self.static_arp_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # iosxe: interface tunnel1 / tunnel mpls traffic-eng path-option 1 dynamic if attributes.value('dynamic'): configurations.append_line( attributes.format( 'tunnel mpls traffic-eng path-option {path_option} dynamic' )) # iosxe: interface tunnel1 / tunnel mpls traffic-eng path-option 1 explicit name someword configurations.append_line(attributes.format\ ('tunnel mpls traffic-eng path-option {path_option} explicit name {explicit_name}')) return str(configurations)
def build_config(self, apply=True, attributes=None): attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder() # nxos: logging logfile messages <0-7> # 0-emerg;1-alert;2-crit;3-err;4-warn;5-notif;6-inform;7-debug configurations.append_line(attributes.format('logging logfile messages {logfile_messages_level}')) configurations.append_block(super().build_config(apply=False, attributes=attributes)) # TODO -- exception dump? # nodename if attributes.value('nodename'): configurations.append_line( attributes.format('hostname {nodename}')) if apply: if configurations: self.configure(str(configurations), fail_invalid=True) else: # Return configuration return CliConfig(device=self, unconfig=False, cli_config=configurations, fail_invalid=True)
def build_config(self, ydk_obj, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply # instantiate crud service crud_service = CRUDService() attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) if unconfig: return YangConfig(device=self.device, ydk_obj=ydk_obj, ncp=NetconfServiceProvider, crud_service=crud_service.delete) else: return YangConfig(device=self.device, ydk_obj=ydk_obj, ncp=NetconfServiceProvider, crud_service=crud_service.create)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) with self._build_config_create_interface_submode_context( configurations): self._build_config_interface_submode(configurations=configurations, attributes=attributes, unconfig=unconfig) if apply: if configurations: self.device.configure(configurations, fail_invalid=True) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # iosxr: evpn / bgp (config-evpn-bgp) with configurations.submode_context('bgp'): if not attributes.value('enabled', force=True): configurations.submode_cancel() if unconfig and attributes.iswildcard: configurations.submode_unconfig() # iosxr: evpn / bgp / rd 100:200000 # iosxr: evpn / bgp / rd 65536:200 # iosxr: evpn / bgp / rd 1.2.3.4:1 configurations.append_line(attributes.format('rd {rd}')) return str(configurations)
def build_config(self, apply=True, attributes=None): attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder() configurations.append_block(super().build_config( apply=False, attributes=attributes)) # TODO -- exception dump? # nodename if attributes.value('nodename'): configurations.append_line( attributes.format('hostname {nodename}')) if apply: if configurations: self.configure(str(configurations), fail_invalid=True) else: # Return configuration return CliConfig(device=self, unconfig=False, cli_config=configurations, fail_invalid=True)
def build_config(self, devices=None, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) hsrp_config = [] # loop over all interfaces for sub, attributes2 in attributes.mapping_values( 'interface_attr', keys=self.interface_attr.keys()): hsrp_config.append( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig, **kwargs)) # instantiate crud service crud_service = CRUDService() if apply: for interface in hsrp_config: interface.apply() else: ydks = [] if unconfig: for interface in hsrp_config: ydks.append(interface) else: for interface in hsrp_config: ydks.append(interface) return ydks
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # =================================== # ssm_group_range # ssm_source_addr # =================================== if attributes.value('ssm_group_range') and \ attributes.value('ssm_source_addr'): configurations.append_line( attributes.format('ip igmp ssm-translate ' '{ssm_group_range} {ssm_source_addr}')) return str(configurations)
def build_config(self, devices=None, apply=True, attributes=None, unconfig=False, **kwargs): attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) vrf = list(self.vrf_attr.keys()) with configurations.submode_context( attributes. format('router lisp {router_lisp_id}', force=True) if self. router_lisp_id is not None else attributes. format('router lisp', force=True)): if unconfig and attributes.iswildcard: configurations.submode_unconfig() for sub, attributes2 in attributes.mapping_values('vrf_attr', sort=True): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig, **kwargs)) if len(self.vrf_attr.keys()) > 1: raise Exception('One Vrf must be part of \'device_attr\', ' 'but it has {vrf}'.format(vrf=vrf)) if apply: if configurations: self.device.configure(str(configurations)) else: return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not apply assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 (config-pim-<af>-if) with configurations.submode_context( attributes.format('interface {interface_name}', force=True)): if unconfig and attributes.iswildcard: configurations.submode_unconfig() # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / bfd fast-detect # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / bfd minimum-interval 3 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / bfd multiplier 2 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / bsr-border # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / disable # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / dr-priority <0-4294967295> # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / enable # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / hello-interval 1 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / join-prune-interval 10 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / join-prune-mtu 576 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / maximum route-interfaces 1 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / maximum route-interfaces 1 someword # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / maximum route-interfaces 1 threshold 1 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / maximum route-interfaces 1 threshold 1 someword # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / neighbor-filter someword # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / override-interval 400 # iosxr: router pim / [vrf someword] / address-family ipv4|ipv6 / interface GigabitEthernet0/0/0/0 / propagation-delay 100 # iosxr: router pim / address-family ipv4 / interface GigabitEthernet0/0/0/0 / rpf-redirect bundle someword # iosxr: router pim / address-family ipv4 / interface GigabitEthernet0/0/0/0 / rpf-redirect bundle someword bandwidth <0-100000000> threshold <0-100000000> return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) with configurations.submode_context( attributes.format('evi {evi_id}', force=True)): # iosxr: evpn / evi 1 / advertise-mac if attributes.value('advertise_mac'): configurations.append_line('advertise-mac') # iosxr: evpn / evi 1 / control-word-disable if attributes.value('control_word_disable'): configurations.append_line('control-word-disable') sub, attributes2 = attributes.namespace('bgp') if sub is not None: configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) sub, attributes2 = attributes.namespace('load_balancing') if sub is not None: configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) return CliConfig(device=self.device, unconfig=unconfig, cli_config=configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): """method to build the configuration based on attributes Api to build the configuration of an `VrfAttributes` object. This configuration depends of the configurable attributes of this object. Args: kwargs (`dict`): Argument to drive configuration Return: `str` """ assert not apply # not supported attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) with configurations.submode_context( None if self.vrf_name == 'default' else attributes. format('vrf {vrf_name}', force=True)): if self.vrf_name != 'default' and unconfig and attributes.iswildcard: configurations.submode_unconfig() for sub, attributes2 in attributes.mapping_values( 'address_family_attr', keys=self.address_families, sort=True): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig, **kwargs)) return str(configurations)