2019-12-29 23:57:39 -07:00
|
|
|
"""Validate VRF configuration variables."""
|
2019-09-11 01:35:31 -07:00
|
|
|
|
|
|
|
# Standard Library Imports
|
2019-10-09 03:10:52 -07:00
|
|
|
from ipaddress import IPv4Address
|
2019-10-04 16:54:32 -07:00
|
|
|
from ipaddress import IPv4Network
|
2019-10-09 03:10:52 -07:00
|
|
|
from ipaddress import IPv6Address
|
2019-10-04 16:54:32 -07:00
|
|
|
from ipaddress import IPv6Network
|
2019-10-09 03:10:52 -07:00
|
|
|
from typing import Dict
|
|
|
|
from typing import List
|
2019-12-30 01:44:19 -07:00
|
|
|
from typing import Optional
|
2019-09-11 01:35:31 -07:00
|
|
|
|
|
|
|
# Third Party Imports
|
2020-01-16 02:52:00 -07:00
|
|
|
from pydantic import FilePath
|
2019-09-30 07:51:17 -07:00
|
|
|
from pydantic import IPvAnyNetwork
|
2020-01-17 02:50:57 -07:00
|
|
|
from pydantic import StrictBool
|
2019-12-31 18:29:43 -07:00
|
|
|
from pydantic import StrictStr
|
2019-10-09 03:10:52 -07:00
|
|
|
from pydantic import constr
|
2019-09-30 07:51:17 -07:00
|
|
|
from pydantic import validator
|
2019-09-11 01:35:31 -07:00
|
|
|
|
|
|
|
# Project Imports
|
2019-10-04 16:54:32 -07:00
|
|
|
from hyperglass.configuration.models._utils import HyperglassModel
|
2020-01-17 02:50:57 -07:00
|
|
|
from hyperglass.configuration.models._utils import HyperglassModelExtra
|
|
|
|
|
|
|
|
|
|
|
|
class InfoConfigParams(HyperglassModelExtra):
|
|
|
|
"""Validation model for per-help params."""
|
|
|
|
|
|
|
|
title: Optional[StrictStr]
|
|
|
|
|
|
|
|
|
|
|
|
class InfoConfig(HyperglassModel):
|
|
|
|
"""Validation model for help configuration."""
|
|
|
|
|
|
|
|
enable: StrictBool = True
|
|
|
|
file: Optional[FilePath]
|
|
|
|
params: InfoConfigParams = InfoConfigParams()
|
2019-10-09 03:10:52 -07:00
|
|
|
|
|
|
|
|
2020-01-16 02:52:00 -07:00
|
|
|
class Info(HyperglassModel):
|
2020-01-17 02:50:57 -07:00
|
|
|
"""Validation model for per-VRF, per-Command help."""
|
2020-01-16 02:52:00 -07:00
|
|
|
|
2020-01-17 02:50:57 -07:00
|
|
|
bgp_aspath: InfoConfig = InfoConfig()
|
|
|
|
bgp_community: InfoConfig = InfoConfig()
|
|
|
|
bgp_route: InfoConfig = InfoConfig()
|
|
|
|
ping: InfoConfig = InfoConfig()
|
|
|
|
traceroute: InfoConfig = InfoConfig()
|
2020-01-16 02:52:00 -07:00
|
|
|
|
|
|
|
|
2019-10-09 03:10:52 -07:00
|
|
|
class DeviceVrf4(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for IPv4 AFI definitions."""
|
2019-10-09 03:10:52 -07:00
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
vrf_name: StrictStr
|
2019-10-09 03:10:52 -07:00
|
|
|
source_address: IPv4Address
|
|
|
|
|
|
|
|
|
|
|
|
class DeviceVrf6(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for IPv6 AFI definitions."""
|
2019-10-09 03:10:52 -07:00
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
vrf_name: StrictStr
|
2019-10-09 03:10:52 -07:00
|
|
|
source_address: IPv6Address
|
|
|
|
|
2019-10-04 16:54:32 -07:00
|
|
|
|
|
|
|
class Vrf(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for per VRF/afi config in devices.yaml."""
|
2019-09-11 01:35:31 -07:00
|
|
|
|
2020-01-16 02:52:00 -07:00
|
|
|
name: StrictStr
|
|
|
|
display_name: StrictStr
|
|
|
|
info: Info = Info()
|
2019-12-30 01:44:19 -07:00
|
|
|
ipv4: Optional[DeviceVrf4]
|
|
|
|
ipv6: Optional[DeviceVrf6]
|
2019-10-04 16:54:32 -07:00
|
|
|
access_list: List[Dict[constr(regex=("allow|deny")), IPvAnyNetwork]] = [
|
2019-10-09 03:10:52 -07:00
|
|
|
{"allow": IPv4Network("0.0.0.0/0")},
|
|
|
|
{"allow": IPv6Network("::/0")},
|
2019-09-30 07:51:17 -07:00
|
|
|
]
|
|
|
|
|
2019-12-30 01:44:19 -07:00
|
|
|
@validator("ipv4", "ipv6", pre=True, always=True)
|
2019-10-09 03:10:52 -07:00
|
|
|
def set_default_vrf_name(cls, value, values):
|
2019-12-31 18:29:43 -07:00
|
|
|
"""If per-AFI name is undefined, set it to the global VRF name.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
{str} -- VRF Name
|
|
|
|
"""
|
2019-12-30 01:44:19 -07:00
|
|
|
if isinstance(value, DefaultVrf) and value.vrf_name is None:
|
|
|
|
value["vrf_name"] = values["name"]
|
|
|
|
elif isinstance(value, Dict) and value.get("vrf_name") is None:
|
2019-10-09 03:10:52 -07:00
|
|
|
value["vrf_name"] = values["name"]
|
|
|
|
return value
|
|
|
|
|
2019-12-30 01:44:19 -07:00
|
|
|
@validator("access_list", pre=True)
|
2019-09-30 07:51:17 -07:00
|
|
|
def validate_action(cls, value):
|
2019-12-31 18:29:43 -07:00
|
|
|
"""Transform ACL networks to IPv4Network/IPv6Network objects.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
{object} -- IPv4Network/IPv6Network object
|
|
|
|
"""
|
2019-09-30 07:51:17 -07:00
|
|
|
for li in value:
|
|
|
|
for action, network in li.items():
|
2019-10-04 16:54:32 -07:00
|
|
|
if isinstance(network, (IPv4Network, IPv6Network)):
|
|
|
|
li[action] = str(network)
|
2019-09-30 07:51:17 -07:00
|
|
|
return value
|
2019-09-11 01:35:31 -07:00
|
|
|
|
2020-01-16 02:52:00 -07:00
|
|
|
def __hash__(self):
|
|
|
|
"""Make VRF object hashable so the object can be deduplicated with set().
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
{int} -- Hash of VRF name
|
|
|
|
"""
|
|
|
|
return hash((self.name,))
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
"""Make VRF object comparable so the object can be deduplicated with set().
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
other {object} -- Object to compare
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
{bool} -- True if comparison attributes are the same value
|
|
|
|
"""
|
|
|
|
return self.name == other.name
|
|
|
|
|
2019-09-11 01:35:31 -07:00
|
|
|
|
2019-10-09 03:10:52 -07:00
|
|
|
class DefaultVrf(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for default routing table VRF."""
|
2019-10-09 03:10:52 -07:00
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
name: StrictStr = "default"
|
|
|
|
display_name: StrictStr = "Global"
|
2020-01-16 02:52:00 -07:00
|
|
|
info: Info = Info()
|
2019-12-30 01:44:19 -07:00
|
|
|
access_list: List[Dict[constr(regex=("allow|deny")), IPvAnyNetwork]] = [
|
|
|
|
{"allow": IPv4Network("0.0.0.0/0")},
|
|
|
|
{"allow": IPv6Network("::/0")},
|
|
|
|
]
|
2019-10-09 03:10:52 -07:00
|
|
|
|
|
|
|
class DefaultVrf4(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for IPv4 default routing table VRF definition."""
|
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
vrf_name: StrictStr = "default"
|
|
|
|
source_address: IPv4Address
|
2019-10-09 03:10:52 -07:00
|
|
|
|
|
|
|
class DefaultVrf6(HyperglassModel):
|
2019-12-29 23:57:39 -07:00
|
|
|
"""Validation model for IPv6 default routing table VRF definition."""
|
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
vrf_name: StrictStr = "default"
|
|
|
|
source_address: IPv6Address
|
2019-10-09 03:10:52 -07:00
|
|
|
|
2019-12-31 18:29:43 -07:00
|
|
|
ipv4: Optional[DefaultVrf4]
|
|
|
|
ipv6: Optional[DefaultVrf6]
|