Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ dependencies = [
"prtpy",
"pydot",
"dataclasses-json",
"sdx-datamodel @ git+https://github.com/atlanticwave-sdx/datamodel@3.0.0.dev6",
"sdx-datamodel @ git+https://github.com/atlanticwave-sdx/datamodel@148.pydantic-connection-requests",
]

[project.urls]
Expand Down
4 changes: 2 additions & 2 deletions src/sdx_pce/heuristic/heur.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import prtpy

from sdx_pce.load_balancing.te_solver import TESolver
from sdx_pce.models import ConnectionRequest, TrafficMatrix
from sdx_pce.models import PceConnectionRequest, TrafficMatrix
from sdx_pce.utils.random_connection_generator import RandomConnectionGenerator
from sdx_pce.utils.random_topology_generator import RandomTopologyGenerator

Expand Down Expand Up @@ -41,7 +41,7 @@ def matrix_to_connection(matrix):
"""
traffic_matrix = TrafficMatrix(connection_requests=[])
for rq in matrix:
request = ConnectionRequest(
request = PceConnectionRequest(
source=rq[0],
destination=rq[1],
required_bandwidth=rq[2],
Expand Down
6 changes: 3 additions & 3 deletions src/sdx_pce/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

@dataclass_json
@dataclass(frozen=True)
class ConnectionRequest:
class PceConnectionRequest:
"""
A connection request.

Expand Down Expand Up @@ -34,7 +34,7 @@ class TrafficMatrix:
Traffic matrix is input to TE Solver.
"""

connection_requests: List[ConnectionRequest]
connection_requests: List[PceConnectionRequest]
request_id: str


Expand All @@ -58,7 +58,7 @@ class ConnectionSolution:
TE Solver's result is represented as a ConnectionSolution.
"""

connection_map: Mapping[ConnectionRequest, List[ConnectionPath]]
connection_map: Mapping[PceConnectionRequest, List[ConnectionPath]]
cost: float
request_id: str

Expand Down
58 changes: 17 additions & 41 deletions src/sdx_pce/topology/temanager.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,21 @@
import logging
import re
import threading
import traceback

# import traceback
from itertools import chain
from typing import List, Optional

import networkx as nx
from networkx.algorithms import approximation as approx
from sdx_datamodel.models.connection_request import ConnectionRequest
from sdx_datamodel.models.port import Port
from sdx_datamodel.parsing.connectionhandler import ConnectionHandler
from sdx_datamodel.parsing.exceptions import (
MissingAttributeException,
ServiceNotSupportedException,
)
from sdx_datamodel.validation.connectionvalidator import ConnectionValidator

from sdx_pce.models import (
ConnectionPath,
ConnectionRequest,
ConnectionSolution,
PceConnectionRequest,
TrafficMatrix,
VlanTag,
VlanTaggedBreakdown,
Expand All @@ -35,6 +32,13 @@
ValidationError,
)

# from sdx_datamodel.parsing.exceptions import (
# MissingAttributeException,
# ServiceNotSupportedException,
# )
# from sdx_datamodel.validation.connectionvalidator import ConnectionValidator


UNUSED_VLAN = None


Expand Down Expand Up @@ -157,7 +161,7 @@ def get_failed_links(self) -> List[dict]:
"""Get failed links on the topology (ie., Links not up and enabled)."""
return self.topology_manager.get_failed_links()

def get_connections(self) -> List[ConnectionRequest]:
def get_connections(self) -> List[PceConnectionRequest]:
"""Get all the connections in the _connectionSolution_list."""
connections = []
for solution in self._connectionSolution_list:
Expand Down Expand Up @@ -369,39 +373,11 @@ def generate_traffic_matrix(self, connection_request: dict) -> TrafficMatrix:
)

try:
request = ConnectionHandler().import_connection_data(connection_request)
except MissingAttributeException as e:
self._logger.error(f"Missing attribute: {e} for {connection_request}")
raise RequestValidationError(
f"Validation error: {e} for {connection_request}", 400
)
except ServiceNotSupportedException as e:
self._logger.error(f"Service not supported: {e} for {connection_request}")
raise RequestValidationError(
f"Validation error: {e} for {connection_request}", 402
)

try:
ConnectionValidator(request).is_valid()
except ValueError as request_err:
err = traceback.format_exc().replace("\n", ", ")
self._logger.error(
f"Validation error: {request_err} for {connection_request}: {request_err} - {err}"
)
raise RequestValidationError(
f"Validation error: {request_err} for {connection_request}", 400
)
except ServiceNotSupportedException as e:
self._logger.error(f"Service not supported: {e} for {connection_request}")
raise RequestValidationError(
f"Validation error: {e} for {connection_request}", 402
)
request = ConnectionRequest.model_validate(connection_request)
except Exception as e:
err = traceback.format_exc().replace("\n", ", ")
self._logger.error(f"Error when validating connection request: {e} - {err}")
raise RequestValidationError(
f"Validation error: {e} for {connection_request}", 400
)
message = f"Validation error: for {connection_request}: {e}"
self._logger.error(message)
raise RequestValidationError(message, 400)

self._logger.info(f"generate_traffic_matrix: decoded request: {request}")

Expand Down Expand Up @@ -486,7 +462,7 @@ def generate_traffic_matrix(self, connection_request: dict) -> TrafficMatrix:
f"required_bandwidth: {required_bandwidth}"
)

request = ConnectionRequest(
request = PceConnectionRequest(
source=ingress_nodes[0],
destination=egress_nodes[0],
required_bandwidth=required_bandwidth,
Expand Down
6 changes: 3 additions & 3 deletions src/sdx_pce/utils/random_connection_generator.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import numpy as np

from sdx_pce.models import ConnectionRequest, TrafficMatrix
from sdx_pce.models import PceConnectionRequest, TrafficMatrix


class RandomConnectionGenerator:
Expand Down Expand Up @@ -34,7 +34,7 @@ def generate(self, querynum, l_bw, u_bw, l_lat, u_lat, seed=2022) -> TrafficMatr
required_bandwidth = bw[i]
required_latency = np.random.randint(l_lat, u_lat)

request = ConnectionRequest(
request = PceConnectionRequest(
source=source,
destination=destination,
required_bandwidth=required_bandwidth,
Expand All @@ -52,7 +52,7 @@ def generate(self, querynum, l_bw, u_bw, l_lat, u_lat, seed=2022) -> TrafficMatr
required_bandwidth = bw[i]
required_latency = np.random.randint(l_lat, u_lat)

request = ConnectionRequest(
request = PceConnectionRequest(
source=source,
destination=destination,
required_bandwidth=required_bandwidth,
Expand Down
20 changes: 10 additions & 10 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ class TestData:
TOPOLOGY_FILE_AMLIGHT_USER_PORT = TOPOLOGY_DIR / "amlight_user_port.json"

REQUESTS_DIR = files("sdx_datamodel") / "data" / "requests"
CONNECTION_REQ = REQUESTS_DIR / "test_request.json"
CONNECTION_REQ_AMLIGHT_ZAOXI_USER_PORT_v2 = (
REQUESTS_DIR / "test_request-amlight_zaoxi-p2p-v2.json"
CONNECTION_REQ_v0 = REQUESTS_DIR / "v0" / "test_request.json"
CONNECTION_REQ_AMLIGHT_ZAOXI_USER_PORT_v1 = (
REQUESTS_DIR / "v1.0" / "test-request-amlight-zaoxi-p2p.json"
)
CONNECTION_REQ_AMLIGHT_SAX_v2 = (
REQUESTS_DIR / "test-request-amlight_sax-p2p-v2.json"
CONNECTION_REQ_AMLIGHT_SAX_v1 = (
REQUESTS_DIR / "v1.0" / "test-request-amlight_sax-p2p-v2.json"
)

# Write test output files in OS temporary directory.
Expand All @@ -33,14 +33,14 @@ class TestData:
# Other test data files.
TEST_DATA_DIR = pathlib.Path(__file__).parent / "data"

CONNECTION_REQ_AMLIGHT = TEST_DATA_DIR / "test_request_amlight.json"
CONNECTION_REQ_AMLIGHT_USER_PORT = (
CONNECTION_REQ_AMLIGHT_v0 = TEST_DATA_DIR / "test_request_amlight.json"
CONNECTION_REQ_AMLIGHT_USER_PORT_v0 = (
TEST_DATA_DIR / "test_request_amlight_user_port.json"
)
CONNECTION_REQ_AMLIGHT_ZAOXI_USER_PORT = (
CONNECTION_REQ_AMLIGHT_ZAOXI_USER_PORT_v0 = (
TEST_DATA_DIR / "test_request_amlight_zaoxi_user_port.json"
)

TOPOLOGY_FILE_SAX_2 = TEST_DATA_DIR / "sax-2.json"
CONNECTION_REQ_FILE_SAX_2_INVALID = TEST_DATA_DIR / "sax-2-request-invalid.json"
CONNECTION_REQ_FILE_SAX_2_VALID = TEST_DATA_DIR / "sax-2-request-valid.json"
CONNECTION_REQ_FILE_SAX_2_INVALID_v0 = TEST_DATA_DIR / "sax-2-request-invalid.json"
CONNECTION_REQ_FILE_SAX_2_VALID_v0 = TEST_DATA_DIR / "sax-2-request-valid.json"
Loading