Skip to content
Snippets Groups Projects
test_unitary.py 73.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    # pylint: disable=too-many-lines
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    import copy, grpc, logging, os, pytest, requests, sqlalchemy, time, urllib, uuid
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from typing import Tuple
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID, ServiceNameEnum
    
    from common.Settings import (
        ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, ENVVAR_SUFIX_SERVICE_PORT_HTTP, get_env_var_name,
        get_service_baseurl_http, get_service_port_grpc, get_service_port_http)
    
    from context.service.Database import Database
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.message_broker.Factory import get_messagebroker_backend, BackendEnum as MessageBrokerBackendEnum
    from common.message_broker.MessageBroker import MessageBroker
    
    from common.proto.context_pb2 import (
        Connection, ConnectionEvent, ConnectionId, Context, ContextEvent, ContextId, Device, DeviceEvent, DeviceId,
        DeviceOperationalStatusEnum, Empty, EventTypeEnum, Link, LinkEvent, LinkId, Service, ServiceEvent, ServiceId,
        ServiceStatusEnum, ServiceTypeEnum, Topology, TopologyEvent, TopologyId)
    
    from common.proto.policy_pb2 import (PolicyRuleIdList, PolicyRuleId, PolicyRuleList, PolicyRule)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.tools.object_factory.Context import json_context, json_context_id
    from common.tools.object_factory.Service import json_service_id
    from common.tools.object_factory.Slice import json_slice_id
    from common.tools.object_factory.Topology import json_topology_id
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from common.type_checkers.Assertions import (
    
        validate_connection, validate_connection_ids, validate_connections, validate_context, validate_context_ids,
        validate_contexts, validate_device, validate_device_ids, validate_devices, validate_link, validate_link_ids,
        validate_links, validate_service, validate_service_ids, validate_services, validate_topologies, validate_topology,
        validate_topology_ids)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from context.client.ContextClient import ContextClient
    
    from context.client.EventsCollector import EventsCollector
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from context.service.database.Tools import (
        FASTHASHER_DATA_ACCEPTED_FORMAT, FASTHASHER_ITEM_ACCEPTED_FORMAT, fast_hasher)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from context.service.ContextService import ContextService
    #from context.service._old_code.Populate import populate
    #from context.service.rest_server.RestServer import RestServer
    #from context.service.rest_server.Resources import RESOURCES
    
    from requests import Session
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from context.service.database._Base import _Base
    from common.Settings import get_setting
    from context.service.Engine import Engine
    from context.service.database._Base import rebuild_database
    
    from .Objects import (
        CONNECTION_R1_R3, CONNECTION_R1_R3_ID, CONNECTION_R1_R3_UUID, CONTEXT, CONTEXT_ID, DEVICE_R1, DEVICE_R1_ID,
        DEVICE_R1_UUID, DEVICE_R2, DEVICE_R2_ID, DEVICE_R2_UUID, DEVICE_R3, DEVICE_R3_ID, DEVICE_R3_UUID, LINK_R1_R2,
        LINK_R1_R2_ID, LINK_R1_R2_UUID, SERVICE_R1_R2, SERVICE_R1_R2_ID, SERVICE_R1_R2_UUID, SERVICE_R1_R3,
    
        SERVICE_R1_R3_ID, SERVICE_R1_R3_UUID, SERVICE_R2_R3, SERVICE_R2_R3_ID, SERVICE_R2_R3_UUID, TOPOLOGY, TOPOLOGY_ID,
        POLICY_RULE, POLICY_RULE_ID, POLICY_RULE_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
    LOGGER = logging.getLogger(__name__)
    LOGGER.setLevel(logging.DEBUG)
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    LOCAL_HOST = '127.0.0.1'
    
    GRPC_PORT = 10000 + int(get_service_port_grpc(ServiceNameEnum.CONTEXT))   # avoid privileged ports
    HTTP_PORT = 10000 + int(get_service_port_http(ServiceNameEnum.CONTEXT))   # avoid privileged ports
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    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(GRPC_PORT)
    os.environ[get_env_var_name(ServiceNameEnum.CONTEXT, ENVVAR_SUFIX_SERVICE_PORT_HTTP)] = str(HTTP_PORT)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #DEFAULT_REDIS_SERVICE_HOST = LOCAL_HOST
    #DEFAULT_REDIS_SERVICE_PORT = 6379
    #DEFAULT_REDIS_DATABASE_ID  = 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #REDIS_CONFIG = {
    #    'REDIS_SERVICE_HOST': os.environ.get('REDIS_SERVICE_HOST', DEFAULT_REDIS_SERVICE_HOST),
    #    'REDIS_SERVICE_PORT': os.environ.get('REDIS_SERVICE_PORT', DEFAULT_REDIS_SERVICE_PORT),
    #    'REDIS_DATABASE_ID' : os.environ.get('REDIS_DATABASE_ID',  DEFAULT_REDIS_DATABASE_ID ),
    #}
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #SCENARIOS = [
    #    ('db:cockroach_mb:inmemory', None, {}, None, {}),
    #    ('all_inmemory', DatabaseBackendEnum.INMEMORY, {},           MessageBrokerBackendEnum.INMEMORY, {}          )
    
    #    ('all_redis',    DatabaseBackendEnum.REDIS,    REDIS_CONFIG, MessageBrokerBackendEnum.REDIS,    REDIS_CONFIG),
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #]
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #@pytest.fixture(scope='session', ids=[str(scenario[0]) for scenario in SCENARIOS], params=SCENARIOS)
    @pytest.fixture(scope='session')
    def context_db_mb(request) -> Tuple[Session, MessageBroker]:
        #name,db_session,mb_backend,mb_settings = request.param
        #msg = 'Running scenario {:s} db_session={:s}, mb_backend={:s}, mb_settings={:s}...'
        #LOGGER.info(msg.format(str(name), str(db_session), str(mb_backend.value), str(mb_settings)))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        _db_engine = Engine().get_engine()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        _msg_broker = MessageBroker(get_messagebroker_backend(backend=MessageBrokerBackendEnum.INMEMORY))
        yield _db_engine, _msg_broker
        _msg_broker.terminate()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    @pytest.fixture(scope='session')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    def context_service_grpc(context_db_mb : Tuple[Database, MessageBroker]): # pylint: disable=redefined-outer-name
        _service = ContextService(context_db_mb[0], context_db_mb[1])
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        _service.start()
        yield _service
        _service.stop()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
    #@pytest.fixture(scope='session')
    #def context_service_rest(context_db_mb : Tuple[Database, MessageBroker]): # pylint: disable=redefined-outer-name
    #    database = context_db_mb[0]
    #    _rest_server = RestServer()
    #    for endpoint_name, resource_class, resource_url in RESOURCES:
    #        _rest_server.add_resource(resource_class, resource_url, endpoint=endpoint_name, resource_class_args=(database,))
    #    _rest_server.start()
    #    time.sleep(1) # bring time for the server to start
    #    yield _rest_server
    #    _rest_server.shutdown()
    #    _rest_server.join()
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    @pytest.fixture(scope='session')
    def context_client_grpc(context_service_grpc : ContextService): # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        _client = ContextClient()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        yield _client
        _client.close()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    #def do_rest_request(url : str):
    #    base_url = get_service_baseurl_http(ServiceNameEnum.CONTEXT)
    #    request_url = 'http://{:s}:{:s}{:s}{:s}'.format(str(LOCAL_HOST), str(HTTP_PORT), str(base_url), url)
    #    LOGGER.warning('Request: GET {:s}'.format(str(request_url)))
    #    reply = requests.get(request_url)
    #    LOGGER.warning('Reply: {:s}'.format(str(reply.text)))
    #    assert reply.status_code == 200, 'Reply failed with code {}'.format(reply.status_code)
    #    return reply.json()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    # ----- Test gRPC methods ----------------------------------------------------------------------------------------------
    
    def test_grpc_context(
        context_client_grpc : ContextClient,                            # pylint: disable=redefined-outer-name
        context_db_mb : Tuple[sqlalchemy.engine.Engine, MessageBroker]  # pylint: disable=redefined-outer-name
    ) -> None:
        db_engine = context_db_mb[0]
    
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        rebuild_database(db_engine, drop_if_exists=True)
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #events_collector = EventsCollector(
        #    context_client_grpc, log_events_received=True,
        #    activate_context_collector = True, activate_topology_collector = False, activate_device_collector = False,
        #    activate_link_collector = False, activate_service_collector = False, activate_slice_collector = False,
        #    activate_connection_collector = False)
        #events_collector.start()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Get when the object does not exist -------------------------------------------------------------------------
        with pytest.raises(grpc.RpcError) as e:
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.GetContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.code() == grpc.StatusCode.NOT_FOUND
        assert e.value.details() == 'Context({:s}) not found'.format(DEFAULT_CONTEXT_UUID)
    
        # ----- List when the object does not exist ------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListContextIds(Empty())
    
        assert len(response.context_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListContexts(Empty())
    
        assert len(response.contexts) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database before create the object ------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #db_entries = database.dump_all()
        #LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        #for db_entry in db_entries:
        #    LOGGER.info('  [{:>4s}] {:40s} :: {:s}'.format(*db_entry)) # pragma: no cover
        #LOGGER.info('-----------------------------------------------------------')
        #assert len(db_entries) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        wrong_context_uuid = str(uuid.uuid4())
        wrong_context_id = json_context_id(wrong_context_uuid)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        with pytest.raises(grpc.RpcError) as e:
            WRONG_CONTEXT = copy.deepcopy(CONTEXT)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            WRONG_CONTEXT['topology_ids'].append(json_topology_id(str(uuid.uuid4()), context_id=wrong_context_id))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.SetContext(Context(**WRONG_CONTEXT))
        assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT
    
        msg = 'request.topology_ids[0].context_id.context_uuid.uuid({}) is invalid; '\
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
              'should be == request.context_id.context_uuid.uuid({})'.format(wrong_context_uuid, DEFAULT_CONTEXT_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.details() == msg
    
        with pytest.raises(grpc.RpcError) as e:
            WRONG_CONTEXT = copy.deepcopy(CONTEXT)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            WRONG_CONTEXT['service_ids'].append(json_service_id(str(uuid.uuid4()), context_id=wrong_context_id))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.SetContext(Context(**WRONG_CONTEXT))
        assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT
    
        msg = 'request.service_ids[0].context_id.context_uuid.uuid({}) is invalid; '\
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
              'should be == request.context_id.context_uuid.uuid({})'.format(wrong_context_uuid, DEFAULT_CONTEXT_UUID)
        assert e.value.details() == msg
    
        with pytest.raises(grpc.RpcError) as e:
            WRONG_CONTEXT = copy.deepcopy(CONTEXT)
            WRONG_CONTEXT['slice_ids'].append(json_slice_id(str(uuid.uuid4()), context_id=wrong_context_id))
            context_client_grpc.SetContext(Context(**WRONG_CONTEXT))
        assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT
        msg = 'request.slice_ids[0].context_id.context_uuid.uuid({}) is invalid; '\
              'should be == request.context_id.context_uuid.uuid({})'.format(wrong_context_uuid, DEFAULT_CONTEXT_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.details() == msg
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check create event -----------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #event = events_collector.get_event(block=True, timeout=10.0)
        #assert isinstance(event, ContextEvent)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        #assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        # ----- Get when the object exists ---------------------------------------------------------------------------------
        response = context_client_grpc.GetContext(ContextId(**CONTEXT_ID))
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.name == ''
        assert len(response.topology_ids) == 0
        assert len(response.service_ids) == 0
        assert len(response.slice_ids) == 0
    
        # ----- List when the object exists --------------------------------------------------------------------------------
        response = context_client_grpc.ListContextIds(Empty())
        assert len(response.context_ids) == 1
        assert response.context_ids[0].context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        response = context_client_grpc.ListContexts(Empty())
        assert len(response.contexts) == 1
        assert response.contexts[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.contexts[0].name == ''
        assert len(response.contexts[0].topology_ids) == 0
        assert len(response.contexts[0].service_ids) == 0
        assert len(response.contexts[0].slice_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Update the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        new_context_name = 'new'
        CONTEXT_WITH_NAME = copy.deepcopy(CONTEXT)
        CONTEXT_WITH_NAME['name'] = new_context_name
        response = context_client_grpc.SetContext(Context(**CONTEXT_WITH_NAME))
    
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #event = events_collector.get_event(block=True, timeout=10.0)
        #assert isinstance(event, ContextEvent)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        #assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Get when the object is modified ----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.GetContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.name == new_context_name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.topology_ids) == 0
        assert len(response.service_ids) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.slice_ids) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object is modified ---------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListContextIds(Empty())
    
        assert len(response.context_ids) == 1
        assert response.context_ids[0].context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListContexts(Empty())
    
        assert len(response.contexts) == 1
        assert response.contexts[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.contexts[0].name == new_context_name
    
        assert len(response.contexts[0].topology_ids) == 0
        assert len(response.contexts[0].service_ids) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.contexts[0].slice_ids) == 0
    
        # ----- Dump state of database after create/update the object ------------------------------------------------------
        #db_entries = database.dump_all()
        #LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        #for db_entry in db_entries:
        #    LOGGER.info(db_entry)
        #LOGGER.info('-----------------------------------------------------------')
        #assert len(db_entries) == 1
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Remove the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check remove event -----------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #event = events_collector.get_event(block=True, timeout=10.0)
        #assert isinstance(event, ContextEvent)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        #assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        # ----- List after deleting the object -----------------------------------------------------------------------------
        response = context_client_grpc.ListContextIds(Empty())
        assert len(response.context_ids) == 0
    
        response = context_client_grpc.ListContexts(Empty())
        assert len(response.contexts) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #events_collector.stop()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database after remove the object -------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        #db_entries = database.dump_all()
        #LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        #for db_entry in db_entries:
        #    LOGGER.info(db_entry)
        #LOGGER.info('-----------------------------------------------------------')
        #assert len(db_entries) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    """
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    def test_grpc_topology(
    
        context_client_grpc: ContextClient,  # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_db_mb: Tuple[Session, MessageBroker]):  # pylint: disable=redefined-outer-name
        session = context_db_mb[0]
    
    
        database = Database(session)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
        database.clear()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector = EventsCollector(context_client_grpc)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector.start()
    
        # ----- Prepare dependencies for the test and capture related events -----------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, ContextEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Get when the object does not exist -------------------------------------------------------------------------
        with pytest.raises(grpc.RpcError) as e:
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.GetTopology(TopologyId(**TOPOLOGY_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.code() == grpc.StatusCode.NOT_FOUND
    
        # assert e.value.details() == 'Topology({:s}/{:s}) not found'.format(DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID)
        assert e.value.details() == 'Topology({:s}) not found'.format(DEFAULT_TOPOLOGY_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object does not exist ------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListTopologyIds(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.topology_ids) == 0
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListTopologies(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.topologies) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database before create the object ------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
        LOGGER.info('-----------------------------------------------------------')
    
    Carlos Manso's avatar
    Carlos Manso committed
        assert len(db_entries) == 1
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        CONTEXT_WITH_TOPOLOGY = copy.deepcopy(CONTEXT)
        CONTEXT_WITH_TOPOLOGY['topology_ids'].append(TOPOLOGY_ID)
        response = context_client_grpc.SetContext(Context(**CONTEXT_WITH_TOPOLOGY))
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check create event -----------------------------------------------------------------------------------------
    
        # events = events_collector.get_events(block=True, count=2)
    
        # assert isinstance(events[0], TopologyEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[0].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[0].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
        # assert isinstance(events[1], ContextEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Update the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, TopologyEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after create/update the object ------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Carlos Manso's avatar
    Carlos Manso committed
        assert len(db_entries) == 2
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Get when the object exists ---------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.GetTopology(TopologyId(**TOPOLOGY_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        assert len(response.device_ids) == 0
        assert len(response.link_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object exists --------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListTopologyIds(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.topology_ids) == 1
        assert response.topology_ids[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_ids[0].topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListTopologies(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.topologies) == 1
        assert response.topologies[0].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topologies[0].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        assert len(response.topologies[0].device_ids) == 0
        assert len(response.topologies[0].link_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Remove the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_client_grpc.RemoveTopology(TopologyId(**TOPOLOGY_ID))
        context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check remove event -----------------------------------------------------------------------------------------
    
        # events = events_collector.get_events(block=True, count=2)
    
        # assert isinstance(events[0], TopologyEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[0].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[0].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
        # assert isinstance(events[1], ContextEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
    
        # events_collector.stop()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after remove the object -------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
        assert len(db_entries) == 0
    
    
    Carlos Manso's avatar
    Carlos Manso committed
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    def test_grpc_device(
    
        context_client_grpc: ContextClient,             # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_db_mb: Tuple[Session, MessageBroker]):   # pylint: disable=redefined-outer-name
        session = context_db_mb[0]
    
    
        database = Database(session)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
        database.clear()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector = EventsCollector(context_client_grpc)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector.start()
    
        # ----- Prepare dependencies for the test and capture related events -----------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
        events = events_collector.get_events(block=True, count=2)
    
        assert isinstance(events[0], ContextEvent)
        assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert isinstance(events[1], TopologyEvent)
        assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Get when the object does not exist -------------------------------------------------------------------------
        with pytest.raises(grpc.RpcError) as e:
    
            context_client_grpc.GetDevice(DeviceId(**DEVICE_R1_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.code() == grpc.StatusCode.NOT_FOUND
    
        assert e.value.details() == 'Device({:s}) not found'.format(DEVICE_R1_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- List when the object does not exist ------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListDeviceIds(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.device_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListDevices(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.devices) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database before create the object ------------------------------------------------------------
    
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
        assert len(db_entries) == 2
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        with pytest.raises(grpc.RpcError) as e:
    
            WRONG_DEVICE = copy.deepcopy(DEVICE_R1)
    
            WRONG_DEVICE_UUID = '3f03c76d-31fb-47f5-9c1d-bc6b6bfa2d08'
            WRONG_DEVICE['device_endpoints'][0]['endpoint_id']['device_id']['device_uuid']['uuid'] = WRONG_DEVICE_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.SetDevice(Device(**WRONG_DEVICE))
        assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT
    
        msg = 'request.device_endpoints[0].device_id.device_uuid.uuid({}) is invalid; '\
              'should be == request.device_id.device_uuid.uuid({})'.format(WRONG_DEVICE_UUID, DEVICE_R1_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.details() == msg
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R1))
        assert response.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check create event -----------------------------------------------------------------------------------------
    
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, DeviceEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert event.device_id.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Update the object ------------------------------------------------------------------------------------------
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R1))
        assert response.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, DeviceEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert event.device_id.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after create/update the object ------------------------------------------------------
    
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 47
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Get when the object exists ---------------------------------------------------------------------------------
    
        response = context_client_grpc.GetDevice(DeviceId(**DEVICE_R1_ID))
        assert response.device_id.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.device_type == 'packet-router'
        assert len(response.device_config.config_rules) == 3
    
        assert response.device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_DISABLED
        assert len(response.device_drivers) == 1
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.device_endpoints) == 3
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object exists --------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListDeviceIds(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.device_ids) == 1
    
        assert response.device_ids[0].device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListDevices(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.devices) == 1
    
        assert response.devices[0].device_id.device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.devices[0].device_type == 'packet-router'
        assert len(response.devices[0].device_config.config_rules) == 3
    
        assert response.devices[0].device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_DISABLED
        assert len(response.devices[0].device_drivers) == 1
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.devices[0].device_endpoints) == 3
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create object relation -------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        TOPOLOGY_WITH_DEVICE = copy.deepcopy(TOPOLOGY)
    
        TOPOLOGY_WITH_DEVICE['device_ids'].append(DEVICE_R1_ID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY_WITH_DEVICE))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, TopologyEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Check relation was created ---------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.GetTopology(TopologyId(**TOPOLOGY_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        assert len(response.device_ids) == 1
    
        assert response.device_ids[0].device_uuid.uuid == DEVICE_R1_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.link_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database after creating the object relation --------------------------------------------------
    
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 47
    
    Carlos Manso's avatar
    Carlos Manso committed
        # ----- Remove the object -------------------------------ro-----------------------------------------------------------
    
        context_client_grpc.RemoveDevice(DeviceId(**DEVICE_R1_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_client_grpc.RemoveTopology(TopologyId(**TOPOLOGY_ID))
        context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check remove event -----------------------------------------------------------------------------------------
    
        # events = events_collector.get_events(block=True, count=3)
    
        # assert isinstance(events[0], DeviceEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[0].device_id.device_uuid.uuid == DEVICE_R1_UUID
    
        # assert isinstance(events[1], TopologyEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
        # assert isinstance(events[2], ContextEvent)
        # assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[2].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
    
        # events_collector.stop()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after remove the object -------------------------------------------------------------
    
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
    
    Carlos Manso's avatar
    Carlos Manso committed
        for db_entry in db_entries:
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
        assert len(db_entries) == 0
    
    
    Carlos Manso's avatar
    Carlos Manso committed
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    def test_grpc_link(
    
    Carlos Manso's avatar
    Carlos Manso committed
        context_client_grpc: ContextClient,             # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_db_mb: Tuple[Session, MessageBroker]):   # pylint: disable=redefined-outer-name
        session = context_db_mb[0]
    
    Carlos Manso's avatar
    Carlos Manso committed
    
        database = Database(session)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        database.clear()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector = EventsCollector(context_client_grpc)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector.start()
    
        # ----- Prepare dependencies for the test and capture related events -----------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R1))
        assert response.device_uuid.uuid == DEVICE_R1_UUID
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R2))
        assert response.device_uuid.uuid == DEVICE_R2_UUID
    
    Carlos Manso's avatar
    Carlos Manso committed
        # events = events_collector.get_events(block=True, count=4)
    
    Carlos Manso's avatar
    Carlos Manso committed
        # assert isinstance(events[0], ContextEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        #
        # assert isinstance(events[1], TopologyEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        #
        # assert isinstance(events[2], DeviceEvent)
        # assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[2].device_id.device_uuid.uuid == DEVICE_R1_UUID
        #
        # assert isinstance(events[3], DeviceEvent)
        # assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[3].device_id.device_uuid.uuid == DEVICE_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Get when the object does not exist -------------------------------------------------------------------------
        with pytest.raises(grpc.RpcError) as e:
    
            context_client_grpc.GetLink(LinkId(**LINK_R1_R2_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.code() == grpc.StatusCode.NOT_FOUND
    
        assert e.value.details() == 'Link({:s}) not found'.format(LINK_R1_R2_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- List when the object does not exist ------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListLinkIds(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.link_ids) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListLinks(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.links) == 0
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database before create the object ------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Carlos Manso's avatar
    Carlos Manso committed
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 80
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create the object ------------------------------------------------------------------------------------------
    
        response = context_client_grpc.SetLink(Link(**LINK_R1_R2))
        assert response.link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check create event -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, LinkEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert event.link_id.link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Update the object ------------------------------------------------------------------------------------------
    
        response = context_client_grpc.SetLink(Link(**LINK_R1_R2))
        assert response.link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, LinkEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert event.link_id.link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after create/update the object ------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Carlos Manso's avatar
    Carlos Manso committed
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 88
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Get when the object exists ---------------------------------------------------------------------------------
    
        response = context_client_grpc.GetLink(LinkId(**LINK_R1_R2_ID))
        assert response.link_id.link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.link_endpoint_ids) == 2
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object exists --------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListLinkIds(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.link_ids) == 1
    
        assert response.link_ids[0].link_uuid.uuid == LINK_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListLinks(Empty())
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.links) == 1
    
        assert response.links[0].link_id.link_uuid.uuid == LINK_R1_R2_UUID
    
    Carlos Manso's avatar
    Carlos Manso committed
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.links[0].link_endpoint_ids) == 2
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create object relation -------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        TOPOLOGY_WITH_LINK = copy.deepcopy(TOPOLOGY)
    
        TOPOLOGY_WITH_LINK['link_ids'].append(LINK_R1_R2_ID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY_WITH_LINK))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        # event = events_collector.get_event(block=True)
        # assert isinstance(event, TopologyEvent)
        # assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        # assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Check relation was created ---------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.GetTopology(TopologyId(**TOPOLOGY_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        assert len(response.device_ids) == 2
    
    Carlos Manso's avatar
    Carlos Manso committed
        # assert response.device_ids[0].device_uuid.uuid == DEVICE_R1_UUID
        # assert response.device_ids[1].device_uuid.uuid == DEVICE_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.link_ids) == 1
    
        assert response.link_ids[0].link_uuid.uuid == LINK_R1_R2_UUID
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Carlos Manso's avatar
    Carlos Manso committed
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 88
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Remove the object ------------------------------------------------------------------------------------------
    
        context_client_grpc.RemoveLink(LinkId(**LINK_R1_R2_ID))
        context_client_grpc.RemoveDevice(DeviceId(**DEVICE_R1_ID))
        context_client_grpc.RemoveDevice(DeviceId(**DEVICE_R2_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_client_grpc.RemoveTopology(TopologyId(**TOPOLOGY_ID))
        context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check remove event -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        # events = events_collector.get_events(block=True, count=5)
        #
        # assert isinstance(events[0], LinkEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[0].link_id.link_uuid.uuid == LINK_R1_R2_UUID
        #
        # assert isinstance(events[1], DeviceEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[1].device_id.device_uuid.uuid == DEVICE_R1_UUID
        #
        # assert isinstance(events[2], DeviceEvent)
        # assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[2].device_id.device_uuid.uuid == DEVICE_R2_UUID
        #
        # assert isinstance(events[3], TopologyEvent)
        # assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[3].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[3].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        #
        # assert isinstance(events[4], ContextEvent)
        # assert events[4].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        # assert events[4].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
        events_collector.stop()
    
        # ----- Dump state of database after remove the object -------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Carlos Manso's avatar
    Carlos Manso committed
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
        assert len(db_entries) == 0
    
    Carlos Manso's avatar
    Carlos Manso committed
    """
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    """
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    def test_grpc_service(
    
        context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
        Session = context_db_mb[0]
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        database = Database(Session)
        database.clear()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector = EventsCollector(context_client_grpc)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        events_collector.start()
    
        # ----- Prepare dependencies for the test and capture related events -----------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R1))
        assert response.device_uuid.uuid == DEVICE_R1_UUID
    
        response = context_client_grpc.SetDevice(Device(**DEVICE_R2))
        assert response.device_uuid.uuid == DEVICE_R2_UUID
    
    Carlos Manso's avatar
    Carlos Manso committed
        # events = events_collector.get_events(block=True, count=4)
        #
        # assert isinstance(events[0], ContextEvent)
        # assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        #
        # assert isinstance(events[1], TopologyEvent)
        # assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        # assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
        #
        # assert isinstance(events[2], DeviceEvent)
        # assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[2].device_id.device_uuid.uuid == DEVICE_R1_UUID
        #
        # assert isinstance(events[3], DeviceEvent)
        # assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        # assert events[3].device_id.device_uuid.uuid == DEVICE_R2_UUID
        LOGGER.info('----------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Get when the object does not exist -------------------------------------------------------------------------
        with pytest.raises(grpc.RpcError) as e:
    
            context_client_grpc.GetService(ServiceId(**SERVICE_R1_R2_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.code() == grpc.StatusCode.NOT_FOUND
    
    Carlos Manso's avatar
    Carlos Manso committed
        assert e.value.details() == 'Service({:s}) not found'.format(SERVICE_R1_R2_UUID)
        LOGGER.info('----------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- List when the object does not exist ------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListServiceIds(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.service_ids) == 0
    
    Carlos Manso's avatar
    Carlos Manso committed
        LOGGER.info('----------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListServices(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.services) == 0
    
    Carlos Manso's avatar
    Carlos Manso committed
        LOGGER.info('----------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Dump state of database before create the object ------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        db_entries = database.dump_all()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Carlos Manso's avatar
    Carlos Manso committed
            LOGGER.info(db_entry)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 80
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Create the object ------------------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        with pytest.raises(grpc.RpcError) as e:
    
            WRONG_SERVICE = copy.deepcopy(SERVICE_R1_R2)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            WRONG_SERVICE['service_endpoint_ids'][0]\
    
    Carlos Manso's avatar
    Carlos Manso committed
                ['topology_id']['context_id']['context_uuid']['uuid'] = 'ca1ea172-728f-441d-972c-feeae8c9bffc'
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            context_client_grpc.SetService(Service(**WRONG_SERVICE))
        assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT
    
    Carlos Manso's avatar
    Carlos Manso committed
        msg = 'request.service_endpoint_ids[0].topology_id.context_id.context_uuid.uuid(ca1ea172-728f-441d-972c-feeae8c9bffc) is invalid; '\
    
              'should be == request.service_id.context_id.context_uuid.uuid({:s})'.format(DEFAULT_CONTEXT_UUID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert e.value.details() == msg
    
    
        response = context_client_grpc.SetService(Service(**SERVICE_R1_R2))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert response.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        CONTEXT_WITH_SERVICE = copy.deepcopy(CONTEXT)
    
        CONTEXT_WITH_SERVICE['service_ids'].append(SERVICE_R1_R2_ID)
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.SetContext(Context(**CONTEXT_WITH_SERVICE))
        assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check create event -----------------------------------------------------------------------------------------
    
        events = events_collector.get_events(block=True, count=2)
    
        assert isinstance(events[0], ServiceEvent)
        assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
        assert events[0].service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert events[0].service_id.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    
        assert isinstance(events[1], ContextEvent)
        assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Update the object ------------------------------------------------------------------------------------------
    
        response = context_client_grpc.SetService(Service(**SERVICE_R1_R2))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert response.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check update event -----------------------------------------------------------------------------------------
        event = events_collector.get_event(block=True)
        assert isinstance(event, ServiceEvent)
        assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
        assert event.service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert event.service_id.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Dump state of database after create/update the object ------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        db_entries = context_database.dump()
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            LOGGER.info('  [{:>4s}] {:40s} :: {:s}'.format(*db_entry)) # pragma: no cover
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        LOGGER.info('-----------------------------------------------------------')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(db_entries) == 108
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Get when the object exists ---------------------------------------------------------------------------------
    
        response = context_client_grpc.GetService(ServiceId(**SERVICE_R1_R2_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert response.service_id.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.service_type == ServiceTypeEnum.SERVICETYPE_L3NM
        assert len(response.service_endpoint_ids) == 2
        assert len(response.service_constraints) == 2
    
        assert response.service_status.service_status == ServiceStatusEnum.SERVICESTATUS_PLANNED
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.service_config.config_rules) == 3
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- List when the object exists --------------------------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListServiceIds(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.service_ids) == 1
        assert response.service_ids[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert response.service_ids[0].service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        response = context_client_grpc.ListServices(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.services) == 1
        assert response.services[0].service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert response.services[0].service_id.service_uuid.uuid == SERVICE_R1_R2_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert response.services[0].service_type == ServiceTypeEnum.SERVICETYPE_L3NM
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.services[0].service_endpoint_ids) == 2
        assert len(response.services[0].service_constraints) == 2
    
        assert response.services[0].service_status.service_status == ServiceStatusEnum.SERVICESTATUS_PLANNED
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        assert len(response.services[0].service_config.config_rules) == 3
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Remove the object ------------------------------------------------------------------------------------------
    
        context_client_grpc.RemoveService(ServiceId(**SERVICE_R1_R2_ID))
        context_client_grpc.RemoveDevice(DeviceId(**DEVICE_R1_ID))
        context_client_grpc.RemoveDevice(DeviceId(**DEVICE_R2_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        context_client_grpc.RemoveTopology(TopologyId(**TOPOLOGY_ID))
        context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        # ----- Check remove event -----------------------------------------------------------------------------------------
    
        events = events_collector.get_events(block=True, count=5)
    
        assert isinstance(events[0], ServiceEvent)
        assert events[0].service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
        assert events[0].service_id.service_uuid.uuid == SERVICE_R1_R2_UUID
    
        assert isinstance(events[1], DeviceEvent)
        assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
    
        assert events[1].device_id.device_uuid.uuid == DEVICE_R1_UUID
    
        assert isinstance(events[2], DeviceEvent)
        assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
    
        assert events[2].device_id.device_uuid.uuid == DEVICE_R2_UUID
    
        assert isinstance(events[3], TopologyEvent)
        assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        assert events[3].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
        assert events[3].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    
        assert isinstance(events[4], ContextEvent)
        assert events[4].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
        assert events[4].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
        # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
        events_collector.stop()
    
        # ----- Dump state of database after remove the object -------------------------------------------------------------
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        db_entries = context_database.dump()
        LOGGER.info('----- Database Dump [{:3d} entries] -------------------------'.format(len(db_entries)))
        for db_entry in db_entries:
            LOGGER.info('  [{:>4s}] {:40s} :: {:s}'.format(*db_entry)) # pragma: no cover
        LOGGER.info('-----------------------------------------------------------')
        assert len(db_entries) == 0
    
    Carlos Manso's avatar
    Carlos Manso committed
    """
    
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    """
    
    def test_grpc_connection(
        context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
        context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
        Session = context_db_mb[0]
    
    Carlos Manso's avatar
    Carlos Manso committed
    
        database = Database(Session)
    
    
        # ----- Clean the database -----------------------------------------------------------------------------------------
    
    Carlos Manso's avatar
    Carlos Manso committed
        database.clear()