Пример #1
0
    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?

        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)
Пример #2
0
            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(
                            'evpn multisite border-gateway {evpn_msite_bgw}',
                            force=True)):
                    if unconfig and attributes.iswildcard:
                        configurations.submode_unconfig()

                    # nxos : delay-restore time <int 30-1000>
                    if attributes.value('evpn_msite_bgw_delay_restore_time'):
                        configurations.append_line(\
                            attributes.format('delay-restore time {evpn_msite_bgw_delay_restore_time}'))

                return str(configurations)
Пример #3
0
            def build_config(self,
                             devices=None,
                             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 {config_vlan_id}',
                            force=True)):
                    if unconfig and attributes.iswildcard:
                        # Never reached!
                        configurations.submode_unconfig()

                    # ip_igmp_snooping
                    if attributes.value('ip_igmp_snooping'):
                        configurations.append_line('ip igmp snooping')

                return str(configurations)
Пример #4
0
    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 = 'ip igmp join-group {join_group}'

            # build up configuration string
            if 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 = 'ip igmp static-group {static_group}'

            # build up configuration string
            if attributes.value('static_group_source_addr'):
                cmd_str += ' source {static_group_source_addr}'

            configurations.append_line(attributes.format(cmd_str))

        return str(configurations)
Пример #5
0
    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)

        # ===================================
        # ipv6
        # ipv6_prefix_length
        # ipv6_anycast (N/A for IOSXR)
        # ipv6_eui_64
        # ipv6_route_tag
        # ===================================

        cmd = []
        #  ipv6 address <ipv6>/<ipv6_prefix_length> [ anycast | eui64 ] [ tag <ipv6_route_tag> ]
        if attributes.value('ipv6') and attributes.value('ipv6_prefix_length'):
            cmd.append('ipv6 address {ipv6}/{ipv6_prefix_length}'.\
                format(ipv6=attributes.value('ipv6'),
                    ipv6_prefix_length=attributes.value('ipv6_prefix_length')))
            if attributes.value('ipv6_eui_64') and \
                attributes.value('ipv6_route_tag'):
                cmd.append(' eui-64 route-tag {ipv6_route_tag}'.\
                    format(ipv6_route_tag=attributes.value('ipv6_route_tag')))
            elif attributes.value('ipv6_eui64'):
                cmd.append(' eui64')
            elif attributes.value('ipv6_route_tag'):
                cmd.append(' tag {ipv6_route_tag}'.\
                    format(ipv6_route_tag=attributes.value('ipv6_route_tag')))

            configurations.append_line(''.join(cmd))

        return str(configurations)
Пример #6
0
    def build_config(self,
                     apply=True,
                     attributes=None,
                     unconfig=False,
                     **kwargs):
        assert not kwargs, kwargs
        attributes = AttributesHelper(self, attributes)
        configurations = CliConfigBuilder(unconfig=unconfig)

        # router ospf 1
        #   max-metric router-lsa external-lsa include-stub summary-lsa
        #   max-metric router-lsa external-lsa include-stub on-startup 50 summary-lsa
        if attributes.value('stub_router_always') or \
            attributes.value('stub_router_on_startup'):

            # max-metric router-lsa
            sr_str = 'max-metric router-lsa'

            # + external-lsa
            if attributes.value('stub_router_external_lsa'):
                sr_str += ' external-lsa'

            # + include-stub
            if attributes.value('stub_router_include_stub'):
                sr_str += ' include-stub'

            # + on-startup {stub_router_on_startup}
            if attributes.value('stub_router_on_startup'):
                sr_str += ' on-startup {stub_router_on_startup}'

            # + summary-lsa
            if attributes.value('stub_router_summary_lsa'):
                sr_str += ' summary-lsa'

            configurations.append_line(attributes.format(sr_str))

        return str(configurations)
Пример #7
0
                    def build_config(self,
                                     apply=True,
                                     attributes=None,
                                     unconfig=False,
                                     **kwargs):
                        assert not apply
                        attributes = AttributesHelper(self, attributes)
                        configurations = CliConfigBuilder(unconfig=unconfig)
                        if unconfig and attributes.iswildcard:
                            configurations.submode_unconfig()

                        # route-target <rt_type> <rt> mvpn
                        if attributes.value('rt_mvpn'):
                            self.protocol = 'mvpn'
                        # route-target <rt_type> <rt> evpn
                        if attributes.value('rt_evpn'):
                            self.protocol = 'evpn'

                        if unconfig:
                            if self.protocol:
                                if self.tmp_rt_type:
                                    configurations.append_line(
                                        'route-target {rt_type} {rt} {protocol}'
                                        .format(rt_type=self.tmp_rt_type,
                                                rt=self.rt,
                                                protocol=self.protocol))

                        if not unconfig and self.protocol:
                            configurations.append_line(
                                'route-target {rt_type} {rt} {protocol}'.
                                format(
                                    rt_type=attributes.value('rt_type').value,
                                    rt=self.rt,
                                    protocol=self.protocol))

                        return str(configurations)
Пример #8
0
def _build_condition_cli(base, cond, attributes):
    configurations = CliConfigBuilder()

    str = _build_condition_string(base, cond, attributes=attributes)
    assert str

    with configurations.submode_context('if {} then'.format(str),
                                        exit_cmd=None):
        if_attr, attributes2 = attributes.namespace('if_attr')
        configurations.append_block(
            _build_attributes_cli(base, if_attr, attributes=attributes2))
        if not configurations:
            configurations.append_line('done')

    with configurations.submode_context('else',
                                        cancel_empty=True,
                                        exit_cmd=None):
        else_attr, attributes2 = attributes.namespace('else_attr')
        configurations.append_block(
            _build_attributes_cli(base, else_attr, attributes=attributes2))

    configurations.append_line('endif')

    return configurations
Пример #9
0
            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 / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp (config-l2vpn-bg-bd-vfi-ad-sig)
                with configurations.submode_context('signaling-protocol ldp'):
                    if not attributes.value('enabled', force=True):
                        configurations.submode_cancel()

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label both
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label both static
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label receive
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label receive static
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label transmit
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / load-balancing flow-label transmit static

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / vpls-id 1.2.3.4:1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 / autodiscovery bgp / signaling-protocol ldp / vpls-id 100:200000
                    configurations.append_line(attributes.format('vpls-id {vpls_id}'))

                return str(configurations)
Пример #10
0
        def build_config(self, apply=True, attributes=None, unconfig=False,
                         **kwargs):
            assert not kwargs, kwargs
            attributes = AttributesHelper(self, attributes)
            configurations = CliConfigBuilder(unconfig=unconfig)

            # require_router_alert
            if attributes.value('require_router_alert'):
                configurations.append_line('ip igmp enforce-router-alert')
 
            # VrfAttributes
            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)
Пример #11
0
            def build_config(self,
                             devices=None,
                             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 {vlan}', force=True)):
                    if unconfig and attributes.iswildcard:
                        # Never reached!
                        configurations.submode_unconfig()

                    # shutdown
                    if attributes.value('shutdown') == False:
                        configurations.append_line(
                            attributes.format('no shutdown'))
                    elif attributes.value('shutdown') == True:
                        configurations.append_line(
                            attributes.format('shutdown'))

                    # name
                    if attributes.value('name'):
                        configurations.append_line(
                            attributes.format('name {name}'))

                    # state
                    if attributes.value('state'):
                        state_value = attributes.value('state').value
                        configurations.append_line(
                            attributes.format(
                                'state {state}'.format(state=state_value)))

                return str(configurations)
Пример #12
0
 def build_unconfig(self, apply=True, attributes=None, **kwargs):
 
     # physical interfaces unconfigured
     attributes_unconfig = AttributesHelper(self, attributes)
     if attributes_unconfig.iswildcard:
         configurations = CliConfigBuilder(unconfig=True)
         configurations.append_line('default interface {}'.format(self.name),raw=True)
         configurations.append_line('interface {}'.format(self.name), raw=True)
         configurations.append_line('shutdown', raw=True)
         if apply:
             if configurations:
                 self.device.configure(str(configurations))
         else:
             # Return configuration
             return configurations
     else:
         return self.build_config(apply=apply,
                                  attributes=attributes,
                                  unconfig=True, **kwargs)
Пример #13
0
                def build_config(self, apply=True, attributes=None,
                                 unconfig=False, **kwargs):
                    assert not apply
                    attributes = AttributesHelper(self, attributes)
                    configurations = CliConfigBuilder(unconfig=unconfig)

                    # route-target <rt_type> <rt>
                    if attributes.value('rt_type'):
                        if attributes.value('rt_type').value == 'both':
                            configurations.append_line(
                                'route-target import {rt}'.format(rt=self.rt))
                            configurations.append_line(
                                'route-target export {rt}'.format(rt=self.rt))
                        else:
                            configurations.append_line(
                                'route-target {type} {rt}'.format(
                                    rt=self.rt,
                                    type=attributes.value('rt_type').value))

                    return str(configurations)
Пример #14
0
                def build_config(self,
                                 apply=True,
                                 attributes=None,
                                 unconfig=False,
                                 **kwargs):
                    assert not apply
                    attributes = AttributesHelper(self, attributes)
                    configurations = CliConfigBuilder(unconfig=unconfig)

                    # iosxr: mpls ldp / [vrf someword] / interface GigabitEthernet0/0/0/0 / address-family ipv4 (config-ldp-vrf-if-af)
                    # iosxr: mpls ldp / interface GigabitEthernet0/0/0/0 / address-family ipv6 (config-ldp-if-af)
                    with configurations.submode_context(
                            attributes.format(
                                'address-family {address_family.value}',
                                force=True)):
                        if unconfig and attributes.iswildcard:
                            configurations.submode_unconfig()

                        # iosxr: mpls ldp / [vrf someword] / interface GigabitEthernet0/0/0/0 / address-family ipv4 / discovery transport-address 1.2.3.4
                        # iosxr: mpls ldp / interface GigabitEthernet0/0/0/0 / address-family ipv6 / discovery transport-address 1:2::3
                        # iosxr: mpls ldp / [vrf someword] / interface GigabitEthernet0/0/0/0 / address-family ipv4 / discovery transport-address interface
                        # iosxr: mpls ldp / interface GigabitEthernet0/0/0/0 / address-family ipv6 / discovery transport-address interface
                        v = attributes.value('transport_address')
                        if v is not None:
                            if v == 'interface':
                                configurations.append_line(
                                    'discovery transport-address interface')
                            else:
                                configurations.append_line(
                                    attributes.format(
                                        'discovery transport-address {transport_address}',
                                        inherited=False))

                        # iosxr: mpls ldp / interface GigabitEthernet0/0/0/0 / address-family ipv4|ipv6 / igp auto-config disable
                        if attributes.value('igp_autoconfig') is False:
                            configurations.append_line(
                                'igp auto-config disable')

                        # iosxr: mpls ldp / interface GigabitEthernet0/0/0/0 / address-family ipv4|ipv6 / mldp disable

                    return str(configurations)
Пример #15
0
                    def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs):
                        assert not apply
                        attributes = AttributesHelper(self, attributes)
                        configurations = CliConfigBuilder(unconfig=unconfig)

                        # router ospf 1
                        #   area 2 sham-link 1.1.1.1 2.2.2.2
                        if attributes.value('sl_local_id') and attributes.value('sl_remote_id'):
                            configurations.append_line(attributes.format('area {area} sham-link {sl_local_id} {sl_remote_id}'))

                            # router ospf 1
                            #   area 2 sham-link 1.1.1.1 2.2.2.2 ttl-security hops 163
                            if attributes.value('sl_ttl_sec_hops'):
                                configurations.append_line(attributes.format('area {area} sham-link {sl_local_id} {sl_remote_id} ttl-security hops {sl_ttl_sec_hops}'))

                            # router ospf 1
                            #   area 2 sham-link 1.1.1.1 2.2.2.2 cost 10
                            if attributes.value('sl_cost'):
                                configurations.append_line(attributes.format('area {area} sham-link {sl_local_id} {sl_remote_id} cost {sl_cost}'))

                        return str(configurations)
Пример #16
0
            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)
Пример #17
0
    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)
Пример #18
0
            def build_config(self,
                             apply=True,
                             attributes=None,
                             unconfig=False,
                             **kwargs):
                '''Neighbor build config'''
                assert not apply
                attributes = AttributesHelper(self, attributes)
                configurations = CliConfigBuilder(unconfig=unconfig)

                # iosxr: rsvp / neighbor 1.2.3.4 (config-rsvp-nbr)
                with configurations.submode_context(
                        attributes.format('neighbor {neighbor.ip}',
                                          force=True)):

                    # iosxr: rsvp / neighbor 1.2.3.4 / authentication (config-rsvp-nbor-auth)
                    with configurations.submode_context('authentication',
                                                        cancel_empty=True):

                        # iosxr: rsvp / neighbor 1.2.3.4 / authentication / key-source key-chain someword
                        configurations.append_line(
                            attributes.format(
                                'key-source key-chain {auth_keysrc_keychain}',
                                inherited=False))

                        # iosxr: rsvp / neighbor 1.2.3.4 / authentication / life-time 30
                        configurations.append_line(
                            attributes.format('life-time {auth_lifetime}',
                                              inherited=False))

                        # iosxr: rsvp / neighbor 1.2.3.4 / authentication / window-size 1
                        configurations.append_line(
                            attributes.format('window-size {auth_window_size}',
                                              inherited=False))

                return str(configurations)
Пример #19
0
                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)

                    self.acl_type = self.parent.acl_type

                    # [<seq>] {deny|permit} <protocol> <src> [<src_operator> <src_port>]
                    #   <dst> [<dst_operator> <dst_port>] [option <option>]
                    #    [precedence <precedence>] [established] [log] [ttl <ttl_operator> <ttl>]
                    if 'ipv4' in self.parent.acl_type:
                        cmd = '{seq} {actions_forwarding} {protocol} {src}' if self.seq else \
                              '{actions_forwarding} {protocol} {src}'
                        if attributes.value('src_operator'
                                            ) and attributes.value('src_port'):
                            cmd += ' {src_operator} {src_port}'
                        cmd += ' {dst}'
                        if attributes.value('dst_operator'
                                            ) and attributes.value('dst_port'):
                            cmd += ' {dst_operator} {dst_port}'
                        if attributes.value('option'):
                            cmd += ' option {option}'
                        if attributes.value('precedence'):
                            cmd += ' precedence {precedence}'
                        if attributes.value('established'):
                            cmd += ' established'
                        if attributes.value('actions_logging') and \
                           'syslog' in attributes.value('actions_logging'):
                            cmd += ' log'
                        if attributes.value(
                                'ttl_operator') and attributes.value('ttl'):
                            cmd += ' ttl {ttl_operator} {ttl}'

                    # [sequence <seq>] {permit|deny} [<protocol>]  <src>
                    #   [<src_operator> <src_port>] <dst> [<dst_operator> <dst_port>]
                    #    [dscp <dscp>] [established] [log]
                    elif 'ipv6' in self.parent.acl_type:
                        cmd = 'sequence {seq} {actions_forwarding} {protocol} {src}' if self.seq else \
                              '{actions_forwarding} {protocol} {src}'
                        if attributes.value('src_operator'
                                            ) and attributes.value('src_port'):
                            cmd += ' {src_operator} {src_port}'
                        cmd += ' {dst}'
                        if attributes.value('dst_operator'
                                            ) and attributes.value('dst_port'):
                            cmd += ' {dst_operator} {dst_port}'
                        if attributes.value('dscp'):
                            cmd += ' dscp {dscp}'
                        if attributes.value('established'):
                            cmd += ' established'
                        if attributes.value('actions_logging') and \
                           'syslog' in attributes.value('actions_logging'):
                            cmd += ' log'
                    elif 'eth' in self.parent.acl_type:
                        # {permit|deny} <src> <dst> [<ether_type>]
                        cmd = '{actions_forwarding} {src} {dst}'
                        if attributes.value('ether_type'):
                            cmd += ' {ether_type}'

                    # append the line configuration
                    configurations.append_line(attributes.format(cmd,
                                                                 force=True),
                                               unconfig_cmd=attributes.format(
                                                   'no ' + cmd, force=True))

                    return str(configurations)
Пример #20
0
        def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs):
            assert not kwargs, kwargs
            attributes = AttributesHelper(self, attributes)
            configurations = CliConfigBuilder(unconfig=unconfig)

            # iosxe: segment-routing mpls
            with configurations.submode_context('segment-routing mpls'):
                if unconfig and attributes.iswildcard:
                    configurations.submode_unconfig()

                if attributes.value('shutdown'):
                    configurations.append_line('shutdown')

                # iosxe: segment-routing mpls / set-attributes
                with configurations.submode_context('set-attributes',cancel_empty=True):
                    for address_family,address_family_sub,address_family_attributes in \
                        attributes.mapping_items('address_family_attr', keys=self.address_families, sort=True):

                        if address_family == AddressFamily.ipv4_unicast:
                            context_cli = 'address-family ipv4'
                        else:
                            context_cli = address_family_attributes.format('address-family {address_family.value}', force = True)

                        with configurations.submode_context(context_cli,cancel_empty=True):

                            if address_family_attributes.value('sr_label_preferred'):
                                configurations.append_line('sr-label-preferred')

                            if address_family_attributes.value('explicit_null'):
                                configurations.append_line('explicit-null')

                # iosxe: segment-routing mpls / global-block 16000 16001
                v = attributes.value('global_block')
                if v is not None:
                    configurations.append_line('global-block {first} {last}'.format(
                        first=v.start,
                        last=v[-1]))

                # iosxe: segment-routing mpls / connected-prefix-sid-map
                with configurations.submode_context('connected-prefix-sid-map',cancel_empty=True):

                    for address_family,address_family_sub,address_family_attributes in \
                        attributes.mapping_items('address_family_attr', keys=self.address_families, sort=True):

                        if address_family == AddressFamily.ipv4_unicast:
                            context_cli = 'address-family ipv4'
                        else:
                            context_cli = address_family_attributes.format('address-family {address_family.value}', force = True)

                        with configurations.submode_context(context_cli,cancel_empty=True):

                            for entry,attributes2 in address_family_attributes.sequence_values('connected_prefix_sid_map'):
                                configurations.append_line(attributes2.format('{prefix} index {index} range {range}'))

                # iosxe: segment-routing mpls / mapping-server / prefix-sid-map
                if attributes.value('mapping_server'):
                    with configurations.submode_context('mapping server'):
                        with configurations.submode_context('prefix-sid-map',cancel_empty=True):

                            for address_family,address_family_sub,address_family_attributes in \
                                attributes.mapping_items('address_family_attr', keys=self.address_families, sort=True):

                                if address_family == AddressFamily.ipv4_unicast:
                                    context_cli = 'address-family ipv4'
                                else:
                                    context_cli = address_family_attributes.format('address-family {address_family.value}', force = True)

                                with configurations.submode_context(context_cli,cancel_empty=True):

                                    for entry,attributes2 in address_family_attributes.sequence_values('prefix_sid_map'):
                                        if attributes2.value('attach'):
                                            configurations.append_line(attributes2.format('{prefix} index {index} range {range} attach'))
                                        else:
                                            configurations.append_line(attributes2.format('{prefix} index {index} range {range}'))

            if apply:
                if configurations:
                    self.device.configure(configurations, fail_invalid=True)
            else:
                #return str(configurations)
                return CliConfig(device=self.device, unconfig=unconfig,
                                 cli_config=configurations, fail_invalid=True)
Пример #21
0
            def build_config(self,
                             apply=True,
                             attributes=None,
                             unconfig=False,
                             **kwargs):
                '''Interface build config'''
                assert not apply
                attributes = AttributesHelper(self, attributes)
                configurations = CliConfigBuilder(unconfig=unconfig)

                # iosxr: rsvp / interface <name> (config-rsvp-if)
                with configurations.submode_context(
                        attributes.format('interface {interface_name}',
                                          force=True)):

                    # iosxr: rsvp / interface <name> / authentication (config-rsvp-if-auth)
                    with configurations.submode_context('authentication',
                                                        cancel_empty=True):

                        # iosxr: rsvp / interface <name> / authentication / key-source key-chain someword
                        configurations.append_line(
                            attributes.format(
                                'key-source key-chain {auth_keysrc_keychain}',
                                inherited=False))

                        # iosxr: rsvp / interface <name> / authentication / life-time 30
                        configurations.append_line(
                            attributes.format('life-time {auth_lifetime}',
                                              inherited=False))

                        # iosxr: rsvp / interface <name> / authentication / window-size 1
                        configurations.append_line(
                            attributes.format('window-size {auth_window_size}',
                                              inherited=False))

                    # iosxr: rsvp / interface <name> / signalling refresh out-of-band interval 180
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh out-of-band interval {sig_refresh_outofband_interval}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh out-of-band missed 1
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh out-of-band missed {sig_refresh_outofband_missed}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling dscp <0-63>
                    configurations.append_line(
                        attributes.format('signalling dscp {sig_dscp}'))

                    # iosxr: rsvp / interface <name> / signalling hello graceful-restart interface-based
                    if attributes.value('sig_hello_gr_intfbased'):
                        configurations.append_line(
                            'signalling hello graceful-restart interface-based'
                        )

                    # iosxr: rsvp / interface <name> / signalling rate-limit
                    # iosxr: rsvp / interface <name> / signalling rate-limit rate 1
                    # iosxr: rsvp / interface <name> / signalling rate-limit rate 1 interval 250
                    v = attributes.value('sig_rate_limit')
                    if v is not None:
                        if v is False:
                            pass
                        else:
                            cfg = 'signalling rate-limit'
                            if v is True:
                                pass
                            else:
                                cfg += ' rate {}'.format(v)
                                cfg += attributes.format(
                                    ' interval {sig_rate_limit_interval}',
                                    force=True)
                            configurations.append_line(cfg)

                    # iosxr: rsvp / interface <name> / signalling refresh interval 10
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh interval {sig_refresh_interval}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh missed 1
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh interval {sig_refresh_missed}')
                    )

                    # iosxr: rsvp / interface <name> / signalling refresh reduction disable
                    if attributes.value('sig_refresh_reduction') is False:
                        configurations.append_line(
                            'signalling refresh reduction disable')

                    # iosxr: rsvp / interface <name> / signalling refresh reduction bundle-max-size 512
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh reduction bundle-max-size {sig_refresh_reduction_bundle_maxsize}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh reduction reliable ack-hold-time 100
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh reduction reliable ack-hold-time {sig_refresh_reduction_reliable_ack_holdtime}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh reduction reliable ack-max-size 20
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh reduction reliable ack-max-size {sig_refresh_reduction_reliable_ack_maxsize}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh reduction reliable retransmit-time 100
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh reduction reliable retransmit-time {sig_refresh_reduction_reliable_retransmit_time}'
                        ))

                    # iosxr: rsvp / interface <name> / signalling refresh reduction reliable summary-refresh
                    if attributes.value(
                            'sig_refresh_reduction_reliable_summary_refresh'):
                        configurations.append_line(
                            'signalling refresh reduction reliable summary-refresh'
                        )

                    # iosxr: rsvp / interface <name> / signalling refresh reduction summary max-size 20
                    configurations.append_line(
                        attributes.format(
                            'signalling refresh reduction reliable summary max-size {sig_refresh_reduction_summary_maxsize}'
                        ))

                    if not self.rdm_bw_percentage \
                            or not self.isinherited('rdm_bw_percentage') \
                            or not self.isinherited('rdm_bw_total'):
                        if attributes.value('rdm_bw_total') is not None:
                            keywords = ()
                            keywords += ('rdm'
                                         if self.rdm_bw_cli_rdm_kw else '', )
                            if self.rdm_bw_cli_style is _Rsvp.RdmBwCliStyle.unnamed_subpool:
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] <0-4294967295> [Kbps|Mbps|Gbps] [<0-4294967295> [Kbps|Mbps|Gbps]] [sub-pool <0-4294967295> [Kbps|Mbps|Gbps]]
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] percentage <0-10000> [<0-10000>] [sub-pool <0-10000>]
                                keywords += ('', 'sub-pool')
                            elif self.rdm_bw_cli_style is _Rsvp.RdmBwCliStyle.bc0_bc1:
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] bc0 <0-4294967295> [<0-4294967295> [Kbps|Mbps|Gbps]] [bc1 <0-4294967295> [Kbps|Mbps|Gbps]]
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] percentage bc0 <0-10000> [<0-10000>] [bc1 <0-10000>]
                                keywords += ('bc0', 'bc1')
                            elif self.rdm_bw_cli_style is _Rsvp.RdmBwCliStyle.global_subpool:
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] global-pool <0-4294967295> [Kbps|Mbps|Gbps] [<0-4294967295> [Kbps|Mbps|Gbps]] [sub-pool <0-4294967295> [Kbps|Mbps|Gbps]]
                                # iosxr: rsvp / interface <name> / bandwidth [rdm] percentage global-pool <0-10000> [<0-10000>] [sub-pool <0-10000>]
                                keywords += ('global-pool', 'sub-pool')
                            else:
                                raise ValueError(self.rdm_bw_cli_style)
                            cfg = 'bandwidth'
                            if self.rdm_bw_percentage:
                                cfg += ' percentage'
                            if keywords[0]:
                                cfg += ' ' + keywords[0]  # rdm
                            if keywords[1]:
                                cfg += ' ' + keywords[1]  # |bc0|global-pool
                            cfg += format_bw_unit_percent(
                                self.rdm_bw_total, self.rdm_bw_total_unit,
                                self.rdm_bw_percentage)
                            cfg += format_bw_unit_percent(
                                self.rdm_bw_largest, self.rdm_bw_largest_unit,
                                self.rdm_bw_percentage)
                            if self.rdm_bw_subpool is not None:
                                if keywords[2]:
                                    cfg += ' ' + keywords[
                                        2]  # sub-pool|bc1|sub-pool
                                cfg += format_bw_unit_percent(
                                    self.rdm_bw_subpool,
                                    self.rdm_bw_subpool_unit,
                                    self.rdm_bw_percentage)
                            configurations.append_line(cfg)

                    elif attributes.value('enable_default_bw'):
                        # Effectively overrides rdm config above
                        # iosxr: rsvp / interface <name> / bandwidth
                        configurations.append_line('bandwidth')

                    if not self.mam_bw_percentage \
                            or not self.isinherited('mam_bw_percentage') \
                            or not self.isinherited('mam_bw_total'):
                        if attributes.value('mam_bw_max_reservable') is not None \
                                or attributes.value('mam_bw_total') is not None:
                            # iosxr: rsvp / interface <name> / bandwidth mam [max-reservable-bw] [<0-4294967295> [<0-4294967295> [Kbps|Mbps|Gbps]] [bc0 <0-4294967295> [Kbps|Mbps|Gbps] [bc1 <0-4294967295> [Kbps|Mbps|Gbps]]]]
                            # iosxr: rsvp / interface <name> / bandwidth mam percentage [max-reservable-bw] [<0-10000> [<0-10000>] [bc0 <0-10000> [bc1 <0-10000>]]]
                            cfg = 'bandwidth mam'
                            if self.mam_bw_percentage:
                                cfg += ' percentage'
                            if self.mam_bw_max_reservable:
                                cfg += ' max-reservable-bw'
                            if self.mam_bw_total is not None:
                                cfg += format_bw_unit_percent(
                                    self.mam_bw_total, self.mam_bw_total_unit,
                                    self.mam_bw_percentage)
                                cfg += format_bw_unit_percent(
                                    self.mam_bw_largest,
                                    self.mam_bw_largest_unit,
                                    self.mam_bw_percentage)
                                if self.mam_bw_bc0 is not None:
                                    cfg += ' bc0'
                                    cfg += format_bw_unit_percent(
                                        self.mam_bw_bc0, self.mam_bw_bc0_unit,
                                        self.mam_bw_percentage)
                                    if self.mam_bw_bc1 is not None:
                                        cfg += ' bc1'
                                        cfg += format_bw_unit_percent(
                                            self.mam_bw_bc1,
                                            self.mam_bw_bc1_unit,
                                            self.mam_bw_percentage)
                            configurations.append_line(cfg)

                return str(configurations)
Пример #22
0
        def build_config(self,
                         links=None,
                         apply=True,
                         attributes=None,
                         unconfig=False,
                         **kwargs):
            '''Device build config'''
            assert not apply
            attributes = AttributesHelper(self, attributes)
            configurations = CliConfigBuilder(unconfig=unconfig)

            # iosxr: rsvp (config-rsvp)
            with configurations.submode_context('rsvp'):
                if unconfig and attributes.iswildcard:
                    configurations.submode_unconfig()

                # iosxr: rsvp / authentication (config-rsvp-auth)
                with configurations.submode_context('authentication',
                                                    cancel_empty=True):

                    # iosxr: rsvp / authentication / key-source key-chain someword
                    configurations.append_line(
                        attributes.format(
                            'key-source key-chain {auth_keysrc_keychain}'))

                    # iosxr: rsvp / authentication / life-time 30
                    configurations.append_line(
                        attributes.format('life-time {auth_lifetime}'))

                    # iosxr: rsvp / authentication / window-size 1
                    configurations.append_line(
                        attributes.format('window-size {auth_window_size}'))

                    # iosxr: rsvp / authentication / retransmit <0-10000>
                    configurations.append_line(
                        attributes.format('retransmit {auth_retransmit}'))

                # iosxr: rsvp / bandwidth rdm percentage max-reservable-bc0 <0-10000>
                # iosxr: rsvp / bandwidth rdm percentage max-reservable-bc0 <0-10000> bc1 <0-10000>
                if self.rdm_bw_percentage:
                    cfg = attributes.format(
                        'bandwidth rdm percentage max-reservable-bc0 {rdm_bw_total}'
                    )
                    if cfg:
                        cfg += attributes.format(' bc1 {rdm_bw_subpool}',
                                                 force=True)
                        configurations.append_line(cfg)

                # iosxr: rsvp / bandwidth mam percentage max-reservable <0-10000>
                # iosxr: rsvp / bandwidth mam percentage max-reservable <0-10000> bc0 <0-10000>
                # iosxr: rsvp / bandwidth mam percentage max-reservable <0-10000> bc0 <0-10000> bc1 <0-10000>
                if self.mam_bw_percentage:
                    cfg = attributes.format(
                        'bandwidth mam percentage max-reservable {mam_bw_total}'
                    )
                    if cfg:
                        if self.mam_bw_bc0 is not None:
                            cfg += attributes.format(' bc0 {mam_bw_bc0}',
                                                     force=True)
                            cfg += attributes.format(' bc1 {mam_bw_bc1}',
                                                     force=True)
                        configurations.append_line(cfg)

                # iosxr: rsvp / logging events issu
                if attributes.value('log_events_issu'):
                    configurations.append_line('logging events issu')

                # iosxr: rsvp / logging events nsr
                if attributes.value('log_events_nsr'):
                    configurations.append_line('logging events nsr')

                # iosxr: rsvp / latency threshold <0-180>
                # iosxr: rsvp / ltrace-buffer multiplier 2 all
                # iosxr: rsvp / ltrace-buffer multiplier 2 common
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err intf sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common dbg-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common intf sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 common sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err intf sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 dbg-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 intf sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 rare sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig-err
                # iosxr: rsvp / ltrace-buffer multiplier 2 sig-err sync
                # iosxr: rsvp / ltrace-buffer multiplier 2 sync

                # iosxr: rsvp / signalling checksum disable
                if attributes.value('sig_checksum') is False:
                    configurations.append_line('signalling checksum disable')

                # iosxr: rsvp / signalling event-per-pulse <0-1600>
                configurations.append_line(
                    attributes.format(
                        'signalling event-per-pulse {sig_event_per_pulse}'))

                # iosxr: rsvp / signalling graceful-restart
                # iosxr: rsvp / signalling graceful-restart disable
                v = attributes.value('sig_gr')
                if v is not None:
                    if v:
                        configurations.append_line(
                            'signalling graceful-restart')
                    else:
                        configurations.append_line(
                            'signalling graceful-restart disable')

                # iosxr: rsvp / signalling graceful-restart recovery-time <0-3600>
                configurations.append_line(
                    attributes.format(
                        'signalling graceful-restart recovery-time {sig_gr_recov_time}'
                    ))

                # iosxr: rsvp / signalling graceful-restart restart-time 60
                configurations.append_line(
                    attributes.format(
                        'signalling graceful-restart restart-time {sig_gr_restart_time}'
                    ))

                # iosxr: rsvp / signalling hello graceful-restart refresh interval 3000
                configurations.append_line(
                    attributes.format(
                        'signalling hello graceful-restart refresh interval {sig_hello_gr_refresh_interval}'
                    ))

                # iosxr: rsvp / signalling hello graceful-restart refresh misses 1
                configurations.append_line(
                    attributes.format(
                        'signalling hello graceful-restart refresh misses {sig_hello_gr_refresh_misses}'
                    ))

                # iosxr: rsvp / signalling message-bundle disable
                if attributes.value('sig_message_bundle') is False:
                    configurations.append_line(
                        'signalling message-bundle disable')

                # iosxr: rsvp / signalling out-of-band vrf someword
                configurations.append_line(
                    attributes.format(
                        'signalling out-of-band vrf {sig_outofband_vrf.name}'))

                # iosxr: rsvp / signalling patherr state-removal disable
                if attributes.value('sig_patherr_state_removal') is False:
                    configurations.append_line(
                        'signalling patherr state-removal disable')

                # iosxr: rsvp / signalling prefix-filtering access-list someword
                configurations.append_line(
                    attributes.format(
                        'signalling prefix-filtering access-list {sig_prefixfilt_acl.name}'
                    ))

                # iosxr: rsvp / signalling prefix-filtering default-deny-action drop
                configurations.append_line(
                    attributes.format(
                        'signalling prefix-filtering default-deny-action {sig_prefixfilt_defdenyaction.value}'
                    ))

                # Add per-interface config
                for sub, attributes2 in attributes.mapping_values(
                        'interface_attr', keys=self.interfaces, sort=True):
                    configurations.append_block(
                        sub.build_config(apply=False,
                                         attributes=attributes2,
                                         unconfig=unconfig,
                                         **kwargs))

                # Add per-neighbor config
                for sub, attributes2 in attributes.mapping_values(
                        'neighbor_attr', keys=self.neighbors, sort=True):
                    configurations.append_block(
                        sub.build_config(apply=False,
                                         attributes=attributes2,
                                         unconfig=unconfig,
                                         **kwargs))

                # Add per-controller config
                for sub, attributes2 in attributes.mapping_values(
                        'controller_attr', keys=self.controllers, 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)
Пример #23
0
                    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)

                        # if self.vrf_name != 'default':
                        #     configurations.append_line('exit')

                        # the interface should have vrf(name = vrf_name) attached
                        with configurations.submode_context(
                                attributes.format('interface {interface_name}',
                                                  force=True)):
                            if unconfig and attributes.iswildcard:
                                configurations.submode_unconfig()
                            if unconfig:
                                attributes.attributes['ip'] = self.ip

                            # interface <intf_name>
                            # ip/ipv6 pim sparse-mode
                            if attributes.value('mode'):
                                configurations.append_line(
                                    attributes.format('{ip} pim sparse-mode'))

                            # interface <intf_name>
                            # ip/ipv6 pim jp-policy <boundary> [in|out]
                            if attributes.value('boundary') and \
                               attributes.value('boundary_in') and \
                               attributes.value('boundary_out'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim jp-policy {boundary} in'))
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim jp-policy {boundary} out'))
                            elif attributes.value('boundary') and \
                               attributes.value('boundary_in') and \
                               not attributes.value('boundary_out'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim jp-policy {boundary} in'))
                            elif attributes.value('boundary') and \
                               not attributes.value('boundary_in') and \
                               attributes.value('boundary_out'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim jp-policy {boundary} out'))
                            elif attributes.value('boundary') and \
                               not attributes.value('boundary_in') and \
                               not attributes.value('boundary_out'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim jp-policy {boundary}'))

                            # interface <intf_name>
                            # ip/ipv6 pim border
                            if attributes.value('bsr_border'):
                                configurations.append_line(
                                    attributes.format('{ip} pim border'))

                            # interface <intf_name>
                            # ip/ipv6 pim hello-interval {hello_interval}
                            if attributes.value('hello_interval'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim hello-interval '
                                        '{hello_interval}'))

                            # interface <intf_name>
                            # ip/ipv6 pim dr-priority {dr_priority}
                            if attributes.value('dr_priority'):
                                configurations.append_line(
                                    attributes.format('{ip} pim dr-priority '
                                                      '{dr_priority}'))

                            # interface <intf_name>
                            # ip/ipv6 pim neighbor-policy {neighbor_filter}
                            if attributes.value('neighbor_filter'):
                                configurations.append_line(
                                    attributes.format(
                                        '{ip} pim neighbor-policy '
                                        '{neighbor_filter}'))

                            # interface <intf_name>
                            # ip/ipv6 pim neighbor-policy prefix-list
                            #   <neighbor_filter_prefix_list>
                            if attributes.value('neighbor_filter_prefix_list') \
                               and self.ip == 'ip':
                                configurations.append_line(
                                    attributes.format(
                                        'ip pim neighbor-policy prefix-list '
                                        '{neighbor_filter_prefix_list}'))

                        return str(configurations)
Пример #24
0
            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 / bridge group someword (config-l2vpn-bg)
                # iosxr: l2vpn / bridge group someword (config-l2vpn-bg)
                # iosxr: l2vpn / bridge group someword / bridge-domain someword2 (config-l2vpn-bg-bd)

                # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / routed interface BVI1
                # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 (config-l2vpn-bg-bd-ac)
                with configurations.submode_context(
                        attributes.format(
                            'routed interface {interface_name}' if isinstance(
                                self.interface, BviInterface) else
                            'interface {interface_name}',
                            force=True),
                        exit_cmd=''
                        if isinstance(self.interface, BviInterface) else
                        'exit',  # routed interface may not be an actual submode
                ):
                    if unconfig and attributes.iswildcard:
                        configurations.submode_unconfig()

                    if isinstance(self.interface, BviInterface):

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / routed interface BVI1 / split-horizon group core
                        v = attributes.value('split_horizon_group_core')
                        if v is True:
                            configurations.append_line(
                                'split-horizon group core')

                        if configurations:
                            # There are configurations... It must be a submode; exit.
                            configurations.append_line('exit', raw=True)
                        else:
                            # There are no configurations... May not be be a submode; Don't exit.
                            pass

                    else:
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dhcp ipv4 none
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dhcp ipv4 snoop profile someword3
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection (config-l2vpn-bg-bd-ac-dai)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation (config-l2vpn-bg-bd-ac-dai-av)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / dst-mac
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / dst-mac disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / ipv4
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / ipv4 disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / src-mac
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / address-validation / src-mac disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / logging
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / dynamic-arp-inspection / logging disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / flooding
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / flooding disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / flooding unknown-unicast
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / flooding unknown-unicast disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / igmp snooping profile someword3
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / ip-source-guard (config-l2vpn-bg-bd-ac-ipsg)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / ip-source-guard / disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / ip-source-guard / logging
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / ip-source-guard / logging disable

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / mac (config-l2vpn-bg-bd-ac-mac)
                        sub, attributes2 = attributes.namespace('mac')
                        if sub is not None:
                            configurations.append_block(
                                sub.build_config(apply=False,
                                                 attributes=attributes2,
                                                 unconfig=unconfig))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / mac (config-l2vpn-bg-bd-ac-mac)

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / mld snooping profile someword3

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / split-horizon group
                        v = attributes.value('split_horizon_group')
                        if v is True:
                            configurations.append_line('split-horizon group')

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / static-mac-address aaaa.bbbb.cccc
                        configurations.append_line(
                            attributes.format(
                                'static-mac-address {static_mac_address}'))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control broadcast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control broadcast pps 1
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control multicast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control multicast pps 1
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control unknown-unicast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 / storm-control unknown-unicast pps 1

                return str(configurations)
Пример #25
0
                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)

                    # Set decider key af_name from user set address family
                    self.af_name = self.address_family.value

                    # ======
                    # enable
                    # ======
                    if attributes.value('enabled'):
                        if unconfig is False:
                            if self.af_name == 'ipv4':
                                configurations.append_line(
                                    attributes.format('feature pim'))
                            elif self.af_name == 'ipv6':
                                configurations.append_line(
                                    attributes.format('feature pim6'))
                        elif unconfig is True:
                            if self.af_name == 'ipv4':
                                configurations.append_line('no feature pim',
                                                           raw=True)
                            elif self.af_name == 'ipv6':
                                configurations.append_line('no feature pim6',
                                                           raw=True)

                    # =========
                    # multipath
                    # =========
                    if attributes.value('multipath'):
                        if unconfig is False:
                            configurations.append_line(
                                attributes.format('ip multicast multipath'))
                        elif unconfig is True:
                            configurations.append_line(
                                'no ip multicast multipath', raw=True)

                    # Mroute attributes configs
                    for mroute, attributes2 in attributes.sequence_values(
                            'mroutes', sort=True):
                        kwargs = {'vrf': self.vrf_id, 'af_name': self.af_name}
                        if unconfig:
                            configurations.append_block(
                                mroute.build_unconfig(apply=False,
                                                      attributes=attributes2,
                                                      **kwargs))
                        else:
                            configurations.append_block(
                                mroute.build_config(apply=False,
                                                    attributes=attributes2,
                                                    **kwargs))

                    return str(configurations)
Пример #26
0
        def build_config(self,
                         apply=True,
                         attributes=None,
                         unconfig=False,
                         **kwargs):
            assert not kwargs, kwargs
            attributes = AttributesHelper(self, attributes)
            configurations = CliConfigBuilder(unconfig=unconfig)

            cfg_line = []
            unconfig_line = []

            # enabled
            if attributes.value('enabled'):
                if unconfig is False:
                    configurations.append_line(
                        attributes.format('feature pim'))
                    configurations.append_line(
                        attributes.format('feature pim6'))

                # Make sure that only enabled was provided in attributes
                # If wildcard,  then delete everything
                elif unconfig is True and\
                     attributes.attributes == {'enabled': {True: None}} or \
                        attributes.iswildcard:
                    configurations.append_line('no feature pim', raw=True)
                    configurations.append_line('no feature pim6', raw=True)
                    if apply:
                        if configurations:
                            self.device.configure(configurations)
                    else:
                        return CliConfig(device=self.device,
                                         unconfig=unconfig,
                                         cli_config=configurations)

            # enable_pim
            elif attributes.value('enabled_pim'):
                cfg_line.append('feature pim')
                unconfig_line.append('no feature pim')

            # enable_pim6
            elif attributes.value('enabled_pim6'):
                cfg_line.append('feature pim6')
                unconfig_line.append('no feature pim6')

            if cfg_line:
                if unconfig is False:
                    configurations.append_line('\n'.join(cfg_line))
                elif unconfig is True:
                    configurations.append_line('\n'.join(unconfig_line),
                                               raw=True)
                    if apply:
                        if configurations:
                            self.device.configure(configurations)
                    else:
                        return CliConfig(device=self.device,
                                         unconfig=unconfig,
                                         cli_config=configurations)

            # VrfAttributes
            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)
Пример #27
0
                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)
                    # assign ip version according to the address_family_attr
                    if hasattr(self, 'address_family'):
                        if 'ipv4' in self.address_family.value:
                            self.ip = 'ip'
                        if 'ipv6' in self.address_family.value:
                            self.ip = 'ipv6'

                    if unconfig:
                        attributes.attributes['ip'] = self.ip

                    with configurations.submode_context(
                            None if self.vrf_name == 'default' else attributes.
                            format('vrf context {vrf_name}', force=True)):
                        # no configuration append if vrf is default
                        if self.vrf_name != 'default' and unconfig and \
                            attributes.iswildcard:
                            configurations.submode_unconfig()

                        # ==== PIM Auto-RP =======
                        if attributes.value('auto_rp') or \
                           attributes.value('send_rp'):

                            # auto-rp rp-candidate | send-rp-announce
                            if attributes.value('auto_rp'):
                                auto_rp_str = 'ip pim auto-rp rp-candidate'
                            elif attributes.value('send_rp'):
                                auto_rp_str = 'ip pim send-rp-announce'

                            # + {send_rp_announce_rp_group} |
                            # + {send_rp_announce_intf}
                            if attributes.value('send_rp_announce_rp_group'):
                                auto_rp_str += ' {send_rp_announce_rp_group}'
                            elif attributes.value('send_rp_announce_intf'):
                                auto_rp_str += ' {send_rp_announce_intf}'
                            else:
                                auto_rp_str = ''

                            # + group-list {send_rp_announce_group_list} |
                            # + route-map {send_rp_announce_route_map} |
                            # + prefix-list {send_rp_announce_prefix_list}
                            if auto_rp_str:
                                if attributes.value(
                                        'send_rp_announce_group_list'):
                                    auto_rp_str += ' group-list'\
                                                   ' {send_rp_announce_group_list}'
                                elif attributes.value(
                                        'send_rp_announce_route_map'):
                                    auto_rp_str += ' route-map'\
                                                   ' {send_rp_announce_route_map}'
                                elif attributes.value(
                                        'send_rp_announce_prefix_list'):
                                    auto_rp_str += ' prefix-list'\
                                                   ' {send_rp_announce_prefix_list}'
                                else:
                                    auto_rp_str = ''

                            if auto_rp_str:
                                # + interval {send_rp_announce_interval}
                                if attributes.value(
                                        'send_rp_announce_interval'):
                                    auto_rp_str += ' interval'\
                                                   ' {send_rp_announce_interval}'

                                # + scope {send_rp_announce_scope}
                                if attributes.value('send_rp_announce_scope'):
                                    auto_rp_str += ' scope {send_rp_announce_scope}'

                                # + bidir
                                if attributes.value('send_rp_announce_bidir'):
                                    auto_rp_str += ' bidir'

                            configurations.append_line(
                                attributes.format(auto_rp_str))

                        # === PIM Send-RP-Discovery ===
                        # ip pim auto-rp mapping-agent|send-rp-discovery
                        #  <send_rp_discovery_intf>
                        #  [scope ,send_rp_discovery_scope>]
                        if attributes.value('auto_rp_discovery') or \
                           attributes.value('send_rp_discovery'):

                            # set auto-rp method
                            if attributes.value('auto_rp_discovery'):
                                pre_str = 'ip pim auto-rp mapping-agent'
                            if attributes.value('send_rp_discovery'):
                                pre_str = 'ip pim send-rp-discovery'

                            #  <send_rp_discovery_intf>
                            #  [scope ,send_rp_discovery_scope>]
                            if attributes.value('send_rp_discovery_intf') and \
                               attributes.value('send_rp_discovery_scope'):
                                pre_str +=' {send_rp_discovery_intf}'\
                                          ' scope {send_rp_discovery_scope}'

                            elif attributes.value('send_rp_discovery_intf') and \
                               not attributes.value('send_rp_discovery_scope'):
                                pre_str += ' {send_rp_discovery_intf}'

                            configurations.append_line(
                                attributes.format(pre_str))
                            # initial it back
                            pre_str = ''

                        # ip pim auto-rp forward listen
                        if attributes.value('autorp_listener'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim auto-rp forward listen'))

                        # ==== PIM BSR =======
                        # == bsr bsr-candidate ==
                        # ip/ipv6 pim auto-rp forward listen
                        # ip/ipv6 pim [bsr] bsr-candidate <bsr_candidate_interface>
                        if attributes.value('bsr_candidate_interface'):
                            # ip/ipv6 pim bsr forward listen
                            configurations.append_line(
                                attributes.format(
                                    '{ip} pim bsr forward listen'))

                            # ip/ipv6 pim bsr-candidate {bsr_candidate_interface}
                            bsr_str = '{ip} pim bsr-candidate '\
                                      '{bsr_candidate_interface}'

                            # + hash-len <bsr_candidate_hash_mask_length>
                            if attributes.value(
                                    'bsr_candidate_hash_mask_length'):
                                bsr_str += ' hash-len '\
                                           '{bsr_candidate_hash_mask_length}'

                            # + interval <bsr_candidate_interval>
                            if attributes.value('bsr_candidate_interval'):
                                bsr_str += ' interval {bsr_candidate_interval}'

                            # + priority <bsr_candidate_priority>
                            if attributes.value('bsr_candidate_priority'):
                                bsr_str += ' priority {bsr_candidate_priority}'

                            configurations.append_line(
                                attributes.format(bsr_str))

                        # == bsr rp-candidate ==
                        # ip/ipv6 pim auto-rp forward listen
                        # ip/ipv6 pim [bsr] rp-candidate <bsr_rp_candidate_interface>
                        if attributes.value('bsr_rp_candidate_interface'):
                            # ip/ipv6 pim bsr forward listen
                            configurations.append_line(
                                attributes.format(
                                    '{ip} pim bsr forward listen'))

                            # ip/ipv6 pim rp-candidate {bsr_rp_candidate_interface}
                            bsr_rp_str = '{ip} pim rp-candidate '\
                                      '{bsr_rp_candidate_interface}'

                            # + group-list {bsr_rp_candidate_group_list} |
                            # + route-map {bsr_rp_candidate_route_map} |
                            # + prefix-list {bsr_rp_candidate_prefix_list}
                            if attributes.value('bsr_rp_candidate_group_list'):
                                bsr_rp_str += ' group-list'\
                                               ' {bsr_rp_candidate_group_list}'
                            elif attributes.value(
                                    'bsr_rp_candidate_route_map'):
                                bsr_rp_str += ' route-map'\
                                               ' {bsr_rp_candidate_route_map}'
                            elif attributes.value(
                                    'bsr_rp_candidate_prefix_list'):
                                bsr_rp_str += ' prefix-list'\
                                               ' {bsr_rp_candidate_prefix_list}'
                            else:
                                bsr_rp_str = ''

                            if bsr_rp_str:
                                # +priority <bsr_rp_candidate_priority>
                                if attributes.value(
                                        'bsr_rp_candidate_priority'):
                                    bsr_rp_str += ' priority '\
                                               '{bsr_rp_candidate_priority}'

                                # +interval <bsr_rp_candidate_interval>
                                if attributes.value(
                                        'bsr_rp_candidate_interval'):
                                    bsr_rp_str += ' interval {bsr_rp_candidate_interval}'

                                # +bidir
                                if attributes.value('bsr_rp_candidate_bidir'):
                                    bsr_rp_str += ' bidir'

                            configurations.append_line(
                                attributes.format(bsr_rp_str))

                        # ip/ipv6 pim register-policy <accept_register>
                        if attributes.value('accept_register'):
                            configurations.append_line(
                                attributes.format('{ip} pim register-policy '
                                                  '{accept_register}'))

                        # ip pim register-policy prefix-list
                        #   <accept_register_prefix_list>
                        if attributes.value('accept_register_prefix_list') \
                           and self.ip == 'ip':
                            configurations.append_line(
                                attributes.format(
                                    'ip pim register-policy prefix-list '
                                    '{accept_register_prefix_list}'))

                        # ip/ipv6 pim log-neighbor-changes
                        if attributes.value('log_neighbor_changes'):
                            configurations.append_line(
                                attributes.format(
                                    '{ip} pim log-neighbor-changes'))

                        # ip pim register-source <register_source>
                        if attributes.value('register_source') and \
                           self.ip == 'ip':
                            configurations.append_line(
                                attributes.format(
                                    'ip pim register-source {register_source}')
                            )

                        # ip pim sg-expiry-timer infinity
                        if attributes.value('sg_expiry_timer_infinity') and \
                           not attributes.value('sg_expiry_timer_prefix_list') \
                           and not attributes.value('sg_expiry_timer_sg_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer infinity'))

                        # ip pim sg-expiry-timer <sg_expiry_timer>
                        if attributes.value('sg_expiry_timer') and \
                           not attributes.value('sg_expiry_timer_prefix_list') \
                           and not attributes.value('sg_expiry_timer_sg_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer {sg_expiry_timer}')
                            )

                        # ip pim sg-expiry-timer <sg_expiry_timer>
                        #   prefix-list <sg_expiry_timer_prefix_list>
                        if attributes.value('sg_expiry_timer') and \
                           attributes.value('sg_expiry_timer_prefix_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer {sg_expiry_timer} '
                                    'prefix-list {sg_expiry_timer_prefix_list}'
                                ))

                        # ip pim sg-expiry-timer <sg_expiry_timer>
                        #   sg-list <sg_expiry_timer_sg_list>
                        if attributes.value('sg_expiry_timer') and \
                           attributes.value('sg_expiry_timer_sg_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer {sg_expiry_timer} '
                                    'sg-list {sg_expiry_timer_sg_list}'))

                        # ip pim sg-expiry-timer infinity
                        #   prefix-list <sg_expiry_timer_prefix_list>
                        if attributes.value('sg_expiry_timer_infinity') and \
                           attributes.value('sg_expiry_timer_prefix_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer infinity '
                                    'prefix-list {sg_expiry_timer_prefix_list}'
                                ))

                        # ip pim sg-expiry-timer infinity
                        #   sg-list <sg_expiry_timer_sg_list>
                        if attributes.value('sg_expiry_timer_infinity') and \
                           attributes.value('sg_expiry_timer_sg_list'):
                            configurations.append_line(
                                attributes.format(
                                    'ip pim sg-expiry-timer infinity '
                                    'sg-list {sg_expiry_timer_sg_list}'))

                        # ip/ipv6 pim spt-threshold infinity group-list
                        #   <spt_switch_policy>
                        if attributes.value('spt_switch_infinity') and \
                           attributes.value('spt_switch_policy'):
                            configurations.append_line(
                                attributes.format(
                                    '{ip} pim spt-threshold {spt_switch_infinity.value} '
                                    'group-list {spt_switch_policy}'))

                        # ip/ipv6 pim use-shared-tree-only group-list <spt_switch_policy>
                        if not attributes.value('spt_switch_infinity') and \
                           attributes.value('spt_switch_policy'):
                            configurations.append_line(
                                attributes.format(
                                    '{ip} pim use-shared-tree-only group-list'
                                    ' {spt_switch_policy}'))

                        # Static RP address Attributes under top level config
                        for groups, attributes2 in attributes.sequence_values(
                                'rp_addresses', sort=True):
                            kwargs = {'ip_type': self.ip}
                            if unconfig:
                                configurations.append_block(
                                    groups.build_unconfig(
                                        apply=False,
                                        attributes=attributes2,
                                        **kwargs))
                            else:
                                configurations.append_block(
                                    groups.build_config(apply=False,
                                                        attributes=attributes2,
                                                        **kwargs))

                    # InterfaceAttributes
                    for sub, attributes2 in attributes.mapping_values(
                            'interface_attr', keys=self.interface_attr,
                            sort=True):
                        configurations.append_block(
                            sub.build_config(apply=False,
                                             attributes=attributes2,
                                             unconfig=unconfig))

                    return str(configurations)
Пример #28
0
            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)

                nbr_ctx = None
                nbr_is_submode = True
                if isinstance(self.neighbor, PseudowireIPv4Neighbor):
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 (config-l2vpn-bg-bd-pw)
                    assert self.ip is not None
                    assert self.pw_id is not None
                    nbr_ctx = attributes.format('neighbor {ip} pw-id {pw_id}',
                                                force=True)
                elif isinstance(self.neighbor, PseudowireEviNeighbor):
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor evpn 1 target 1
                    assert self.evi is not None
                    assert self.ac_id is not None
                    nbr_ctx = attributes.format(
                        'neighbor evpn {evi.evi_id} target {ac_id}',
                        force=True)
                    nbr_is_submode = False
                else:
                    raise ValueError(self.neighbor)
                if not nbr_is_submode:
                    configurations.append_line(nbr_ctx)
                else:
                    with configurations.submode_context(nbr_ctx):
                        if unconfig and attributes.iswildcard:
                            configurations.submode_unconfig()

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / backup neighbor 1.2.3.4 pw-id 1 (config-l2vpn-bg-bd-pw-backup)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / backup neighbor 1.2.3.4 pw-id 1 / pw-class someword3

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / dhcp ipv4 none
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / dhcp ipv4 snoop profile someword3
                        v = attributes.value('dhcp_ipv4_snooping_profile')
                        if v is not None:
                            if v is False:
                                configurations.append_line('dhcp ipv4 none')
                            else:
                                configurations.append_line(
                                    'dhcp ipv4 snoop profile {}'.format(v))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / flooding
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / flooding disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / flooding unknown-unicast
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / flooding unknown-unicast disable

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / igmp snooping profile someword3
                        v = attributes.value('igmp_snooping_profile')
                        if v is not None:
                            if v is False:
                                pass
                            else:
                                configurations.append_line(
                                    'igmp snooping profile {}'.format(v))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac (config-l2vpn-bg-bd-pw-mac)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / aging (config-l2vpn-bg-bd-pw-mac-aging)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / aging / time 300
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / aging / type absolute
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / aging / type inactivity
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / learning
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / learning disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit (config-l2vpn-bg-bd-pw-mac-limit)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / action flood
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / action no-flood
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / action none
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / action shutdown
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / maximum 1
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / notification both
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / notification none
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / notification syslog
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / limit / notification trap
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / port-down flush
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / port-down flush disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure (config-l2vpn-bg-bd-pw-mac-secure)
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / action none
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / action restrict
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / action shutdown
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / disable
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / logging
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mac / secure / logging disable

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mld snooping profile someword3
                        v = attributes.value('mld_snooping_profile')
                        if v is not None:
                            if v is False:
                                pass
                            else:
                                configurations.append_line(
                                    'mld snooping profile {}'.format(v))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / mpls static label local 16 remote 16
                        remote_label = attributes.value('mpls_static_label')
                        if remote_label is not None:
                            local_label = self.parent.neighbor_attr[
                                self.remote_neighbor].mpls_static_label
                            if local_label is None:
                                warnings.warn(
                                    'remote neighbor {!r} mpls_static_label missing'
                                    .format(self.remote_neighbor),
                                    UnsupportedAttributeWarning)
                            else:
                                configurations.append_line('mpls static label local {} remote {}'.\
                                                      format(local_label, remote_label))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / pw-class someword3
                        v = attributes.value('pw_class')
                        if v is not None:
                            configurations.append_line('pw-class {}'.\
                                                  format(v.device_attr[self.device].name))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / split-horizon group
                        if attributes.value('split_horizon'):
                            configurations.append_line('split-horizon group')

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / static-mac-address aaaa.bbbb.cccc
                        configurations.append_line(
                            attributes.format(
                                'static-mac-address {static_mac_address}'))

                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control broadcast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control broadcast pps 1
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control multicast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control multicast pps 1
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control unknown-unicast kbps 64
                        # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 / storm-control unknown-unicast pps 1

                return str(configurations)
Пример #29
0
                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 {interface.name}',
                                              force=True)):

                        # enable
                        if attributes.value('enable'):
                            configurations.append_line('ipv6 mld router')

                        # group_policy
                        if attributes.value('group_policy'):
                            configurations.append_line(
                                attributes.format(
                                    'ipv6 mld access-group {group_policy}'))

                        # immediate_leave  -- not supported on iosxe

                        # max_groups
                        if attributes.value('max_groups'):
                            configurations.append_line(
                                attributes.format(
                                    'ipv6 mld limit {max_groups}'))

                        # query_interval
                        if attributes.value('query_interval'):
                            configurations.append_line(
                                attributes.format(
                                    'ipv6 mld query-interval {query_interval}')
                            )

                        # query_max_response_time
                        if attributes.value('query_max_response_time'):
                            configurations.append_line(
                                attributes.format(
                                    'ipv6 mld query-max-response-time '
                                    '{query_max_response_time}'))

                        # version  --  not supported on iosxe

                        # robustness_variable  --  not supported on iosxe

                        # Groups Attributes under top level config
                        for groups, attributes2 in attributes.sequence_values(
                                'groups', sort=True):
                            if unconfig:
                                configurations.append_block(
                                    groups.build_unconfig(
                                        apply=False,
                                        attributes=attributes2,
                                        **kwargs))
                            else:
                                configurations.append_block(
                                    groups.build_config(apply=False,
                                                        attributes=attributes2,
                                                        **kwargs))

                    return str(configurations)
Пример #30
0
        def build_config(self,
                         apply=True,
                         attributes=None,
                         unconfig=False,
                         contained=False,
                         **kwargs):
            assert not kwargs, kwargs
            attributes = AttributesHelper(self, attributes)
            configurations = CliConfigBuilder(unconfig=unconfig)

            # iosxr: l2vpn (config-l2vpn)
            submode_stack = contextlib.ExitStack()
            if not contained:
                submode_stack.enter_context(
                    configurations.submode_context('l2vpn'))

            # iosxr: l2vpn / bridge group someword (config-l2vpn-bg)
            with configurations.submode_context(
                    attributes.format('bridge group {group_name}',
                                      force=True,
                                      cancel_empty=True)):

                # iosxr: l2vpn / bridge group someword / bridge-domain someword2 (config-l2vpn-bg-bd)
                with configurations.submode_context(
                        attributes.format('bridge-domain {name}', force=True)):
                    if unconfig and attributes.iswildcard:
                        configurations.submode_unconfig()

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / coupled-mode
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dhcp ipv4 snoop profile someword3
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection (config-l2vpn-bg-bd-dai)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection / address-validation (config-l2vpn-bg-bd-dai-av)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection / address-validation / dst-mac
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection / address-validation / ipv4
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection / address-validation / src-mac
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / dynamic-arp-inspection / logging

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / evi 1 (config-l2vpn-bg-bd-evi)
                    for sub, attributes2 in attributes.mapping_values(
                            'evi_attr', keys=self.evis, sort=True):
                        configurations.append_block(
                            sub.build_config(apply=False,
                                             attributes=attributes2,
                                             unconfig=unconfig))

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / flooding disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / flooding unknown-unicast disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / igmp snooping disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / igmp snooping profile someword3

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / routed interface BVI1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / interface Bundle-Ether1 (config-l2vpn-bg-bd-ac)
                    for sub, attributes2 in attributes.mapping_values(
                            'interface_attr', keys=self.interfaces, sort=True):
                        configurations.append_block(
                            sub.build_config(apply=False,
                                             attributes=attributes2,
                                             unconfig=unconfig))

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / ip-source-guard (config-l2vpn-bg-bd-ipsg)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / ip-source-guard / logging

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / mac (config-l2vpn-bg-bd-mac)
                    ns, attributes2 = attributes.namespace('mac')
                    if ns is not None:
                        configurations.append_block(
                            ns.build_config(apply=False,
                                            attributes=attributes2,
                                            unconfig=unconfig))

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / member vni 1 (config-l2vpn-bg-bd-vni)
                    for sub, attributes2 in attributes.mapping_values(
                            'vni_attr', keys=self.vnis, sort=True):
                        configurations.append_block(
                            sub.build_config(apply=False,
                                             attributes=attributes2,
                                             unconfig=unconfig))

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / mld snooping profile someword3
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / mtu 100

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor 1.2.3.4 pw-id 1 (config-l2vpn-bg-bd-pw)
                    for sub, attributes2 in attributes.mapping_values(
                            'neighbor_attr',
                            keys=self.pseudowire_neighbors,
                            sort=True):
                        configurations.append_block(
                            sub.build_config(apply=False,
                                             attributes=attributes2,
                                             unconfig=unconfig))

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor evpn evi 1 target 1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / neighbor evpn evi 1 target 1 source 1

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / nv satellite (config-l2vpn-bg-bd-nv)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / nv satellite / offload ipv4 multicast enable

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core (config-l2vpn-bg-bd-pbb-core)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / evi 1 (config-l2vpn-bg-bd-pbb-core-evi)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac (config-l2vpn-bg-bd-pbb-core-mac)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / aging (config-l2vpn-bg-bd-pbb-core-mac-aging)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / aging / time 300
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / aging / type absolute
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / aging / type inactivity
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / learning
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mac / learning disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / mmrp-flood-optimization
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb core / rewrite ingress tag push dot1ad 1 symmetric

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 (config-l2vpn-bg-bd-pbb-edge)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / dhcp ipv4 none
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / dhcp ipv4 snoop profile someword4
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / igmp snooping profile someword4
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac (config-l2vpn-bg-bd-pbb-edge-mac)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / aging (config-l2vpn-bg-bd-pbb-edge-mac-aging)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / aging / time 300
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / aging / type absolute
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / aging / type inactivity
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / learning
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / learning disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit (config-l2vpn-bg-bd-pbb-edge-mac-limit)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / action flood
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / action no-flood
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / action none
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / action shutdown
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / maximum 1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / notification both
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / notification none
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / notification syslog
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / limit / notification trap
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure (config-l2vpn-bg-bd-pbb-edge-mac-sec)
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / accept-shutdown
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / action none
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / action restrict
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / action shutdown
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / logging
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / mac / secure / logging disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / split-horizon group vfi disable
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / static-mac-address aaaa.bbbb.cccc bmac aaaa.bbbb.cccc
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / pbb edge i-sid 256 core-bridge someword3 / unknown-unicast-bmac aaaa.bbbb.cccc

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / shutdown
                    if attributes.value('shutdown'):
                        configurations.append_line('shutdown')

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control broadcast kbps 64
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control broadcast pps 1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control multicast kbps 64
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control multicast pps 1
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control unknown-unicast kbps 64
                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / storm-control unknown-unicast pps 1

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / transport-mode vlan passthrough

                    # iosxr: l2vpn / bridge group someword / bridge-domain someword2 / vfi someword3 (config-l2vpn-bg-bd-vfi)
                    for vfi, attributes2 in attributes.sequence_values('vfis'):
                        configurations.append_block(
                            str(
                                vfi.build_config(apply=False,
                                                 attributes=attributes2,
                                                 unconfig=unconfig)))

            submode_stack.close()
            if apply:
                if configurations:
                    self.device.configure(str(configurations),
                                          fail_invalid=True)
            else:
                return CliConfig(device=self.device,
                                 unconfig=unconfig,
                                 cli_config=configurations,
                                 fail_invalid=True)