From 3cbdaf3d67d20985d0c238942e93bfa3f2cd4e47 Mon Sep 17 00:00:00 2001
From: gifrerenom <lluis.gifre@cttc.es>
Date: Mon, 3 Feb 2025 08:20:36 +0000
Subject: [PATCH] NBI component:

- Corrected gunicorn-consumed symbol
- Extended dump_configuration() to dump configured websocket namespaces
- Added missing environment variables in unitary test
- Minor code polishing
---
 src/nbi/.gitlab-ci.yml            |  8 +++++++-
 src/nbi/Dockerfile                |  2 +-
 src/nbi/service/NbiApplication.py | 31 +++++++++++++++++++------------
 src/nbi/service/app.py            |  2 ++
 4 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/src/nbi/.gitlab-ci.yml b/src/nbi/.gitlab-ci.yml
index d97fab701..0bcf058fb 100644
--- a/src/nbi/.gitlab-ci.yml
+++ b/src/nbi/.gitlab-ci.yml
@@ -62,7 +62,13 @@ unit_test nbi:
       fi
   script:
     - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
-    - docker run --name $IMAGE_NAME -d -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" --network=teraflowbridge $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
+    - >
+      docker run --name $IMAGE_NAME -d -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" 
+      --network=teraflowbridge
+      --env LOG_LEVEL=DEBUG
+      --env FLASK_ENV=development
+      --env IETF_NETWORK_RENDERER=LIBYANG
+      $CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG
     - sleep 5
     - docker ps -a
     - docker logs $IMAGE_NAME
diff --git a/src/nbi/Dockerfile b/src/nbi/Dockerfile
index 5cddaf117..bd6ce77c7 100644
--- a/src/nbi/Dockerfile
+++ b/src/nbi/Dockerfile
@@ -90,4 +90,4 @@ COPY src/tests/tools/mock_osm/. tests/tools/mock_osm/
 
 # Start the service
 #ENTRYPOINT ["gunicorn", "-w", "4", "--worker-class", "eventlet", "-b", "0.0.0.0:8080", "nbi.service:nbi_app"]
-ENTRYPOINT ["gunicorn", "-w", "4", "--worker-class", "geventwebsocket.gunicorn.workers.GeventWebSocketWorker", "-b", "0.0.0.0:8080", "nbi.service.app:nbi_app"]
+ENTRYPOINT ["gunicorn", "-w", "4", "--worker-class", "geventwebsocket.gunicorn.workers.GeventWebSocketWorker", "-b", "0.0.0.0:8080", "nbi.service.app:app"]
diff --git a/src/nbi/service/NbiApplication.py b/src/nbi/service/NbiApplication.py
index 16e699810..9d17b8831 100644
--- a/src/nbi/service/NbiApplication.py
+++ b/src/nbi/service/NbiApplication.py
@@ -35,32 +35,39 @@ class NbiApplication:
         if base_url is None: base_url = ''
         self.base_url = base_url
 
-        self.app = Flask(__name__)
-        self.app.after_request(log_request)
-        self.api = Api(self.app, prefix=base_url)
+        self._app = Flask(__name__)
+        self._app.after_request(log_request)
+        self._api = Api(self._app, prefix=base_url)
         #websocket_path = '/'.join([base_url.rstrip('/'), 'websocket'])
-        self.sio = SocketIO(self.app, path=base_url, cors_allowed_origins="*")
+        self._sio = SocketIO(self._app, path=base_url, cors_allowed_origins="*")
 
     def add_rest_api_resource(self, resource_class : Resource, *urls, **kwargs) -> None:
-        self.api.add_resource(resource_class, *urls, **kwargs)
+        self._api.add_resource(resource_class, *urls, **kwargs)
 
     def add_websocket_namespace(self, namespace_class : Namespace, namespace_url : str) -> None:
-        self.sio.on_namespace(namespace_class(namespace=namespace_url))
+        self._sio.on_namespace(namespace_class(namespace=namespace_url))
 
     def websocket_emit_message(
         self, event : str, *args : Any, namespace : str = "/", to : Optional[str] = None
     ) -> None:
-        self.sio.emit(event, *args, namespace=namespace, to=to)
+        self._sio.emit(event, *args, namespace=namespace, to=to)
+
+    def get_flask_app(self) -> Flask:
+        return self._app
 
     def dump_configuration(self) -> None:
-        LOGGER.debug('Configured Resources:')
-        for resource in self.api.resources:
+        LOGGER.debug('Configured REST-API Resources:')
+        for resource in self._api.resources:
             LOGGER.debug(' - {:s}'.format(str(resource)))
 
-        LOGGER.debug('Configured Rules:')
-        for rule in self.app.url_map.iter_rules():
+        LOGGER.debug('Configured Flask Rules:')
+        for rule in self._app.url_map.iter_rules():
             LOGGER.debug(' - {:s}'.format(str(rule)))
 
+        LOGGER.debug('Configured WebSocket Namespaces:')
+        for namespace in self._sio.server.handlers.keys():
+            LOGGER.debug(' - {:s}'.format(str(namespace)))
+
     def run_standalone(
         self, bind_address : Optional[str] = None, bind_port : Optional[int] = None
     ) -> None:
@@ -75,4 +82,4 @@ class NbiApplication:
             endpoint = '/'.join([endpoint.rstrip('/'), self.base_url])
 
         LOGGER.info('Listening on {:s}...'.format(endpoint))
-        self.sio.run(self.app, host=bind_address, port=bind_port)
+        self._sio.run(self._app, host=bind_address, port=bind_port)
diff --git a/src/nbi/service/app.py b/src/nbi/service/app.py
index db696efd6..320e7b344 100644
--- a/src/nbi/service/app.py
+++ b/src/nbi/service/app.py
@@ -107,3 +107,5 @@ if __name__ == '__main__':
     nbi_app.run_standalone(
         bind_address=BIND_ADDRESS, bind_port=BIND_PORT
     )
+else:
+    app = nbi_app.get_flask_app()
-- 
GitLab