mirror of
https://github.com/checktheroads/hyperglass
synced 2024-05-11 05:55:08 +00:00
model restructure, front-end improvements
This commit is contained in:
@@ -6,72 +6,110 @@ Imports config variables and overrides default class attributes.
|
||||
Validates input for overridden parameters.
|
||||
"""
|
||||
# Standard Library Imports
|
||||
from typing import List
|
||||
from typing import Dict
|
||||
from ipaddress import IPv4Address
|
||||
from ipaddress import IPv4Network
|
||||
from ipaddress import IPv6Address
|
||||
from ipaddress import IPv6Network
|
||||
from typing import Dict
|
||||
from typing import List
|
||||
from typing import Union
|
||||
|
||||
# Third Party Imports
|
||||
from pydantic import constr
|
||||
from pydantic import IPvAnyNetwork
|
||||
from pydantic import constr
|
||||
from pydantic import validator
|
||||
|
||||
# Project Imports
|
||||
from hyperglass.configuration.models._utils import clean_name
|
||||
from hyperglass.configuration.models._utils import HyperglassModel
|
||||
from hyperglass.exceptions import ConfigError
|
||||
|
||||
from logzero import logger as log
|
||||
|
||||
class DeviceVrf4(HyperglassModel):
|
||||
"""Model for AFI definitions"""
|
||||
|
||||
afi_name: str = "ipv4"
|
||||
vrf_name: str
|
||||
source_address: IPv4Address
|
||||
|
||||
@validator("source_address")
|
||||
def check_ip_type(cls, value, values):
|
||||
if value is not None and isinstance(value, IPv4Address):
|
||||
if value.is_loopback:
|
||||
raise ConfigError(
|
||||
(
|
||||
"The default routing table with source IPs must be defined. "
|
||||
"VRF: {vrf}, Source Address: {value}"
|
||||
),
|
||||
vrf=values["vrf_name"],
|
||||
value=value,
|
||||
)
|
||||
return value
|
||||
|
||||
|
||||
class DeviceVrf6(HyperglassModel):
|
||||
"""Model for AFI definitions"""
|
||||
|
||||
afi_name: str = "ipv6"
|
||||
vrf_name: str
|
||||
source_address: IPv6Address
|
||||
|
||||
@validator("source_address")
|
||||
def check_ip_type(cls, value, values):
|
||||
if value is not None and isinstance(value, IPv4Address):
|
||||
if value.is_loopback:
|
||||
raise ConfigError(
|
||||
(
|
||||
"The default routing table with source IPs must be defined. "
|
||||
"VRF: {vrf}, Source Address: {value}"
|
||||
),
|
||||
vrf=values["vrf_name"],
|
||||
value=value,
|
||||
)
|
||||
return value
|
||||
|
||||
|
||||
class Vrf(HyperglassModel):
|
||||
"""Model for per VRF/afi config in devices.yaml"""
|
||||
|
||||
name: str
|
||||
display_name: str
|
||||
ipv4: bool = True
|
||||
ipv6: bool = True
|
||||
ipv4: Union[DeviceVrf4, None]
|
||||
ipv6: Union[DeviceVrf6, None]
|
||||
access_list: List[Dict[constr(regex=("allow|deny")), IPvAnyNetwork]] = [
|
||||
{"allow": "0.0.0.0/0"},
|
||||
{"allow": "::/0"},
|
||||
{"allow": IPv4Network("0.0.0.0/0")},
|
||||
{"allow": IPv6Network("::/0")},
|
||||
]
|
||||
|
||||
@validator("ipv4", "ipv6", pre=True, whole=True)
|
||||
def set_default_vrf_name(cls, value, values):
|
||||
if value is not None and value.get("vrf_name") is None:
|
||||
value["vrf_name"] = values["name"]
|
||||
return value
|
||||
|
||||
@validator("access_list", pre=True, whole=True, always=True)
|
||||
def validate_action(cls, value):
|
||||
for li in value:
|
||||
for action, network in li.items():
|
||||
if isinstance(network, (IPv4Network, IPv6Network)):
|
||||
li[action] = str(network)
|
||||
log.info(value)
|
||||
return value
|
||||
|
||||
|
||||
class Vrfs(HyperglassModel):
|
||||
"""Base model for vrfs class"""
|
||||
class DefaultVrf(HyperglassModel):
|
||||
|
||||
@classmethod
|
||||
def import_params(cls, input_params):
|
||||
"""
|
||||
Imports passed dict from YAML config, removes unsupported
|
||||
characters from VRF names, dynamically sets attributes for
|
||||
the Vrfs class.
|
||||
"""
|
||||
name: str = "default"
|
||||
display_name: str = "Global"
|
||||
access_list = [{"allow": IPv4Network("0.0.0.0/0")}, {"allow": IPv6Network("::/0")}]
|
||||
|
||||
# Default settings which include the default/global routing table
|
||||
vrfs: Vrf = {"default": {"display_name": "Global", "ipv4": True, "ipv6": True}}
|
||||
display_names: List[str] = ["Global"]
|
||||
_all: List[str] = ["global"]
|
||||
class DefaultVrf4(HyperglassModel):
|
||||
afi_name: str = "ipv4"
|
||||
vrf_name: str = "default"
|
||||
source_address: IPv4Address = IPv4Address("127.0.0.1")
|
||||
|
||||
for (vrf_key, params) in input_params.items():
|
||||
vrf = clean_name(vrf_key)
|
||||
vrf_params = Vrf(**params)
|
||||
vrfs.update({vrf: vrf_params.dict()})
|
||||
display_names.append(params.get("display_name"))
|
||||
_all.append(vrf_key)
|
||||
for (vrf_key, params) in vrfs.items():
|
||||
setattr(Vrfs, vrf_key, Vrf(**params))
|
||||
class DefaultVrf6(HyperglassModel):
|
||||
afi_name: str = "ipv4"
|
||||
vrf_name: str = "default"
|
||||
source_address: IPv6Address = IPv6Address("::1")
|
||||
|
||||
display_names: List[str] = list(set(display_names))
|
||||
_all: List[str] = list(set(_all))
|
||||
Vrfs.vrfs = vrfs
|
||||
Vrfs.display_names = display_names
|
||||
Vrfs._all = _all
|
||||
return Vrfs()
|
||||
ipv4: DefaultVrf4 = DefaultVrf4()
|
||||
ipv6: DefaultVrf6 = DefaultVrf6()
|
||||
|
||||
Reference in New Issue
Block a user