rewrite
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
Name,Role,Adapter,Interface,Master Interface,Network,VLAN,Network IP,Mask,Device IP,Default Gateway
|
Name,Role,Adapter,Interface,Master Interface,Network,VLAN,Network IP,Mask,Device IP,Default Gateway
|
||||||
PC1,Host,Adapter1,eth1,vlan7,A,,,,,,
|
PC1,Host,Adapter1,eth1,vlan7,A,,,,,
|
||||||
PC1,Host,,vlan7,,7,10.10.10.0,/24,10.10.10.7,0.0.0.0,
|
PC1,Host,,vlan7,,7,10.10.10.0,/24,10.10.10.7,0.0.0.0,
|
||||||
PC2,Host,Adapter1,eth1,vlan9,B,,,,,,
|
PC2,Host,Adapter1,eth1,vlan9,B,,,,,
|
||||||
PC2,Host,,vlan9,,9,10.10.10.0,/24,10.10.10.9,0.0.0.0,
|
PC2,Host,,vlan9,,9,10.10.10.0,/24,10.10.10.9,0.0.0.0,
|
||||||
com,Switch,Adapter1,eth2,vlan7,A,7,,,,,
|
com,Switch,Adapter1,eth2,vlan7,A,7,,,,
|
||||||
com,Switch,Adapter2,eth3,vlan9,B,9,,,,,
|
com,Switch,Adapter2,eth3,vlan9,B,9,,,,
|
||||||
com,Switch,,vlan7,bridge,,,,,,
|
com,Switch,,vlan7,bridge,,,,,,
|
||||||
com,Switch,,vlan9,bridge,,,,,,
|
com,Switch,,vlan9,bridge,,,,,,
|
||||||
com,Switch,,bridge,,,,,,,
|
com,Switch,,bridge,,,,,,,
|
||||||
|
+2
-2
@@ -21,9 +21,9 @@ def run(argv: list[str] | None = None) -> None:
|
|||||||
raw_devices = parse_csv(Path(args.input))
|
raw_devices = parse_csv(Path(args.input))
|
||||||
topology = convert_raw_topology(raw_devices)
|
topology = convert_raw_topology(raw_devices)
|
||||||
|
|
||||||
generate_diagram(topology, Path(args.output) / "diagram.png")
|
# generate_diagram(topology, Path(args.output) / "diagram.png")
|
||||||
make_yaml(topology, Path(args.output) / "topology.yaml")
|
make_yaml(topology, Path(args.output) / "topology.yaml")
|
||||||
# generate_d2_diagram(topology, Path(args.output) / "diagram.d2")
|
generate_d2_diagram(topology, Path(args.output) / "diagram.d2")
|
||||||
|
|
||||||
logging.info("All tasks completed successfully.")
|
logging.info("All tasks completed successfully.")
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ class Interface:
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
name: str,
|
name: str,
|
||||||
|
adapter: Optional[str] = None,
|
||||||
|
master_interface: Optional[str] = None,
|
||||||
ip_address: Optional[str] = None,
|
ip_address: Optional[str] = None,
|
||||||
network: Optional[str] = None,
|
network: Optional[str] = None,
|
||||||
default_gateway: Optional[str] = None,
|
default_gateway: Optional[str] = None,
|
||||||
@@ -28,11 +30,17 @@ class Interface:
|
|||||||
raise ValueError("Interface 'network' must be a string or None")
|
raise ValueError("Interface 'network' must be a string or None")
|
||||||
if default_gateway is not None and not isinstance(default_gateway, str):
|
if default_gateway is not None and not isinstance(default_gateway, str):
|
||||||
raise ValueError("Interface 'default_gateway' must be a string or None")
|
raise ValueError("Interface 'default_gateway' must be a string or None")
|
||||||
|
if adapter is not None and not isinstance(adapter, str):
|
||||||
|
raise ValueError("Interface 'adapter' must be a string or None")
|
||||||
|
if master_interface is not None and not isinstance(master_interface, str):
|
||||||
|
raise ValueError("Interface 'master_interface' must be a string or None")
|
||||||
|
|
||||||
self.name = name
|
self.name = name
|
||||||
self.ip_address = ip_address
|
self.ip_address = ip_address
|
||||||
self.network = network
|
self.network = network
|
||||||
self.default_gateway = default_gateway
|
self.default_gateway = default_gateway
|
||||||
|
self.adapter = adapter
|
||||||
|
self.master_interface = master_interface
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"Interface(name={self.name}, ip_address={self.ip_address}, network={self.network}, default_gateway={self.default_gateway})"
|
return f"Interface(name={self.name}, ip_address={self.ip_address}, network={self.network}, default_gateway={self.default_gateway})"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from ..domain.models import VirtualInterface
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from py_d2 import D2Diagram, D2Shape, D2Connection
|
from py_d2 import D2Diagram, D2Shape, D2Connection
|
||||||
from py_d2.shape import Shape
|
from py_d2.shape import Shape
|
||||||
|
from py_d2.connection import Direction
|
||||||
|
|
||||||
# https://d2lang.com/tour/themes/
|
# https://d2lang.com/tour/themes/
|
||||||
THEME_NUMBER = 200
|
THEME_NUMBER = 200
|
||||||
@@ -71,6 +72,7 @@ def generate_d2_diagram(topology: Topology, output_path: Path) -> None:
|
|||||||
connection = D2Connection(
|
connection = D2Connection(
|
||||||
shape_1=f"{device.name}.{interface.adapter}",
|
shape_1=f"{device.name}.{interface.adapter}",
|
||||||
shape_2=interface.network,
|
shape_2=interface.network,
|
||||||
|
direction=Direction("--"),
|
||||||
)
|
)
|
||||||
connections.append(connection)
|
connections.append(connection)
|
||||||
|
|
||||||
@@ -102,7 +104,7 @@ def _generate_picture(diagram: Path, output_path: Path) -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
res = subprocess.run(
|
res = subprocess.run(
|
||||||
["d2", f"--theme={THEME_NUMBER}", str(diagram), str(output_path)],
|
["d2", f"--theme={THEME_NUMBER}", str(diagram)],
|
||||||
check=True,
|
check=True,
|
||||||
capture_output=True,
|
capture_output=True,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class RawDevices:
|
|||||||
if not isinstance(fields, dict):
|
if not isinstance(fields, dict):
|
||||||
raise ValueError("RawDevices 'fields' must be a dictionary")
|
raise ValueError("RawDevices 'fields' must be a dictionary")
|
||||||
if any(not isinstance(k, str) for k in fields.keys()):
|
if any(not isinstance(k, str) for k in fields.keys()):
|
||||||
|
print(fields.keys())
|
||||||
raise ValueError("RawDevices 'fields' keys must be strings")
|
raise ValueError("RawDevices 'fields' keys must be strings")
|
||||||
|
|
||||||
self.id = id
|
self.id = id
|
||||||
|
|||||||
Reference in New Issue
Block a user