From b29a7438ea3a51e23bd67bd2ff4ad16d1f097ddb Mon Sep 17 00:00:00 2001 From: gifrerenom <lluis.gifre@cttc.es> Date: Fri, 13 Jan 2023 16:31:03 +0000 Subject: [PATCH] Context: - corrected run_tests_locally script - solved formatting issue with Database Engine error logging - minor type hinting corrections - activated event notifications for Device, EndPoint and ConfigRule --- scripts/run_tests_locally-context.sh | 4 +- .../service/ContextServiceServicerImpl.py | 21 +++-- src/context/service/database/ConfigRule.py | 27 +++++- src/context/service/database/Device.py | 57 +++++++----- src/context/service/database/Engine.py | 4 +- src/context/service/database/Topology.py | 2 +- .../database/models/ConfigRuleModel.py | 4 +- .../service/database/models/DeviceModel.py | 12 ++- .../service/database/models/EndPointModel.py | 4 +- src/context/tests/test_device.py | 91 ++++++++----------- 10 files changed, 126 insertions(+), 100 deletions(-) diff --git a/scripts/run_tests_locally-context.sh b/scripts/run_tests_locally-context.sh index 0124469ec..8c0b300b7 100755 --- a/scripts/run_tests_locally-context.sh +++ b/scripts/run_tests_locally-context.sh @@ -60,9 +60,7 @@ export NATS_URI="nats://tfs:tfs123@172.254.254.11:4222" export PYTHONPATH=/home/tfs/tfs-ctrl/src # helpful pytest flags: --log-level=INFO -o log_cli=true --verbose --maxfail=1 --durations=0 coverage run --rcfile=$RCFILE --append -m pytest --log-level=INFO --verbose --maxfail=1 \ - context/tests/test_context.py \ - context/tests/test_topology.py - #context/tests/test_*.py + context/tests/test_*.py echo echo "Coverage report:" diff --git a/src/context/service/ContextServiceServicerImpl.py b/src/context/service/ContextServiceServicerImpl.py index 1528d64d9..95cda2c29 100644 --- a/src/context/service/ContextServiceServicerImpl.py +++ b/src/context/service/ContextServiceServicerImpl.py @@ -130,28 +130,29 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def ListDeviceIds(self, request : Empty, context : grpc.ServicerContext) -> DeviceIdList: - return device_list_ids(self.db_engine) + return DeviceIdList(device_ids=device_list_ids(self.db_engine)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def ListDevices(self, request : Empty, context : grpc.ServicerContext) -> DeviceList: - return device_list_objs(self.db_engine) + return DeviceList(devices=device_list_objs(self.db_engine)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def GetDevice(self, request : ContextId, context : grpc.ServicerContext) -> Device: - return device_get(self.db_engine, request) + return Device(**device_get(self.db_engine, request)) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def SetDevice(self, request : Device, context : grpc.ServicerContext) -> DeviceId: - device_id,updated = device_set(self.db_engine, request) # pylint: disable=unused-variable - #event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE - #notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id}) - return device_id + device_id,updated = device_set(self.db_engine, request) + event_type = EventTypeEnum.EVENTTYPE_UPDATE if updated else EventTypeEnum.EVENTTYPE_CREATE + notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id}) + return DeviceId(**device_id) @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def RemoveDevice(self, request : DeviceId, context : grpc.ServicerContext) -> Empty: - deleted = device_delete(self.db_engine, request) # pylint: disable=unused-variable - #if deleted: - # notify_event(self.messagebroker, TOPIC_DEVICE, EventTypeEnum.EVENTTYPE_REMOVE, {'device_id': request}) + device_id,deleted = device_delete(self.db_engine, request) + if deleted: + event_type = EventTypeEnum.EVENTTYPE_REMOVE + notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id}) return Empty() @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) diff --git a/src/context/service/database/ConfigRule.py b/src/context/service/database/ConfigRule.py index 05dda20aa..f64e273bf 100644 --- a/src/context/service/database/ConfigRule.py +++ b/src/context/service/database/ConfigRule.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import datetime, logging from sqlalchemy import delete from sqlalchemy.dialects.postgresql import insert from sqlalchemy.orm import Session @@ -22,8 +23,10 @@ from .models.enums.ConfigAction import grpc_to_enum__config_action from .models.ConfigRuleModel import ConfigRuleKindEnum, ConfigRuleModel from .uuids._Builder import get_uuid_random +LOGGER = logging.getLogger(__name__) + def compose_config_rules_data( - config_rules : List[ConfigRule], + config_rules : List[ConfigRule], now : datetime.datetime, device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None ) -> List[Dict]: dict_config_rules : List[Dict] = list() @@ -36,6 +39,8 @@ def compose_config_rules_data( 'kind' : ConfigRuleKindEnum._member_map_.get(str_kind.upper()), # pylint: disable=no-member 'action' : grpc_to_enum__config_action(config_rule.action), 'data' : grpc_message_to_json_string(getattr(config_rule, str_kind, {})), + 'created_at' : now, + 'updated_at' : now, } if device_uuid is not None: dict_config_rule['device_uuid' ] = device_uuid if service_uuid is not None: dict_config_rule['service_uuid'] = service_uuid @@ -45,16 +50,30 @@ def compose_config_rules_data( def upsert_config_rules( session : Session, config_rules : List[Dict], - device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None -) -> None: + device_uuid : Optional[str] = None, service_uuid : Optional[str] = None, slice_uuid : Optional[str] = None, +) -> bool: + # TODO: do not delete all rules; just add-remove as needed stmt = delete(ConfigRuleModel) if device_uuid is not None: stmt = stmt.where(ConfigRuleModel.device_uuid == device_uuid ) if service_uuid is not None: stmt = stmt.where(ConfigRuleModel.service_uuid == service_uuid) if slice_uuid is not None: stmt = stmt.where(ConfigRuleModel.slice_uuid == slice_uuid ) session.execute(stmt) + + updated = False if len(config_rules) > 0: - session.execute(insert(ConfigRuleModel).values(config_rules)) + stmt = insert(ConfigRuleModel).values(config_rules) + #stmt = stmt.on_conflict_do_update( + # index_elements=[ConfigRuleModel.configrule_uuid], + # set_=dict( + # updated_at = stmt.excluded.updated_at, + # ) + #) + stmt = stmt.returning(ConfigRuleModel.created_at, ConfigRuleModel.updated_at) + config_rule_updates = session.execute(stmt).fetchall() + LOGGER.warning('config_rule_updates = {:s}'.format(str(config_rule_updates))) + # TODO: updated = ... + return updated #Union_SpecificConfigRule = Union[ # ConfigRuleCustomModel, ConfigRuleAclModel diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py index ccd991d7f..68369ac9d 100644 --- a/src/context/service/database/Device.py +++ b/src/context/service/database/Device.py @@ -12,15 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +import datetime, logging from sqlalchemy.dialects.postgresql import insert from sqlalchemy.engine import Engine from sqlalchemy.orm import Session, sessionmaker from sqlalchemy_cockroachdb import run_transaction from typing import Dict, List, Optional, Set, Tuple -from common.proto.context_pb2 import Device, DeviceId, DeviceIdList, DeviceList from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException +from common.proto.context_pb2 import Device, DeviceId from common.tools.object_factory.Device import json_device_id -from context.service.database.ConfigRule import compose_config_rules_data, upsert_config_rules from .models.DeviceModel import DeviceModel from .models.EndPointModel import EndPointModel from .models.TopologyModel import TopologyDeviceModel @@ -29,22 +29,23 @@ from .models.enums.DeviceOperationalStatus import grpc_to_enum__device_operation from .models.enums.KpiSampleType import grpc_to_enum__kpi_sample_type from .uuids.Device import device_get_uuid from .uuids.EndPoint import endpoint_get_uuid +from .ConfigRule import compose_config_rules_data, upsert_config_rules -def device_list_ids(db_engine : Engine) -> DeviceIdList: +LOGGER = logging.getLogger(__name__) + +def device_list_ids(db_engine : Engine) -> List[Dict]: def callback(session : Session) -> List[Dict]: obj_list : List[DeviceModel] = session.query(DeviceModel).all() - #.options(selectinload(DeviceModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() return [obj.dump_id() for obj in obj_list] - return DeviceIdList(device_ids=run_transaction(sessionmaker(bind=db_engine), callback)) + return run_transaction(sessionmaker(bind=db_engine), callback) -def device_list_objs(db_engine : Engine) -> DeviceList: +def device_list_objs(db_engine : Engine) -> List[Dict]: def callback(session : Session) -> List[Dict]: obj_list : List[DeviceModel] = session.query(DeviceModel).all() - #.options(selectinload(DeviceModel.topology)).filter_by(context_uuid=context_uuid).one_or_none() return [obj.dump() for obj in obj_list] - return DeviceList(devices=run_transaction(sessionmaker(bind=db_engine), callback)) + return run_transaction(sessionmaker(bind=db_engine), callback) -def device_get(db_engine : Engine, request : DeviceId) -> Device: +def device_get(db_engine : Engine, request : DeviceId) -> Dict: device_uuid = device_get_uuid(request, allow_random=False) def callback(session : Session) -> Optional[Dict]: obj : Optional[DeviceModel] = session.query(DeviceModel).filter_by(device_uuid=device_uuid).one_or_none() @@ -55,9 +56,9 @@ def device_get(db_engine : Engine, request : DeviceId) -> Device: raise NotFoundException('Device', raw_device_uuid, extra_details=[ 'device_uuid generated was: {:s}'.format(device_uuid) ]) - return Device(**obj) + return obj -def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: +def device_set(db_engine : Engine, request : Device) -> Tuple[Dict, bool]: raw_device_uuid = request.device_id.device_uuid.uuid raw_device_name = request.name device_name = raw_device_uuid if len(raw_device_name) == 0 else raw_device_name @@ -67,6 +68,8 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: oper_status = grpc_to_enum__device_operational_status(request.device_operational_status) device_drivers = [grpc_to_enum__device_driver(d) for d in request.device_drivers] + now = datetime.datetime.utcnow() + topology_uuids : Set[str] = set() related_topologies : List[Dict] = list() endpoints_data : List[Dict] = list() @@ -94,6 +97,8 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: 'name' : endpoint_name, 'endpoint_type' : endpoint.endpoint_type, 'kpi_sample_types': kpi_sample_types, + 'created_at' : now, + 'updated_at' : now, }) if endpoint_topology_uuid not in topology_uuids: @@ -103,7 +108,7 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: }) topology_uuids.add(endpoint_topology_uuid) - config_rules = compose_config_rules_data(request.device_config.config_rules, device_uuid=device_uuid) + config_rules = compose_config_rules_data(request.device_config.config_rules, now, device_uuid=device_uuid) device_data = [{ 'device_uuid' : device_uuid, @@ -111,9 +116,11 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: 'device_type' : device_type, 'device_operational_status': oper_status, 'device_drivers' : device_drivers, + 'created_at' : now, + 'updated_at' : now, }] - def callback(session : Session) -> None: + def callback(session : Session) -> bool: stmt = insert(DeviceModel).values(device_data) stmt = stmt.on_conflict_do_update( index_elements=[DeviceModel.device_uuid], @@ -122,9 +129,12 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: device_type = stmt.excluded.device_type, device_operational_status = stmt.excluded.device_operational_status, device_drivers = stmt.excluded.device_drivers, + updated_at = stmt.excluded.updated_at, ) ) - session.execute(stmt) + stmt = stmt.returning(DeviceModel.created_at, DeviceModel.updated_at) + created_at,updated_at = session.execute(stmt).fetchone() + updated = updated_at > created_at stmt = insert(EndPointModel).values(endpoints_data) stmt = stmt.on_conflict_do_update( @@ -133,23 +143,28 @@ def device_set(db_engine : Engine, request : Device) -> Tuple[DeviceId, bool]: name = stmt.excluded.name, endpoint_type = stmt.excluded.endpoint_type, kpi_sample_types = stmt.excluded.kpi_sample_types, + updated_at = stmt.excluded.updated_at, ) ) - session.execute(stmt) + stmt = stmt.returning(EndPointModel.created_at, EndPointModel.updated_at) + endpoint_updates = session.execute(stmt).fetchall() + LOGGER.warning('endpoint_updates = {:s}'.format(str(endpoint_updates))) session.execute(insert(TopologyDeviceModel).values(related_topologies).on_conflict_do_nothing( index_elements=[TopologyDeviceModel.topology_uuid, TopologyDeviceModel.device_uuid] )) - upsert_config_rules(session, config_rules, device_uuid=device_uuid) + configrules_updated = upsert_config_rules(session, config_rules, device_uuid=device_uuid) + + return updated - run_transaction(sessionmaker(bind=db_engine), callback) - updated = False # TODO: improve and check if created/updated - return DeviceId(**json_device_id(device_uuid)),updated + updated = run_transaction(sessionmaker(bind=db_engine), callback) + return json_device_id(device_uuid),updated -def device_delete(db_engine : Engine, request : DeviceId) -> bool: +def device_delete(db_engine : Engine, request : DeviceId) -> Tuple[Dict, bool]: device_uuid = device_get_uuid(request, allow_random=False) def callback(session : Session) -> bool: num_deleted = session.query(DeviceModel).filter_by(device_uuid=device_uuid).delete() return num_deleted > 0 - return run_transaction(sessionmaker(bind=db_engine), callback) + deleted = run_transaction(sessionmaker(bind=db_engine), callback) + return json_device_id(device_uuid),deleted diff --git a/src/context/service/database/Engine.py b/src/context/service/database/Engine.py index a1aedc3ae..c507efc72 100644 --- a/src/context/service/database/Engine.py +++ b/src/context/service/database/Engine.py @@ -29,13 +29,13 @@ class Engine: engine = sqlalchemy.create_engine( crdb_uri, connect_args={'application_name': APP_NAME}, echo=ECHO, future=True) except: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to connect to database: {:s}'.format(crdb_uri)) + LOGGER.exception('Failed to connect to database: {:s}'.format(str(crdb_uri))) return None try: Engine.create_database(engine) except: # pylint: disable=bare-except # pragma: no cover - LOGGER.exception('Failed to check/create to database: {:s}'.format(engine.url)) + LOGGER.exception('Failed to check/create to database: {:s}'.format(str(crdb_uri))) return None return engine diff --git a/src/context/service/database/Topology.py b/src/context/service/database/Topology.py index 75fc229d8..fcd93e6bb 100644 --- a/src/context/service/database/Topology.py +++ b/src/context/service/database/Topology.py @@ -82,7 +82,7 @@ def topology_set(db_engine : Engine, request : Topology) -> Tuple[Dict, bool]: 'updated_at' : now, }] - def callback(session : Session) -> None: + def callback(session : Session) -> bool: stmt = insert(TopologyModel).values(topology_data) stmt = stmt.on_conflict_do_update( index_elements=[TopologyModel.topology_uuid], diff --git a/src/context/service/database/models/ConfigRuleModel.py b/src/context/service/database/models/ConfigRuleModel.py index c2baa8df6..a697de556 100644 --- a/src/context/service/database/models/ConfigRuleModel.py +++ b/src/context/service/database/models/ConfigRuleModel.py @@ -13,7 +13,7 @@ # limitations under the License. import enum, json -from sqlalchemy import CheckConstraint, Column, Enum, ForeignKey, Integer, String +from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String from sqlalchemy.dialects.postgresql import UUID from typing import Dict from .enums.ConfigAction import ORM_ConfigActionEnum @@ -35,6 +35,8 @@ class ConfigRuleModel(_Base): kind = Column(Enum(ConfigRuleKindEnum), nullable=False) action = Column(Enum(ORM_ConfigActionEnum), nullable=False) data = Column(String, nullable=False) + created_at = Column(DateTime) + updated_at = Column(DateTime) __table_args__ = ( CheckConstraint(position >= 0, name='check_position_value'), diff --git a/src/context/service/database/models/DeviceModel.py b/src/context/service/database/models/DeviceModel.py index 2deb688e1..ef56c7158 100644 --- a/src/context/service/database/models/DeviceModel.py +++ b/src/context/service/database/models/DeviceModel.py @@ -13,7 +13,7 @@ # limitations under the License. import operator -from sqlalchemy import Column, Enum, String +from sqlalchemy import Column, DateTime, Enum, String from sqlalchemy.dialects.postgresql import ARRAY, UUID from sqlalchemy.orm import relationship from typing import Dict @@ -24,11 +24,13 @@ from ._Base import _Base class DeviceModel(_Base): __tablename__ = 'device' - device_uuid = Column(UUID(as_uuid=False), primary_key=True) - device_name = Column(String, nullable=False) - device_type = Column(String, nullable=False) + device_uuid = Column(UUID(as_uuid=False), primary_key=True) + device_name = Column(String, nullable=False) + device_type = Column(String, nullable=False) device_operational_status = Column(Enum(ORM_DeviceOperationalStatusEnum), nullable=False) - device_drivers = Column(ARRAY(Enum(ORM_DeviceDriverEnum), dimensions=1)) + device_drivers = Column(ARRAY(Enum(ORM_DeviceDriverEnum), dimensions=1)) + created_at = Column(DateTime) + updated_at = Column(DateTime) #topology_devices = relationship('TopologyDeviceModel', back_populates='device') config_rules = relationship('ConfigRuleModel', passive_deletes=True) # lazy='joined', back_populates='device' diff --git a/src/context/service/database/models/EndPointModel.py b/src/context/service/database/models/EndPointModel.py index 4151cfe0d..abc16c1af 100644 --- a/src/context/service/database/models/EndPointModel.py +++ b/src/context/service/database/models/EndPointModel.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from sqlalchemy import Column, Enum, ForeignKey, String +from sqlalchemy import Column, DateTime, Enum, ForeignKey, String from sqlalchemy.dialects.postgresql import ARRAY, UUID from sqlalchemy.orm import relationship from typing import Dict @@ -28,6 +28,8 @@ class EndPointModel(_Base): name = Column(String, nullable=False) endpoint_type = Column(String, nullable=False) kpi_sample_types = Column(ARRAY(Enum(ORM_KpiSampleTypeEnum), dimensions=1)) + created_at = Column(DateTime) + updated_at = Column(DateTime) device = relationship('DeviceModel', back_populates='endpoints') topology = relationship('TopologyModel') diff --git a/src/context/tests/test_device.py b/src/context/tests/test_device.py index e53ad747c..b009a5e45 100644 --- a/src/context/tests/test_device.py +++ b/src/context/tests/test_device.py @@ -12,24 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. -import copy, grpc, pytest +import copy, grpc, pytest, time from common.proto.context_pb2 import ( - Context, ContextId, Device, DeviceDriverEnum, DeviceId, DeviceOperationalStatusEnum, Empty, Topology, TopologyId) + Context, ContextEvent, ContextId, Device, DeviceDriverEnum, DeviceEvent, DeviceId, DeviceOperationalStatusEnum, Empty, EventTypeEnum, Topology, TopologyEvent, TopologyId) from context.client.ContextClient import ContextClient from context.service.database.uuids.Device import device_get_uuid -#from context.client.EventsCollector import EventsCollector +from context.client.EventsCollector import EventsCollector from .Objects import CONTEXT, CONTEXT_ID, DEVICE_R1, DEVICE_R1_ID, DEVICE_R1_NAME, TOPOLOGY, TOPOLOGY_ID @pytest.mark.depends(on=['context/tests/test_topology.py::test_topology']) def test_device(context_client : ContextClient) -> None: # ----- Initialize the EventsCollector ----------------------------------------------------------------------------- - #events_collector = EventsCollector( - # context_client, 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() + events_collector = EventsCollector( + context_client, 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() + time.sleep(3) # ----- Prepare dependencies for the test and capture related events ----------------------------------------------- response = context_client.SetContext(Context(**CONTEXT)) @@ -38,14 +39,14 @@ def test_device(context_client : ContextClient) -> None: response = context_client.SetTopology(Topology(**TOPOLOGY)) topology_uuid = response.topology_uuid.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 == 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 == context_uuid - #assert events[1].topology_id.topology_uuid.uuid == topology_uuid + events = events_collector.get_events(block=True, count=2, timeout=1.0) + assert isinstance(events[0], ContextEvent) + assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE + assert events[0].context_id.context_uuid.uuid == 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 == context_uuid + assert events[1].topology_id.topology_uuid.uuid == topology_uuid # ----- Get when the object does not exist ------------------------------------------------------------------------- device_id = DeviceId(**DEVICE_R1_ID) @@ -78,10 +79,10 @@ def test_device(context_client : ContextClient) -> None: assert response.device_uuid.uuid == device_uuid # ----- 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_uuid + event = events_collector.get_event(block=True, timeout=1.0) + assert isinstance(event, DeviceEvent) + assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE + assert event.device_id.device_uuid.uuid == device_uuid # ----- Get when the object exists --------------------------------------------------------------------------------- response = context_client.GetDevice(DeviceId(**DEVICE_R1_ID)) @@ -121,10 +122,10 @@ def test_device(context_client : ContextClient) -> None: assert response.device_uuid.uuid == device_uuid # ----- 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_uuid + event = events_collector.get_event(block=True, timeout=1.0) + assert isinstance(event, DeviceEvent) + assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE + assert event.device_id.device_uuid.uuid == device_uuid # ----- Get when the object is modified ---------------------------------------------------------------------------- response = context_client.GetDevice(DeviceId(**DEVICE_R1_ID)) @@ -155,20 +156,6 @@ def test_device(context_client : ContextClient) -> None: assert DeviceDriverEnum.DEVICEDRIVER_OPENCONFIG in response.devices[0].device_drivers assert len(response.devices[0].device_endpoints) == 4 - # ----- Create object relation ------------------------------------------------------------------------------------- - #TOPOLOGY_WITH_DEVICE = copy.deepcopy(TOPOLOGY) - #TOPOLOGY_WITH_DEVICE['device_ids'].append(DEVICE_R1_ID) - #response = context_client.SetTopology(Topology(**TOPOLOGY_WITH_DEVICE)) - #assert response.context_id.context_uuid.uuid == context_uuid - #assert response.topology_uuid.uuid == topology_uuid - - # ----- 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 == context_uuid - #assert response.topology_uuid.uuid == topology_uuid - # ----- Check relation was created --------------------------------------------------------------------------------- response = context_client.GetTopology(TopologyId(**TOPOLOGY_ID)) assert response.topology_id.context_id.context_uuid.uuid == context_uuid @@ -181,10 +168,10 @@ def test_device(context_client : ContextClient) -> None: context_client.RemoveDevice(DeviceId(**DEVICE_R1_ID)) # ----- Check remove event ----------------------------------------------------------------------------------------- - #event = events_collector.get_event(block=True) - #assert isinstance(event, DeviceEvent) - #assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE - #assert event.device_id.device_uuid.uuid == device_uuid + event = events_collector.get_event(block=True, timeout=1.0) + assert isinstance(event, DeviceEvent) + assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE + assert event.device_id.device_uuid.uuid == device_uuid # ----- List after deleting the object ----------------------------------------------------------------------------- response = context_client.ListDeviceIds(Empty()) @@ -203,14 +190,14 @@ def test_device(context_client : ContextClient) -> None: context_client.RemoveTopology(TopologyId(**TOPOLOGY_ID)) context_client.RemoveContext(ContextId(**CONTEXT_ID)) - #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 == context_uuid - #assert events[0].topology_id.topology_uuid.uuid == topology_uuid - #assert isinstance(events[1], ContextEvent) - #assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE - #assert events[1].context_id.context_uuid.uuid == context_uuid + events = events_collector.get_events(block=True, count=2, timeout=1.0) + assert isinstance(events[0], TopologyEvent) + assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE + assert events[0].topology_id.context_id.context_uuid.uuid == context_uuid + assert events[0].topology_id.topology_uuid.uuid == topology_uuid + assert isinstance(events[1], ContextEvent) + assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE + assert events[1].context_id.context_uuid.uuid == context_uuid # ----- Stop the EventsCollector ----------------------------------------------------------------------------------- - #events_collector.stop() + events_collector.stop() -- GitLab