Skip to content
Snippets Groups Projects
test_unitary.py 74.2 KiB
Newer Older
# 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 (
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    Connection, ConnectionEvent, ConnectionId, Context, ContextEvent, ContextId, Device, DeviceDriverEnum, 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()
    Engine.drop_database(_db_engine)
    Engine.create_database(_db_engine)
    rebuild_database(_db_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
# pylint: disable=redefined-outer-name, unused-argument
def test_grpc_initialize(context_client_grpc : ContextClient) -> None:
    # dummy method used to initialize fixtures, database, message broker, etc.
    pass
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
# ----- Test gRPC methods ----------------------------------------------------------------------------------------------
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
def test_grpc_context(context_client_grpc : ContextClient) -> None: # pylint: disable=redefined-outer-name
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
    # ----- 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

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
def test_grpc_topology(context_client_grpc : ContextClient) -> None:    # pylint: disable=redefined-outer-name
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 = False, activate_topology_collector = True, 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

    # ----- 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
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    assert e.value.details() == 'Topology({:s}/{:s}) not found'.format(DEFAULT_CONTEXT_UUID, 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
    # ----- 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 -----------------------------------------------------------------------------------------
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    #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

    # ----- 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) == 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
    assert len(response.service_ids) == 0
    assert len(response.slice_ids) == 0

    response = context_client_grpc.GetTopology(TopologyId(**TOPOLOGY_ID))
    assert response.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
    assert response.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
    assert response.name == ''
    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 --------------------------------------------------------------------------------
    response = context_client_grpc.ListTopologyIds(ContextId(**CONTEXT_ID))
    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))
    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 response.topologies[0].name == ''
    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
    # ----- Update the object ------------------------------------------------------------------------------------------
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    new_topology_name = 'new'
    TOPOLOGY_WITH_NAME = copy.deepcopy(TOPOLOGY)
    TOPOLOGY_WITH_NAME['name'] = new_topology_name
    response = context_client_grpc.SetTopology(Topology(**TOPOLOGY_WITH_NAME))
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 -----------------------------------------------------------------------------------------
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    #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
    # ----- Get when the object is modified ----------------------------------------------------------------------------
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
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    assert response.name == new_topology_name
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    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 is modified ---------------------------------------------------------------------------
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
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    assert response.topologies[0].name == new_topology_name
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    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))
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)
    #assert isinstance(event, TopologyEvent)
    #assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
    #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
    # ----- List after deleting the object -----------------------------------------------------------------------------
    response = context_client_grpc.ListTopologyIds(ContextId(**CONTEXT_ID))
    assert len(response.topology_ids) == 0
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    response = context_client_grpc.ListTopologies(ContextId(**CONTEXT_ID))
    assert len(response.topologies) == 0
Carlos Manso's avatar
Carlos Manso committed

Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    # ----- Clean dependencies used in the test and capture related events ---------------------------------------------
    context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
    #event = events_collector.get_event(block=True)
    #assert isinstance(event, ContextEvent)
    #assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
    #assert event.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
def test_grpc_device(context_client_grpc : ContextClient) -> None:  # pylint: disable=redefined-outer-name
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 = False, activate_topology_collector = False, activate_device_collector = True,
    #    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

    # ----- 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

Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    #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
    # ----- 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
    # ----- Get when the object exists ---------------------------------------------------------------------------------
    response = context_client_grpc.GetDevice(DeviceId(**DEVICE_R1_ID))
    assert response.device_id.device_uuid.uuid == DEVICE_R1_UUID
    assert response.name == ''
    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
    assert DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG in response.device_drivers
    #assert len(response.device_endpoints) == 3

    # ----- List when the object exists --------------------------------------------------------------------------------
    response = context_client_grpc.ListDeviceIds(Empty())
    assert len(response.device_ids) == 1
    assert response.device_ids[0].device_uuid.uuid == DEVICE_R1_UUID

    response = context_client_grpc.ListDevices(Empty())
    assert len(response.devices) == 1
    assert response.devices[0].device_id.device_uuid.uuid == DEVICE_R1_UUID
    assert response.devices[0].name == ''
    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
    assert DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG in response.devices[0].device_drivers
    #assert len(response.devices[0].device_endpoints) == 3

Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    # ----- Update the object ------------------------------------------------------------------------------------------
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    new_device_name = 'r1'
    new_device_driver = DeviceDriverEnum.DEVICEDRIVER_UNDEFINED
    DEVICE_UPDATED = copy.deepcopy(DEVICE_R1)
    DEVICE_UPDATED['name'] = new_device_name
    DEVICE_UPDATED['device_operational_status'] = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
    DEVICE_UPDATED['device_drivers'].append(new_device_driver)
    response = context_client_grpc.SetDevice(Device(**DEVICE_UPDATED))
    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
    # ----- Get when the object is modified ----------------------------------------------------------------------------
    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.name == 'r1'
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    assert response.device_type == 'packet-router'
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    #assert len(response.device_config.config_rules) == 3
    assert response.device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
    assert len(response.device_drivers) == 2
    assert DeviceDriverEnum.DEVICEDRIVER_UNDEFINED in response.device_drivers
    assert DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG in response.device_drivers
    #assert len(response.device_endpoints) == 3
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.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].name == 'r1'
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    assert response.devices[0].device_type == 'packet-router'
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    #assert len(response.devices[0].device_config.config_rules) == 3
    assert response.devices[0].device_operational_status == DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
    assert len(response.devices[0].device_drivers) == 2
    assert DeviceDriverEnum.DEVICEDRIVER_UNDEFINED in response.devices[0].device_drivers
    assert DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG in response.devices[0].device_drivers
    #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
    # ----- Remove the object ------------------------------------------------------------------------------------------
    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()
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_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()

    # ----- Initialize the EventsCollector -----------------------------------------------------------------------------
    events_collector = EventsCollector(context_client_grpc)
    events_collector.start()

    # ----- Prepare dependencies for the test and capture related events -----------------------------------------------
    response = context_client_grpc.SetContext(Context(**CONTEXT))