Commit 0bf11c59 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

NBI component:

- Added Mock NBI Dependencies service as a separate continer for testing
- Fixed unitary tests
- Fixed CI/CD pipeline
parent 4e42a364
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -55,5 +55,5 @@ include:
#  - local: '/src/vnt_manager/.gitlab-ci.yml'
#  - local: '/src/e2e_orchestrator/.gitlab-ci.yml'
#
#  # This should be last one: end-to-end integration tests
#  - local: '/src/tests/.gitlab-ci.yml'
  # This should be last one: end-to-end integration tests
  - local: '/src/tests/.gitlab-ci.yml'
+9 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ unit_test nbi:
  stage: unit_test
  needs:
    - build nbi
    - build mock_nbi_dependencies
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
    - >
@@ -62,6 +63,14 @@ unit_test nbi:
      fi
  script:
    - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$IMAGE_TAG"
    - docker pull "$CI_REGISTRY_IMAGE/mock_nbi_dependencies:test"
    - >
      docker run --name mock_nbi_dependencies -d
      --network=teraflowbridge
      --env BIND_ADDRESS=0.0.0.0
      --env BIND_PORT=10000
      --env LOG_LEVEL=DEBUG
      $CI_REGISTRY_IMAGE/mock_nbi_dependencies:test
    - >
      docker run --name $IMAGE_NAME -d -v "$PWD/src/$IMAGE_NAME/tests:/opt/results" 
      --network=teraflowbridge
+56 −43
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import enum, logging, os, pytest, requests, subprocess, threading, time
import enum, logging, os, pytest, requests, time # subprocess, threading
from typing import Any, Dict, List, Optional, Set, Union
from socketio import Namespace
from common.Constants import ServiceNameEnum
@@ -21,6 +21,7 @@ from common.Settings import (
    ENVVAR_SUFIX_SERVICE_PORT_HTTP, get_env_var_name
)
from context.client.ContextClient import ContextClient
from device.client.DeviceClient import DeviceClient
from nbi.service.NbiApplication import NbiApplication
from nbi.service.health_probes.Constants import SIO_NAMESPACE as HEARTBEAT_NAMESPACE
from nbi.service.health_probes.Namespaces import HeartbeatServerNamespace
@@ -39,54 +40,58 @@ os.environ[get_env_var_name(ServiceNameEnum.NBI, ENVVAR_SUFIX_SERVICE_HOST
os.environ[get_env_var_name(ServiceNameEnum.NBI,     ENVVAR_SUFIX_SERVICE_PORT_HTTP)] = str(NBI_SERVICE_PORT)
os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(MOCKSERVICE_PORT)
os.environ[get_env_var_name(ServiceNameEnum.DEVICE,  ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
os.environ[get_env_var_name(ServiceNameEnum.DEVICE,  ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(MOCKSERVICE_PORT)
os.environ[get_env_var_name(ServiceNameEnum.SERVICE, ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
os.environ[get_env_var_name(ServiceNameEnum.SERVICE, ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(MOCKSERVICE_PORT)
os.environ[get_env_var_name(ServiceNameEnum.SLICE,   ENVVAR_SUFIX_SERVICE_HOST     )] = str(LOCAL_HOST)
os.environ[get_env_var_name(ServiceNameEnum.SLICE,   ENVVAR_SUFIX_SERVICE_PORT_GRPC)] = str(MOCKSERVICE_PORT)


@pytest.fixture(scope='session')
def mock_service():
    # NOTE: Starting MockServer in a separate process to prevent
    # issues with eventlet monkey-patched libraries.

    cmd = ['python', '-m', 'nbi.tests.MockService_Dependencies']
    custom_env = os.environ.copy()
    mock_service_process = subprocess.Popen(
        cmd,
        env=custom_env,
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        stdin=subprocess.DEVNULL,
        text=True,
        bufsize=1
    )

    mock_service_logger = logging.getLogger('MockService_Dependencies')
    mock_service_logger.info('Started')

    def stream_stdout():
        for line in iter(mock_service_process.stdout.readline, ''):
            mock_service_logger.info(line.strip())

    stream_stdout_thread = threading.Thread(target=stream_stdout, daemon=True)
    stream_stdout_thread.start()

    yield True

    # Check if process is still running
    if mock_service_process.poll() is None:
        mock_service_process.terminate()  # Try to terminate gracefully
        time.sleep(2)  # Give it time to exit
        if mock_service_process.poll() is None:
            mock_service_process.kill()  # Force kill if still running

    mock_service_logger.info('Terminated')
    stream_stdout_thread.join()
## MockService_Dependencies executed as a standalone container during
# tests to prevent apparent dead locks and issues.
#@pytest.fixture(scope='session')
#def mock_service():
#    # NOTE: Starting MockServer in a separate process to prevent
#    # issues with eventlet monkey-patched libraries.
#
#    cmd = ['python', '-m', 'nbi.tests.MockService_Dependencies']
#    custom_env = os.environ.copy()
#    mock_service_process = subprocess.Popen(
#        cmd,
#        env=custom_env,
#        stdout=subprocess.PIPE,
#        stderr=subprocess.STDOUT,
#        stdin=subprocess.DEVNULL,
#        text=True,
#        bufsize=1
#    )
#
#    mock_service_logger = logging.getLogger('MockService_Dependencies')
#    mock_service_logger.info('Started')
#
#    def stream_stdout():
#        for line in iter(mock_service_process.stdout.readline, ''):
#            mock_service_logger.info(line.strip())
#
#    stream_stdout_thread = threading.Thread(target=stream_stdout, daemon=True)
#    stream_stdout_thread.start()
#
#    yield True
#
#    # Check if process is still running
#    if mock_service_process.poll() is None:
#        mock_service_process.terminate()  # Try to terminate gracefully
#        time.sleep(2)  # Give it time to exit
#        if mock_service_process.poll() is None:
#            mock_service_process.kill()  # Force kill if still running
#
#    mock_service_logger.info('Terminated')
#    stream_stdout_thread.join()

@pytest.fixture(scope='session')
def nbi_application(
    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
#    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
) -> NbiApplication:
    mock_web_server = MockWebServer()
    mock_web_server.start()
@@ -112,15 +117,23 @@ def osm_wim(

@pytest.fixture(scope='session')
def context_client(
    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
#    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
) -> ContextClient:
    _client = ContextClient()
    yield _client
    _client.close()

@pytest.fixture(scope='session')
def device_client(
#    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
) -> DeviceClient:
    _client = DeviceClient()
    yield _client
    _client.close()

@pytest.fixture(scope='session')
def service_client(
    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
#    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
) -> ServiceClient:
    _client = ServiceClient()
    yield _client
@@ -128,7 +141,7 @@ def service_client(

@pytest.fixture(scope='session')
def slice_client(
    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
#    mock_service                                # pylint: disable=redefined-outer-name, unused-argument
) -> SliceClient:
    _client = SliceClient()
    yield _client
+2 −1
Original line number Diff line number Diff line
@@ -25,7 +25,8 @@ from .Constants import NBI_SERVICE_BASE_URL
from .HeartbeatClientNamespace import HeartbeatClientNamespace
from .PrepareTestScenario import ( # pylint: disable=unused-import
    # be careful, order of symbols is important here!
    mock_service, nbi_application, do_rest_get_request
    #mock_service,
    nbi_application, do_rest_get_request
)


+2 −1
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@ from context.client.ContextClient import ContextClient
from nbi.service.NbiApplication import NbiApplication
from .PrepareTestScenario import ( # pylint: disable=unused-import
    # be careful, order of symbols is important here!
    mock_service, nbi_application, context_client,
    #mock_service,
    nbi_application, context_client,
    do_rest_delete_request, do_rest_get_request, do_rest_patch_request, do_rest_post_request, do_rest_put_request
)

Loading