Commit 76132fd1 authored by Waleed Akbar's avatar Waleed Akbar
Browse files

feat: Refactor InfluxDB client initialization and update telemetry callback patterns

- Moved DB initilization from app.py to DB client py
- update path telemetry SIMAP path in test client implementation
parent 5c58e56c
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -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
@@ -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
+4 −6
Original line number Diff line number Diff line
@@ -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:
@@ -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,
@@ -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:
@@ -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,
+42 −17
Original line number Diff line number Diff line
@@ -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__)

@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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')
+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