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)
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)
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)
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)
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) if attributes.value('if_proxy_enable') or \ attributes.value('if_local_proxy_enable') or\ attributes.value('if_expire_time'): with configurations.submode_context( attributes.format('interface {interface}', force=True)): if attributes.value('if_proxy_enable'): configurations.append_line( attributes.format('ip proxy-arp')) if attributes.value('if_local_proxy_enable'): configurations.append_line( attributes.format('ip local-proxy-arp')) if attributes.value('if_expire_time'): configurations.append_line( attributes.format( 'arp timeout {if_expire_time}')) for sub, attributes2 in attributes.mapping_values( 'static_arp_attr', sort=True, keys=self.static_arp_attr): configurations.append_block( sub.build_config(apply=False, attributes=attributes2, unconfig=unconfig)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): assert not kwargs, kwargs assert not apply attributes = AttributesHelper(self, attributes) configurations = CliConfigBuilder(unconfig=unconfig) # =================================== # ipv4 # prefix_length # ipv4_secondary # secondary_vrf # =================================== if attributes.value('ipv4') and attributes.value('prefix_length'): # convert prefix_length to netmask ret = IPv4Network('1.1.1.1/{}'.format( attributes.value('prefix_length')), strict=False) mask = ret.with_netmask.split('/')[1] if attributes.value('ipv4_secondary'): configurations.append_line('ip address' ' {ipv4} {prefix_length} secondary' .format(ipv4=attributes.value('ipv4'), prefix_length=mask)) if attributes.value('secondary_vrf'): configurations.append_line('ip address' ' {ipv4} {prefix_length} secondary' ' vrf {secondary_vrf}' .format(ipv4=attributes.value('ipv4'), prefix_length=mask, secondary_vrf=attributes.value('secondary_vrf'))) else: configurations.append_line('ip address' ' {ipv4} {prefix_length}' .format(ipv4=attributes.value('ipv4'), prefix_length=mask)) return str(configurations)
def build_config(self, apply=True, attributes=None, unconfig=False, **kwargs): '''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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)