Source code for smc.routing.bgp_access_list
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import collections
from smc.base.model import Element
from smc.routing.access_list import AccessList
ASPathListEntry = collections.namedtuple("ASPathListEntry", "expression action comment")
"""
The ASPathAccessList is an iterable container and will return
instances of :class:`~ASPathListEntry`.
:ivar str expression: string expression identifying the AS path
:ivar str action: 'permit' or 'deny'
:ivar str comment: optional comment
"""
ASPathListEntry.__new__.__defaults__ = (None,) * len(ASPathListEntry._fields)
[docs]
class ASPathAccessList(AccessList, Element):
"""
An AS path is the autonomous systems that routing information passed
through to get to a specified router. It indicates the origin of this
route. The AS path is used to prevent routing loops in BGP.
ASPathAccessLists can be used as a MatchCondition in a RouteMap::
>>> aspath = ASPathAccessList.create(name='aspath', entries=[
... {'expression': '123-456', 'action': 'permit'},
... {'expression': '1234-567', 'action': 'deny'}])
>>> aspath
ASPathAccessList(name=aspath)
>>> aspath.add_entry(expression='897', action='permit')
>>> aspath.update()
'https://172.18.1.151:8082/6.4/elements/as_path_access_list/28'
...
>>> aspath.remove_entry(expression='123-456')
>>> aspath.update()
'https://172.18.1.151:8082/6.4/elements/as_path_access_list/28'
>>> for entry in aspath:
... entry
...
ASPathListEntry(expression=u'1234-567', action=u'deny', comment=None)
ASPathListEntry(expression=u'897', action=u'permit', comment=None)
This is an iterable container yielding :class:`ASPathListEntry`.
.. seealso:: :class:`~ASPathListEntry` for valid `create` and add/remove parameters
"""
typeof = "as_path_access_list"
_view = ASPathListEntry
CommunityListEntry = collections.namedtuple("CommunityListEntry", "community action comment")
"""
The CommunityAccessList represents the entries for the community
access lists.
:ivar str community: community id
:ivar str action: 'permit' or 'deny'
:ivar str comment: optional comment
"""
CommunityListEntry.__new__.__defaults__ = (None,) * len(CommunityListEntry._fields)
[docs]
class CommunityAccessList(AccessList, Element):
"""
A CommunityAccessList is used to provide specific rules for BGP
configurations providing and permit/deny capability based on
the community defined.
CommunityAccessLists can be used in a RouteMap match condition
to refine the policy for a specific announced network.
When creating a new community ACL, `entries` is expecting a list
of dict items using the valid field and values of this class.
For example::
>>> from smc.routing.community_list import CommunityAccessList
>>> comm = CommunityAccessList.create(name='commacl',
entries=[{'community': 123, 'action': 'permit'},
{'community': 456, 'action': 'deny'}],
type='standard')
>>> comm
CommunityAccessList(name=commacl)
You can optionally also create an empty access list and use :meth:`add_entry`
to insert entries after::
>>> comm.add_entry(community=789, action='permit')
>>> comm.update()
Iterating the access list will return :class:`~CommunityListEntry`::
>>> for entries in comm:
... entries
...
CommunityListEntry(community=u'789', action=u'permit', comment=None)
CommunityListEntry(community=u'456', action=u'deny', comment=None)
CommunityListEntry(community=u'123', action=u'permit', comment=None)
The `type` parameter for the `create` constructor can have values `standard` or
`expanded`. If using `expanded`, the access list can then use a regex for matching
the community string.
This is an iterable container yielding :class:`CommunityListEntry`.
.. seealso:: :class:`~CommunityListEntry` for valid `create` and add/remove parameters
:ivar str type: 'standard' or 'expanded' (specify as kw when in `create` constructor when
creating the top level access list.
"""
typeof = "community_access_list"
_view = CommunityListEntry
ExtCommunityListEntry = collections.namedtuple("ExtCommunityListEntry", "community action type")
"""
The ExtCommunityListEntry represents the entries for the extended community
access lists.
:ivar str community: community id
:ivar str action: 'permit' or 'deny'
:ivar str type: 'rt' (Route Target) or 'soo' (Site of Origin) (required)
"""
ExtCommunityListEntry.__new__.__defaults__ = (None,) * len(ExtCommunityListEntry._fields)
[docs]
class ExtendedCommunityAccessList(AccessList, Element):
"""
Extended community access lists with the ability to specify
route target or start of origin for an entry.
ExtendedCommunityAccessLists can be used in a RouteMap match
condition to refine the policy for a specific announced network::
>>> comm = ExtendedCommunityAccessList.create(name='comm', entries=[
... {'community': 123, 'action': 'permit', 'type': 'rt'},
... {'community': 456, 'action': 'deny', 'type': 'soo'}],
... type='standard')
>>> comm
ExtendedCommunityAccessList(name=comm)
>>> comm.add_entry(community=789, action='permit', type='rt')
>>> comm.update()
...
>>> comm.remove_entry(community=123)
>>> comm.update()
'https://172.18.1.151:8082/6.4/elements/extended_community_access_list/25'
>>> for entry in comm:
... entry
...
ExtCommunityListEntry(community=u'456', action=u'deny', comment=None, type=u'soo')
ExtCommunityListEntry(community=u'789', action=u'permit', comment=None, type=u'rt')
This is an iterable container yielding :class:`ExtCommunityListEntry`.
.. seealso:: :class:`~ExtCommunityListEntry` for valid `create` and add/remove parameters
:ivar str type: 'standard' or 'expanded' (specify as kw when in `create` constructor when
creating the top level access list.
"""
typeof = "extended_community_access_list"
_view = ExtCommunityListEntry