1
0
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:
checktheroads
2019-10-09 03:10:52 -07:00
parent 7a77ff6e50
commit 962fd21bf9
45 changed files with 1325 additions and 979 deletions

View File

@@ -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()