Loading src/common/tools/rest_conf/server/restconf_server/app.py +2 −8 Original line number Diff line number Diff line Loading @@ -14,7 +14,6 @@ from .callbacks import CallbackOnLinkTelemetry, CallbackOnNodeTelemetry from .Config import INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_TOKEN, INFLUXDB_DATABASE from .influxdb_client import SimapInfluxDBClient from .RestConfServerApplication import RestConfServerApplication import logging Loading @@ -34,13 +33,8 @@ LOGGER.info('All connectors registered') # Initialize InfluxDB client and register telemetry callbacks try: LOGGER.info('Initializing InfluxDB client (host=%s, port=%d, db=%s)...', INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_DATABASE) influx_client = SimapInfluxDBClient( host = INFLUXDB_HOST, port = INFLUXDB_PORT, token = INFLUXDB_TOKEN, database = INFLUXDB_DATABASE ) LOGGER.info('Initializing InfluxDB client with default configuration...') influx_client = SimapInfluxDBClient() except Exception as e: LOGGER.error('Failed to initialize InfluxDB client: %s', e) influx_client = None Loading src/common/tools/rest_conf/server/restconf_server/callbacks/TelemetryCallbacks.py +4 −6 Original line number Diff line number Diff line Loading @@ -101,12 +101,11 @@ class CallbackOnLinkTelemetry(_Callback): """ # Pattern matches: # /restconf/data/ietf-network:networks/network=<network_id>/ietf-network-topology:link=<link_id>/simap-telemetry:simap-telemetry # /restconf/data/ietf-network:networks/network=<network_id>/ietf-network-topology:link=<link_id> PATTERN = ( r'/restconf/data/ietf-network:networks' r'/network=(?P<network_id>[^/]+)' r'/ietf-network-topology:link=(?P<link_id>[^/]+)' r'/simap-telemetry:simap-telemetry' ) def __init__(self, influx_client: SimapInfluxDBClient) -> None: Loading @@ -119,7 +118,7 @@ class CallbackOnLinkTelemetry(_Callback): super().__init__(self.PATTERN) self._influx_client = influx_client def execute( def execute_data_update( self, match: re.Match, path: str, Loading Loading @@ -190,12 +189,11 @@ class CallbackOnNodeTelemetry(_Callback): """ # Pattern matches: # /restconf/data/ietf-network:networks/network=<network_id>/node=<node_id>/simap-telemetry:simap-telemetry # /restconf/data/ietf-network:networks/network=<network_id>/node=<node_id> PATTERN = ( r'/restconf/data/ietf-network:networks' r'/network=(?P<network_id>[^/]+)' r'/node=(?P<node_id>[^/]+)' r'/simap-telemetry:simap-telemetry' ) def __init__(self, influx_client: SimapInfluxDBClient) -> None: Loading @@ -208,7 +206,7 @@ class CallbackOnNodeTelemetry(_Callback): super().__init__(self.PATTERN) self._influx_client = influx_client def execute( def execute_data_update( self, match: re.Match, path: str, Loading src/common/tools/rest_conf/server/restconf_server/influxdb_client.py +42 −17 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ from typing import List, Optional from influxdb_client_3 import InfluxDBClient3, Point, WritePrecision from .Config import INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_DATABASE, INFLUXDB_TOKEN LOGGER = logging.getLogger(__name__) Loading @@ -31,39 +33,62 @@ class SimapInfluxDBClient: Client wrapper for writing SIMAP telemetry data to InfluxDB 3.x. """ def __init__( self, host: str, port: int, token: str, database: str def __init__( self, host: Optional[str] = None, port: Optional[int] = None, token: Optional[str] = None, database: Optional[str] = None ) -> None: """ Initialize the InfluxDB client. Args: host: InfluxDB server hostname port: InfluxDB server port token: Authentication token database: Database/bucket name host: InfluxDB server hostname (default: from INFLUXDB_HOST env or 'localhost') port: InfluxDB server port (default: from INFLUXDB_PORT env or 8181) token: Authentication token (default: from INFLUXDB_TOKEN env) database: Database/bucket name (default: from INFLUXDB_DATABASE env or 'simap_telemetry') """ self._host = host self._port = port self._database = database self._host = host if host is not None else INFLUXDB_HOST self._port = port if port is not None else INFLUXDB_PORT self._database = database if database is not None else INFLUXDB_DATABASE self._token = token if token is not None else INFLUXDB_TOKEN self._client: Optional[InfluxDBClient3] = None try: self._client = InfluxDBClient3( token = token, host = f"http://{host}:{port}", database = database token = self._token, host = f"http://{self._host}:{self._port}", database = self._database ) LOGGER.info("InfluxDB client initialized: host=%s:%d, database=%s", self._host, self._port, self._database) # Test the connection if not self._test_connection(): LOGGER.error("InfluxDB client initialized but connection test failed") self._client = None else: LOGGER.info("InfluxDB connection test successful") except Exception as e: # pylint: disable=broad-except LOGGER.error("Failed to initialize InfluxDB client: %s", str(e)) self._client = None def _test_connection(self) -> bool: """ Test the InfluxDB connection by attempting a simple system query. Returns: True if connection is accessible, False otherwise """ if self._client is None: LOGGER.warning("InfluxDB client not initialized, cannot test connection") return False try: query = "SHOW TABLES" self._client.query(query=query, language="sql") return True except Exception as e: # pylint: disable=broad-except LOGGER.error("InfluxDB connection test failed: %s", str(e)) return False def is_connected(self) -> bool: """Check if client is initialized.""" return self._client is not None Loading src/tests/mwc26-f5ga/AI_analytics_engine/config/Config.py +2 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ SIMAP_SERVER_USERNAME = get_setting('SIMAP_SERVER_USERNAME', default='admin') SIMAP_SERVER_PASSWORD = get_setting('SIMAP_SERVER_PASSWORD', default='admin') # InfluxDB Configuration # INFLUXDB_HOST = get_setting('INFLUXDB_HOST', default='localhost') INFLUXDB_HOST = 'localhost' INFLUXDB_HOST = get_setting('INFLUXDB_HOST', default='localhost') # INFLUXDB_HOST = 'localhost' INFLUXDB_PORT = int(get_setting('INFLUXDB_PORT', default='8181')) INFLUXDB_TOKEN = get_setting('INFLUXDB_TOKEN', default='') INFLUXDB_DATABASE = get_setting('INFLUXDB_DATABASE', default='simap_telemetry') Loading src/tests/mwc26-f5ga/deploy.sh +27 −18 Original line number Diff line number Diff line echo "Starting deployment of MWC26-F5GA test environment..." echo "Building SIMAP Server..." cd ~/tfs-ctrl/ docker buildx build -t simap-server:mock -f ./src/tests/tools/simap_server/Dockerfile . echo "Building NCE-FAN Controller..." cd ~/tfs-ctrl/ docker buildx build -t nce-fan-ctrl:mock -f ./src/tests/tools/mock_nce_fan_ctrl/Dockerfile . # echo "Building NCE-FAN Controller..." # cd ~/tfs-ctrl/ # docker buildx build -t nce-fan-ctrl:mock -f ./src/tests/tools/mock_nce_fan_ctrl/Dockerfile . echo "Building NCE-T Controller..." cd ~/tfs-ctrl/ docker buildx build -t nce-t-ctrl:mock -f ./src/tests/tools/mock_nce_t_ctrl/Dockerfile . # echo "Building NCE-T Controller..." # cd ~/tfs-ctrl/ # docker buildx build -t nce-t-ctrl:mock -f ./src/tests/tools/mock_nce_t_ctrl/Dockerfile . echo "Building AI Analytics Engine..." cd ~/tfs-ctrl/ docker buildx build -t ai-engine:latest -f ./src/tests/mwc26-f5ga/AI_analytics_engine/Dockerfile . # echo "Building Traffic Changer..." # cd ~/tfs-ctrl/ # docker buildx build -t traffic-changer:mock -f ./src/tests/tools/traffic_changer/Dockerfile . # echo "Cleaning up..." # docker rm --force simap-server docker rm --force simap-server # docker rm --force nce-fan-ctrl # docker rm --force nce-t-ctrl # docker rm --force ai-engine # docker rm --force traffic-changer docker rm --force ai-engine echo "Deploying support services..." docker run --detach --name simap-server --publish 8080:8080 simap-server:mock docker run --detach --name nce-fan-ctrl --publish 8081:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-fan-ctrl:mock docker run --detach --name nce-t-ctrl --publish 8082:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-t-ctrl:mock # echo "Deploying support services..." docker run --detach --name simap-server --publish 8080:8080 \ -e INFLUXDB_HOST=10.254.0.9 \ -e INFLUXDB_PORT=8181 \ simap-server:mock # docker run --detach --name nce-fan-ctrl --publish 8081:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-fan-ctrl:mock # docker run --detach --name nce-t-ctrl --publish 8082:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-t-ctrl:mock echo "Deploying AI Analytics Engine..." docker run --detach --name ai-engine --publish 8084:8080 --env SIMAP_SERVER_ADDRESS=172.17.0.1 --env SIMAP_SERVER_PORT=8080 ai-engine:latest # docker run --detach --name traffic-changer --publish 8083:8080 traffic-changer:mock docker run --detach --name ai-engine --publish 8084:8080 \ -e INFLUXDB_HOST=10.254.0.9 -e INFLUXDB_PORT=8181 \ --env SIMAP_SERVER_ADDRESS=172.17.0.1 --env SIMAP_SERVER_PORT=8080 \ --env SIMAP_SERVER_USERNAME=admin --env SIMAP_SERVER_PASSWORD=admin \ ai-engine:latest # NOTE: If testing, run client (src/tests/tools/simap_server/run_client.sh) to manually populate SIMAP Server with telemetry data. sleep 2 docker ps -a Loading Loading
src/common/tools/rest_conf/server/restconf_server/app.py +2 −8 Original line number Diff line number Diff line Loading @@ -14,7 +14,6 @@ from .callbacks import CallbackOnLinkTelemetry, CallbackOnNodeTelemetry from .Config import INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_TOKEN, INFLUXDB_DATABASE from .influxdb_client import SimapInfluxDBClient from .RestConfServerApplication import RestConfServerApplication import logging Loading @@ -34,13 +33,8 @@ LOGGER.info('All connectors registered') # Initialize InfluxDB client and register telemetry callbacks try: LOGGER.info('Initializing InfluxDB client (host=%s, port=%d, db=%s)...', INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_DATABASE) influx_client = SimapInfluxDBClient( host = INFLUXDB_HOST, port = INFLUXDB_PORT, token = INFLUXDB_TOKEN, database = INFLUXDB_DATABASE ) LOGGER.info('Initializing InfluxDB client with default configuration...') influx_client = SimapInfluxDBClient() except Exception as e: LOGGER.error('Failed to initialize InfluxDB client: %s', e) influx_client = None Loading
src/common/tools/rest_conf/server/restconf_server/callbacks/TelemetryCallbacks.py +4 −6 Original line number Diff line number Diff line Loading @@ -101,12 +101,11 @@ class CallbackOnLinkTelemetry(_Callback): """ # Pattern matches: # /restconf/data/ietf-network:networks/network=<network_id>/ietf-network-topology:link=<link_id>/simap-telemetry:simap-telemetry # /restconf/data/ietf-network:networks/network=<network_id>/ietf-network-topology:link=<link_id> PATTERN = ( r'/restconf/data/ietf-network:networks' r'/network=(?P<network_id>[^/]+)' r'/ietf-network-topology:link=(?P<link_id>[^/]+)' r'/simap-telemetry:simap-telemetry' ) def __init__(self, influx_client: SimapInfluxDBClient) -> None: Loading @@ -119,7 +118,7 @@ class CallbackOnLinkTelemetry(_Callback): super().__init__(self.PATTERN) self._influx_client = influx_client def execute( def execute_data_update( self, match: re.Match, path: str, Loading Loading @@ -190,12 +189,11 @@ class CallbackOnNodeTelemetry(_Callback): """ # Pattern matches: # /restconf/data/ietf-network:networks/network=<network_id>/node=<node_id>/simap-telemetry:simap-telemetry # /restconf/data/ietf-network:networks/network=<network_id>/node=<node_id> PATTERN = ( r'/restconf/data/ietf-network:networks' r'/network=(?P<network_id>[^/]+)' r'/node=(?P<node_id>[^/]+)' r'/simap-telemetry:simap-telemetry' ) def __init__(self, influx_client: SimapInfluxDBClient) -> None: Loading @@ -208,7 +206,7 @@ class CallbackOnNodeTelemetry(_Callback): super().__init__(self.PATTERN) self._influx_client = influx_client def execute( def execute_data_update( self, match: re.Match, path: str, Loading
src/common/tools/rest_conf/server/restconf_server/influxdb_client.py +42 −17 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ from typing import List, Optional from influxdb_client_3 import InfluxDBClient3, Point, WritePrecision from .Config import INFLUXDB_HOST, INFLUXDB_PORT, INFLUXDB_DATABASE, INFLUXDB_TOKEN LOGGER = logging.getLogger(__name__) Loading @@ -31,39 +33,62 @@ class SimapInfluxDBClient: Client wrapper for writing SIMAP telemetry data to InfluxDB 3.x. """ def __init__( self, host: str, port: int, token: str, database: str def __init__( self, host: Optional[str] = None, port: Optional[int] = None, token: Optional[str] = None, database: Optional[str] = None ) -> None: """ Initialize the InfluxDB client. Args: host: InfluxDB server hostname port: InfluxDB server port token: Authentication token database: Database/bucket name host: InfluxDB server hostname (default: from INFLUXDB_HOST env or 'localhost') port: InfluxDB server port (default: from INFLUXDB_PORT env or 8181) token: Authentication token (default: from INFLUXDB_TOKEN env) database: Database/bucket name (default: from INFLUXDB_DATABASE env or 'simap_telemetry') """ self._host = host self._port = port self._database = database self._host = host if host is not None else INFLUXDB_HOST self._port = port if port is not None else INFLUXDB_PORT self._database = database if database is not None else INFLUXDB_DATABASE self._token = token if token is not None else INFLUXDB_TOKEN self._client: Optional[InfluxDBClient3] = None try: self._client = InfluxDBClient3( token = token, host = f"http://{host}:{port}", database = database token = self._token, host = f"http://{self._host}:{self._port}", database = self._database ) LOGGER.info("InfluxDB client initialized: host=%s:%d, database=%s", self._host, self._port, self._database) # Test the connection if not self._test_connection(): LOGGER.error("InfluxDB client initialized but connection test failed") self._client = None else: LOGGER.info("InfluxDB connection test successful") except Exception as e: # pylint: disable=broad-except LOGGER.error("Failed to initialize InfluxDB client: %s", str(e)) self._client = None def _test_connection(self) -> bool: """ Test the InfluxDB connection by attempting a simple system query. Returns: True if connection is accessible, False otherwise """ if self._client is None: LOGGER.warning("InfluxDB client not initialized, cannot test connection") return False try: query = "SHOW TABLES" self._client.query(query=query, language="sql") return True except Exception as e: # pylint: disable=broad-except LOGGER.error("InfluxDB connection test failed: %s", str(e)) return False def is_connected(self) -> bool: """Check if client is initialized.""" return self._client is not None Loading
src/tests/mwc26-f5ga/AI_analytics_engine/config/Config.py +2 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,8 @@ SIMAP_SERVER_USERNAME = get_setting('SIMAP_SERVER_USERNAME', default='admin') SIMAP_SERVER_PASSWORD = get_setting('SIMAP_SERVER_PASSWORD', default='admin') # InfluxDB Configuration # INFLUXDB_HOST = get_setting('INFLUXDB_HOST', default='localhost') INFLUXDB_HOST = 'localhost' INFLUXDB_HOST = get_setting('INFLUXDB_HOST', default='localhost') # INFLUXDB_HOST = 'localhost' INFLUXDB_PORT = int(get_setting('INFLUXDB_PORT', default='8181')) INFLUXDB_TOKEN = get_setting('INFLUXDB_TOKEN', default='') INFLUXDB_DATABASE = get_setting('INFLUXDB_DATABASE', default='simap_telemetry') Loading
src/tests/mwc26-f5ga/deploy.sh +27 −18 Original line number Diff line number Diff line echo "Starting deployment of MWC26-F5GA test environment..." echo "Building SIMAP Server..." cd ~/tfs-ctrl/ docker buildx build -t simap-server:mock -f ./src/tests/tools/simap_server/Dockerfile . echo "Building NCE-FAN Controller..." cd ~/tfs-ctrl/ docker buildx build -t nce-fan-ctrl:mock -f ./src/tests/tools/mock_nce_fan_ctrl/Dockerfile . # echo "Building NCE-FAN Controller..." # cd ~/tfs-ctrl/ # docker buildx build -t nce-fan-ctrl:mock -f ./src/tests/tools/mock_nce_fan_ctrl/Dockerfile . echo "Building NCE-T Controller..." cd ~/tfs-ctrl/ docker buildx build -t nce-t-ctrl:mock -f ./src/tests/tools/mock_nce_t_ctrl/Dockerfile . # echo "Building NCE-T Controller..." # cd ~/tfs-ctrl/ # docker buildx build -t nce-t-ctrl:mock -f ./src/tests/tools/mock_nce_t_ctrl/Dockerfile . echo "Building AI Analytics Engine..." cd ~/tfs-ctrl/ docker buildx build -t ai-engine:latest -f ./src/tests/mwc26-f5ga/AI_analytics_engine/Dockerfile . # echo "Building Traffic Changer..." # cd ~/tfs-ctrl/ # docker buildx build -t traffic-changer:mock -f ./src/tests/tools/traffic_changer/Dockerfile . # echo "Cleaning up..." # docker rm --force simap-server docker rm --force simap-server # docker rm --force nce-fan-ctrl # docker rm --force nce-t-ctrl # docker rm --force ai-engine # docker rm --force traffic-changer docker rm --force ai-engine echo "Deploying support services..." docker run --detach --name simap-server --publish 8080:8080 simap-server:mock docker run --detach --name nce-fan-ctrl --publish 8081:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-fan-ctrl:mock docker run --detach --name nce-t-ctrl --publish 8082:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-t-ctrl:mock # echo "Deploying support services..." docker run --detach --name simap-server --publish 8080:8080 \ -e INFLUXDB_HOST=10.254.0.9 \ -e INFLUXDB_PORT=8181 \ simap-server:mock # docker run --detach --name nce-fan-ctrl --publish 8081:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-fan-ctrl:mock # docker run --detach --name nce-t-ctrl --publish 8082:8080 --env SIMAP_ADDRESS=172.17.0.1 --env SIMAP_PORT=8080 nce-t-ctrl:mock echo "Deploying AI Analytics Engine..." docker run --detach --name ai-engine --publish 8084:8080 --env SIMAP_SERVER_ADDRESS=172.17.0.1 --env SIMAP_SERVER_PORT=8080 ai-engine:latest # docker run --detach --name traffic-changer --publish 8083:8080 traffic-changer:mock docker run --detach --name ai-engine --publish 8084:8080 \ -e INFLUXDB_HOST=10.254.0.9 -e INFLUXDB_PORT=8181 \ --env SIMAP_SERVER_ADDRESS=172.17.0.1 --env SIMAP_SERVER_PORT=8080 \ --env SIMAP_SERVER_USERNAME=admin --env SIMAP_SERVER_PASSWORD=admin \ ai-engine:latest # NOTE: If testing, run client (src/tests/tools/simap_server/run_client.sh) to manually populate SIMAP Server with telemetry data. sleep 2 docker ps -a Loading