diff --git a/proto/analytics_frontend.proto b/proto/analytics_frontend.proto index 6af761ae51f332fc5df849e431663acd46b7888f..070d0b957294f6627885cb8ea6c4fb68e6f1945a 100644 --- a/proto/analytics_frontend.proto +++ b/proto/analytics_frontend.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package device; import "context.proto"; -import "kpi_manager.proto"; +import "kpi_management.proto"; import "kpi_sample_types.proto"; service AnalyticsFrontendService { @@ -21,12 +21,12 @@ enum AnalyzerMode { } message Analyzer { - repeated kpi_manager.KpiId kpi_id = 1; // The KPI Ids to be processed by the analyzer - AnalyzerMode mode = 2; // Operation mode of the analyzer - float batch_min_duration_s = 3; // In batch mode, min duration to collect before executing batch - float batch_max_duration_s = 4; // In batch mode, max duration collected to execute the batch - uint batch_min_size = 5; // In batch mode, min number of samples to collect before executing batch - uint batch_max_size = 6; // In batch mode, max number of samples collected to execute the batch + repeated kpi_management.KpiId kpi_id = 1; // The KPI Ids to be processed by the analyzer + AnalyzerMode mode = 2; // Operation mode of the analyzer + float batch_min_duration_s = 3; // In batch mode, min duration to collect before executing batch + float batch_max_duration_s = 4; // In batch mode, max duration collected to execute the batch + uint64 batch_min_size = 5; // In batch mode, min number of samples to collect before executing batch + uint64 batch_max_size = 6; // In batch mode, max number of samples collected to execute the batch } message AnalyzerFilter { @@ -34,7 +34,7 @@ message AnalyzerFilter { // An empty list means: any value is accepted. // All fields empty means: list all Analyzers repeated AnalyzerId analyzer_id = 1; - repeated kpi_manager.KpiId kpi_id = 2; + repeated kpi_management.KpiId kpi_id = 2; repeated kpi_sample_types.KpiSampleType kpi_sample_type = 3; repeated context.DeviceId device_id = 4; repeated context.EndPointId endpoint_id = 5; diff --git a/proto/device.proto b/proto/device.proto index 98cca8ce937d4bccdb5076a7d26e9a27388641be..519bdeae90ba74a8ae18d90facbf02663f2a0797 100644 --- a/proto/device.proto +++ b/proto/device.proto @@ -17,7 +17,7 @@ package device; import "context.proto"; //import "monitoring.proto"; -import "kpi_manager.proto"; +import "kpi_management.proto"; service DeviceService { rpc AddDevice (context.Device ) returns (context.DeviceId ) {} @@ -28,8 +28,8 @@ service DeviceService { } message MonitoringSettings { - kpi_manager.KpiId kpi_id = 1; - kpi_manager.KpiDescriptor kpi_descriptor = 2; + kpi_management.KpiId kpi_id = 1; + kpi_management.KpiDescriptor kpi_descriptor = 2; float sampling_duration_s = 3; float sampling_interval_s = 4; } diff --git a/proto/kpi_manager.proto b/proto/kpi_management.proto similarity index 99% rename from proto/kpi_manager.proto rename to proto/kpi_management.proto index ad48eb84ff7433d48ebcd5ebd902f0bea7d28504..a2a8f9d7252f1286f184b9e5563258fc1491b6f0 100644 --- a/proto/kpi_manager.proto +++ b/proto/kpi_management.proto @@ -13,7 +13,7 @@ // limitations under the License. syntax = "proto3"; -package kpi_manager; +package kpi_management; import "context.proto"; import "kpi_sample_types.proto"; @@ -25,7 +25,6 @@ service KpiManagerService{ rpc SelectKpiDescriptor (KpiDescriptorFilter) returns (KpiDescriptorList ) {} // Stable and final } - message KpiId { context.Uuid kpi_id = 1; } diff --git a/proto/monitoring.proto b/proto/monitoring.proto index 2706988aa474b88f237017d72e468a34e4945af9..e316fbdc14807b847ac6d8034c524d993ab91130 100755 --- a/proto/monitoring.proto +++ b/proto/monitoring.proto @@ -16,7 +16,7 @@ syntax = "proto3"; package monitoring; import "context.proto"; -import "kpi_manager.proto"; +import "kpi_management.proto"; //import "kpi_sample_types.proto"; service MonitoringService { @@ -43,14 +43,14 @@ service MonitoringService { message MonitorKpiRequest { - kpi_manager.KpiId kpi_id = 1; + kpi_management.KpiId kpi_id = 1; float monitoring_window_s = 2; float sampling_rate_s = 3; // Pending add field to reflect Available Device Protocols } message KpiQuery { - repeated kpi_manager.KpiId kpi_ids = 1; + repeated kpi_management.KpiId kpi_ids = 1; float monitoring_window_s = 2; uint32 last_n_samples = 3; // used when you want something like "get the last N many samples context.Timestamp start_timestamp = 4; // used when you want something like "get the samples since X date/time" @@ -64,7 +64,7 @@ message RawKpi { // cell } message RawKpiList { // column - kpi_manager.KpiId kpi_id = 1; + kpi_management.KpiId kpi_id = 1; repeated RawKpi raw_kpis = 2; } @@ -75,7 +75,7 @@ message RawKpiTable { // table message Kpi { - kpi_manager.KpiId kpi_id = 1; + kpi_management.KpiId kpi_id = 1; context.Timestamp timestamp = 2; KpiValue kpi_value = 3; } @@ -109,7 +109,7 @@ message KpiList { message SubsDescriptor{ SubscriptionID subs_id = 1; - kpi_manager.KpiId kpi_id = 2; + kpi_management.KpiId kpi_id = 2; float sampling_duration_s = 3; float sampling_interval_s = 4; context.Timestamp start_timestamp = 5; // used when you want something like "get the samples since X date/time" @@ -134,7 +134,7 @@ message AlarmDescriptor { AlarmID alarm_id = 1; string alarm_description = 2; string name = 3; - kpi_manager.KpiId kpi_id = 4; + kpi_management.KpiId kpi_id = 4; KpiValueRange kpi_value_range = 5; context.Timestamp timestamp = 6; } diff --git a/proto/optical_attack_detector.proto b/proto/optical_attack_detector.proto index 0d3ed58de81283e3f77fb013bed77ede14c7e849..61f93c299c98f7f723915c7bb445871d4708ee4d 100644 --- a/proto/optical_attack_detector.proto +++ b/proto/optical_attack_detector.proto @@ -18,7 +18,7 @@ package optical_attack_detector; import "context.proto"; //import "monitoring.proto"; -import "kpi_manager.proto"; +import "kpi_management.proto"; service OpticalAttackDetectorService { @@ -29,5 +29,5 @@ service OpticalAttackDetectorService { message DetectionRequest { context.ServiceId service_id = 1; - kpi_manager.KpiId kpi_id = 2; + kpi_management.KpiId kpi_id = 2; } diff --git a/proto/policy_condition.proto b/proto/policy_condition.proto index c0af929efdbdbd6f237d6a6aba471952da1d2d6a..8f1211208eaa64dda72933edbd657ee69e0ef618 100644 --- a/proto/policy_condition.proto +++ b/proto/policy_condition.proto @@ -16,11 +16,11 @@ syntax = "proto3"; package policy; import "monitoring.proto"; -import "kpi_manager.proto"; +import "kpi_management.proto"; // Condition message PolicyRuleCondition { - kpi_manager.KpiId kpiId = 1; + kpi_management.KpiId kpiId = 1; NumericalOperator numericalOperator = 2; monitoring.KpiValue kpiValue = 3; } diff --git a/proto/telemetry_frontend.proto b/proto/telemetry_frontend.proto index 48bfd7a0e17501a5fb78fa5e180b11b79fdd735d..ffc851a4c11eba8054527eaf82ece202b3381499 100644 --- a/proto/telemetry_frontend.proto +++ b/proto/telemetry_frontend.proto @@ -2,8 +2,7 @@ syntax = "proto3"; package device; import "context.proto"; -import "kpi_manager.proto"; -import "kpi_sample_types.proto"; +import "kpi_management.proto"; service TelemetryFrontendService { rpc StartCollector (Collector ) returns (CollectorId ) {} @@ -16,25 +15,18 @@ message CollectorId { } message Collector { - CollectorId collector_id = 1; // The Collector ID - kpi_manager.KpiId kpi_id = 2; // The KPI Id to be associated to the collected samples - float duration_s = 3; // Terminate data collection after duration[seconds]; duration==0 means indefinitely - float interval_s = 4; // Interval between collected samples + CollectorId collector_id = 1; // The Collector ID + kpi_management.KpiId kpi_id = 2; // The KPI Id to be associated to the collected samples + float duration_s = 3; // Terminate data collection after duration[seconds]; duration==0 means indefinitely + float interval_s = 4; // Interval between collected samples } message CollectorFilter { // Collector that fulfill the filter are those that match ALL the following fields. // An empty list means: any value is accepted. // All fields empty means: list all Collectors - repeated CollectorId collector_id = 1; - repeated kpi_manager.KpiId kpi_id = 2; - // repeated kpi_sample_types.KpiSampleType kpi_sample_type = 3; - // repeated context.DeviceId device_id = 4; - // repeated context.EndPointId endpoint_id = 5; - // repeated context.ServiceId service_id = 6; - // repeated context.SliceId slice_id = 7; - // repeated context.ConnectionId connection_id = 8; - // repeated context.LinkId link_id = 9; + repeated CollectorId collector_id = 1; + repeated kpi_management.KpiId kpi_id = 2; } message CollectorList { diff --git a/scripts/run_tests_locally-kpi-DB.sh b/scripts/run_tests_locally-kpi-DB.sh index aa976762072a15d5481e41c3cfa45fe4a876c0cd..75d92206106859991624c18d09c29a3637e9d1e4 100755 --- a/scripts/run_tests_locally-kpi-DB.sh +++ b/scripts/run_tests_locally-kpi-DB.sh @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - kpi_manager/service/database/KpiDBtests.py \ No newline at end of file + kpi_management/kpi_manager/database/tests/KpiDBtests.py \ No newline at end of file diff --git a/scripts/run_tests_locally-kpi-manager.sh b/scripts/run_tests_locally-kpi-manager.sh index be69980e05f2b4f922a970df77f7d15b4a178fcc..17c0c02ac19e806033eb1be34c38c7c6429a6d5e 100755 --- a/scripts/run_tests_locally-kpi-manager.sh +++ b/scripts/run_tests_locally-kpi-manager.sh @@ -25,4 +25,4 @@ cd $PROJECTDIR/src RCFILE=$PROJECTDIR/coverage/.coveragerc python3 -m pytest --log-level=INFO --log-cli-level=INFO --verbose \ - kpi_manager/tests/test_kpi_manager.py \ No newline at end of file + kpi_management/kpi_manager/tests/test_kpi_manager.py \ No newline at end of file diff --git a/src/kpi_manager/Dockerfile b/src/kpi_management/Dockerfile similarity index 91% rename from src/kpi_manager/Dockerfile rename to src/kpi_management/Dockerfile index d3d962b9fedd249e2a9bfe43a54dd558a43e4563..0369fc0c8d9068d959a4b9a00f218b45ad3b7d46 100644 --- a/src/kpi_manager/Dockerfile +++ b/src/kpi_management/Dockerfile @@ -54,9 +54,9 @@ RUN rm *.proto RUN find . -type f -exec sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' {} \; # Create component sub-folders, get specific Python packages -RUN mkdir -p /var/teraflow/kpi_manager -WORKDIR /var/teraflow/kpi_manager -COPY src/kpi_manager/requirements.in requirements.in +RUN mkdir -p /var/teraflow/kpi_management +WORKDIR /var/teraflow/kpi_management +COPY src/kpi_management/requirements.in requirements.in RUN pip-compile --quiet --output-file=requirements.txt requirements.in RUN python3 -m pip install -r requirements.txt @@ -65,7 +65,7 @@ WORKDIR /var/teraflow COPY src/context/. context/ COPY src/device/. device/ COPY src/monitoring/. monitoring/ -COPY src/kpi_manager/. kpi_manager/ +COPY src/kpi_management/. kpi_management/ # Start the service -ENTRYPOINT ["python", "-m", "kpi_manager.service"] +ENTRYPOINT ["python", "-m", "kpi_management.service"] diff --git a/src/kpi_manager/README.md b/src/kpi_management/README.md similarity index 57% rename from src/kpi_manager/README.md rename to src/kpi_management/README.md index 88c52bb4f23472b02d335cea64b3709a45e6a6bd..b73f0e8af20aa6579297111d9d667b18b277ab55 100644 --- a/src/kpi_manager/README.md +++ b/src/kpi_management/README.md @@ -1,19 +1,21 @@ -# How to locally run and test KPI Manager service +# How to locally run and test KPI management service + +## ----- Update Required (Files structure has been changed) ----- ### Pre-requisets -The following requirements should be fulfilled before the execuation of KPI Manager service. +The following requirements should be fulfilled before the execuation of KPI management service. -1. verify that [kpi_manager.proto](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/proto/kpi_manager.proto) file exists and grpcs file are generated sucessfully. -2. virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_manager/requirements.in) are installed sucessfully. +1. verify that [kpi_management.proto](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/proto/kpi_management.proto) file exists and grpcs file are generated sucessfully. +2. virtual enviornment exist with all the required packages listed in ["requirements.in"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/requirements.in) are installed sucessfully. 3. verify the creation of required database and table. -[KPI DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_manager/service/database/KpiDBtests.py) python file enlist the functions to create tables and database. -[KPI Engine](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_manager/service/database/KpiEngine.py) contains the DB string, update the string as per your deployment. +[KPI DB test](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/service/database/KpiDBtests.py) python file enlist the functions to create tables and database. +[KPI Engine](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/service/database/KpiEngine.py) contains the DB string, update the string as per your deployment. ### Messages format templates -["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_manager/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. +["Messages"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/tests/test_messages.py) python file enlist the basic gRPC messages format used during the testing. ### Test file -["KPI manager test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_manager/tests/test_kpi_manager.py) python file enlist the different tests conducted during the experiment. +["KPI management test"](https://labs.etsi.org/rep/tfs/controller/-/blob/feat/71-cttc-separation-of-monitoring/src/kpi_management/tests/test_kpi_management.py) python file enlist the different tests conducted during the experiment. ### Flow of execution (Kpi Maanager Service functions) 1. Call the `create_database()` and `create_tables()` functions from `Kpi_DB` class to create the required database and table if they don't exist. diff --git a/src/kpi_manager/__init__.py b/src/kpi_management/__init__.py similarity index 100% rename from src/kpi_manager/__init__.py rename to src/kpi_management/__init__.py diff --git a/src/kpi_manager/client/__init__.py b/src/kpi_management/kpi_manager/__init__.py similarity index 100% rename from src/kpi_manager/client/__init__.py rename to src/kpi_management/kpi_manager/__init__.py diff --git a/src/kpi_manager/client/KpiManagerClient.py b/src/kpi_management/kpi_manager/client/KpiManagerClient.py similarity index 95% rename from src/kpi_manager/client/KpiManagerClient.py rename to src/kpi_management/kpi_manager/client/KpiManagerClient.py index 30b1720fb892c599abd5b206d7478873e72cc5fd..140381d3a6c55c2edd997fdabf21da276b122e6c 100755 --- a/src/kpi_manager/client/KpiManagerClient.py +++ b/src/kpi_management/kpi_manager/client/KpiManagerClient.py @@ -19,8 +19,8 @@ from common.Settings import get_service_host, get_service_port_grpc from common.proto.context_pb2 import Empty from common.tools.grpc.Tools import grpc_message_to_json_string from common.tools.client.RetryDecorator import retry, delay_exponential -from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceStub -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList +from common.proto.kpi_management_pb2_grpc import KpiManagerServiceStub +from common.proto.kpi_management_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList LOGGER = logging.getLogger(__name__) MAX_RETRIES = 10 diff --git a/src/kpi_manager/service/__init__.py b/src/kpi_management/kpi_manager/client/__init__.py similarity index 100% rename from src/kpi_manager/service/__init__.py rename to src/kpi_management/kpi_manager/client/__init__.py diff --git a/src/kpi_manager/service/database/__init__.py b/src/kpi_management/kpi_manager/database/__init__.py similarity index 100% rename from src/kpi_manager/service/database/__init__.py rename to src/kpi_management/kpi_manager/database/__init__.py diff --git a/src/kpi_manager/service/database/KpiEngine.py b/src/kpi_management/kpi_manager/database/service/KpiEngine.py similarity index 100% rename from src/kpi_manager/service/database/KpiEngine.py rename to src/kpi_management/kpi_manager/database/service/KpiEngine.py diff --git a/src/kpi_manager/service/database/KpiModel.py b/src/kpi_management/kpi_manager/database/service/KpiModel.py similarity index 56% rename from src/kpi_manager/service/database/KpiModel.py rename to src/kpi_management/kpi_manager/database/service/KpiModel.py index 5bfc5525b464f671abfc236ffea6e7a7c63d84e9..846f738f94cad77d0449c3abc0dc4554902b3aca 100644 --- a/src/kpi_manager/service/database/KpiModel.py +++ b/src/kpi_management/kpi_manager/database/service/KpiModel.py @@ -31,14 +31,14 @@ class Kpi(Base): __tablename__ = 'kpi' kpi_id = Column(UUID(as_uuid=False), primary_key=True) - kpi_description = Column(Text, unique=True) - kpi_sample_type = Column(Integer) - device_id = Column(String) - endpoint_id = Column(String) - service_id = Column(String) - slice_id = Column(String) - connection_id = Column(String) - link_id = Column(String) + kpi_description = Column(Text, nullable=False) + kpi_sample_type = Column(Integer, nullable=False) + device_id = Column(String, nullable=False) + endpoint_id = Column(String, nullable=False) + service_id = Column(String, nullable=False) + slice_id = Column(String, nullable=False) + connection_id = Column(String, nullable=False) + link_id = Column(String, nullable=False) # helps in logging the information def __repr__(self): @@ -47,3 +47,22 @@ class Kpi(Base): f"endpoint_id='{self.endpoint_id}', service_id='{self.service_id}', " f"slice_id='{self.slice_id}', connection_id='{self.connection_id}', " f"link_id='{self.link_id}')>") + + @classmethod + def create_row_from_kpiDescriptor(cls, request): + """ + Create an instance of Kpi from a request object. + Args: request: The request object containing the data. + Returns: An instance of Kpi initialized with data from the request. + """ + return cls( + kpi_id=request.kpi_id.kpi_id.uuid, + kpi_description=request.kpi_description, + kpi_sample_type=request.kpi_sample_type, + device_id=request.device_id.device_uuid.uuid, + endpoint_id=request.endpoint_id.endpoint_uuid.uuid, + service_id=request.service_id.service_uuid.uuid, + slice_id=request.slice_id.slice_uuid.uuid, + connection_id=request.connection_id.connection_uuid.uuid, + link_id=request.link_id.link_uuid.uuid + ) \ No newline at end of file diff --git a/src/kpi_manager/service/database/Kpi_DB.py b/src/kpi_management/kpi_manager/database/service/Kpi_DB.py similarity index 96% rename from src/kpi_manager/service/database/Kpi_DB.py rename to src/kpi_management/kpi_manager/database/service/Kpi_DB.py index eafa38aad48bac663f2af8651bd1e99b191265a7..847e4b70a2adb2fa046d6bf16adcf6fc0d9f6168 100644 --- a/src/kpi_manager/service/database/Kpi_DB.py +++ b/src/kpi_management/kpi_manager/database/service/Kpi_DB.py @@ -17,8 +17,8 @@ import sqlalchemy import sqlalchemy_utils from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base -from kpi_manager.service.database.KpiEngine import KpiEngine -from kpi_manager.service.database.KpiModel import Kpi +from kpi_management.kpi_manager.database.service.KpiEngine import KpiEngine +from kpi_management.kpi_manager.database.service.KpiModel import Kpi LOGGER = logging.getLogger(__name__) DB_NAME = "kpi" @@ -31,7 +31,7 @@ class Kpi_DB: return False self.db_name = DB_NAME # self.drop_database(self.db_engine) # added to test - # self.create_database(self.db_engine) # to add database + # self.create_database(self.db_engine) # to add database self.Session = sessionmaker(bind=self.db_engine) @staticmethod diff --git a/src/kpi_manager/tests/__init__.py b/src/kpi_management/kpi_manager/database/service/__init__.py similarity index 100% rename from src/kpi_manager/tests/__init__.py rename to src/kpi_management/kpi_manager/database/service/__init__.py diff --git a/src/kpi_manager/service/database/KpiDBtests.py b/src/kpi_management/kpi_manager/database/tests/KpiDBtests.py similarity index 83% rename from src/kpi_manager/service/database/KpiDBtests.py rename to src/kpi_management/kpi_manager/database/tests/KpiDBtests.py index 022a7633d7c7bf50f3dcd8e9a2fa3ec2970fd4db..24313e138b53ec8238719863049c0077a4ac551c 100644 --- a/src/kpi_manager/service/database/KpiDBtests.py +++ b/src/kpi_management/kpi_manager/database/tests/KpiDBtests.py @@ -14,15 +14,10 @@ import logging -from kpi_manager.service.database.Kpi_DB import Kpi_DB +from kpi_management.kpi_manager.database.service.Kpi_DB import Kpi_DB LOGGER = logging.getLogger(__name__) - -def test_create_db_object(): - LOGGER.info('>>> test_create_db_object : START<<< ') - kpiDBobj = Kpi_DB() - def test_verify_Tables(): LOGGER.info('>>> test_verify_Tables : START <<< ') kpiDBobj = Kpi_DB() diff --git a/src/kpi_manager/service/KpiManagerService.py b/src/kpi_management/kpi_manager/service/KpiManagerService.py similarity index 78% rename from src/kpi_manager/service/KpiManagerService.py rename to src/kpi_management/kpi_manager/service/KpiManagerService.py index dbbcec2cf0e017b5797348578b3537da1420ecbc..d4a8a8104cc0117f42670917b9ef551e16f9cbb1 100755 --- a/src/kpi_manager/service/KpiManagerService.py +++ b/src/kpi_management/kpi_manager/service/KpiManagerService.py @@ -14,11 +14,9 @@ from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc -# from common.proto.monitoring_pb2_grpc import add_MonitoringServiceServicer_to_server -from common.proto.kpi_manager_pb2_grpc import add_KpiManagerServiceServicer_to_server +from common.proto.kpi_management_pb2_grpc import add_KpiManagerServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService -from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl -# from monitoring.service.MonitoringServiceServicerImpl import MonitoringServiceServicerImpl +from kpi_management.kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl from monitoring.service.NameMapping import NameMapping class KpiManagerService(GenericGrpcService): diff --git a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py similarity index 84% rename from src/kpi_manager/service/KpiManagerServiceServicerImpl.py rename to src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py index 4b2e9fc3fe89d5011c16cc43fea026e5a23d6b1a..3d96c98dde9599d93db113a7543896e70e2fcb8f 100644 --- a/src/kpi_manager/service/KpiManagerServiceServicerImpl.py +++ b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py @@ -17,13 +17,13 @@ import logging, grpc import sqlalchemy, sqlalchemy_utils from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.proto.context_pb2 import Empty -from common.proto.kpi_manager_pb2_grpc import KpiManagerServiceServicer -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList +from common.proto.kpi_management_pb2_grpc import KpiManagerServiceServicer +from common.proto.kpi_management_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from monitoring.service.NameMapping import NameMapping # from monitoring.service import ManagementDBTools -from kpi_manager.service.database.Kpi_DB import Kpi_DB -from kpi_manager.service.database.KpiModel import Kpi as KpiModel +from kpi_management.kpi_manager.database.service.Kpi_DB import Kpi_DB +from kpi_management.kpi_manager.database.service.KpiModel import Kpi as KpiModel # from telemetry.database.TelemetryModel import Kpi as KpiModel from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\ ConnectionId, EndPointId @@ -44,16 +44,17 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer): response = KpiId() LOGGER.info("Received gRPC message object: {:}".format(request)) try: - kpi_to_insert = KpiModel() - kpi_to_insert.kpi_id = request.kpi_id.kpi_id.uuid - kpi_to_insert.kpi_description = request.kpi_description - kpi_to_insert.kpi_sample_type = request.kpi_sample_type - kpi_to_insert.device_id = request.device_id.device_uuid.uuid - kpi_to_insert.endpoint_id = request.endpoint_id.endpoint_uuid.uuid - kpi_to_insert.service_id = request.service_id.service_uuid.uuid - kpi_to_insert.slice_id = request.slice_id.slice_uuid.uuid - kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid - kpi_to_insert.link_id = request.link_id.link_uuid.uuid + # kpi_to_insert = KpiModel() + # kpi_to_insert.kpi_id = request.kpi_id.kpi_id.uuid + # kpi_to_insert.kpi_description = request.kpi_description + # kpi_to_insert.kpi_sample_type = request.kpi_sample_type + # kpi_to_insert.device_id = request.device_id.device_uuid.uuid + # kpi_to_insert.endpoint_id = request.endpoint_id.endpoint_uuid.uuid + # kpi_to_insert.service_id = request.service_id.service_uuid.uuid + # kpi_to_insert.slice_id = request.slice_id.slice_uuid.uuid + # kpi_to_insert.connection_id = request.connection_id.connection_uuid.uuid + # kpi_to_insert.link_id = request.link_id.link_uuid.uuid + kpi_to_insert = KpiModel.create_row_from_kpiDescriptor(request) if(self.Kpi_DBobj.add_row_to_db(kpi_to_insert)): response.kpi_id.uuid = request.kpi_id.kpi_id.uuid # LOGGER.info("Added Row: {:}".format(response)) diff --git a/src/kpi_management/kpi_manager/service/__init__.py b/src/kpi_management/kpi_manager/service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_manager/service/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/tests/test_kpi_manager.py b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py similarity index 83% rename from src/kpi_manager/tests/test_kpi_manager.py rename to src/kpi_management/kpi_manager/tests/test_kpi_manager.py index 680847005586a57cab5f758f42109f8b45943f1a..ca5f6af6f7a8d85679a0e6912590b3caa0774be5 100755 --- a/src/kpi_manager/tests/test_kpi_manager.py +++ b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py @@ -23,17 +23,17 @@ from typing import Union from common.proto.context_pb2 import ConfigActionEnum, Context, ContextId, DeviceOperationalStatusEnum, EventTypeEnum, DeviceEvent, Device, Empty, Topology, TopologyId from common.Constants import ServiceNameEnum -from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, ServiceNameEnum +# from common.Constants import DEFAULT_CONTEXT_NAME, DEFAULT_TOPOLOGY_NAME, ServiceNameEnum from common.Settings import ( ENVVAR_SUFIX_SERVICE_HOST, ENVVAR_SUFIX_SERVICE_PORT_GRPC, get_env_var_name, get_service_port_grpc) from common.tests.MockServicerImpl_Context import MockServicerImpl_Context from common.proto.context_pb2_grpc import add_ContextServiceServicer_to_server -from common.proto.kpi_sample_types_pb2 import KpiSampleType -from common.tools.object_factory.Context import json_context, json_context_id -from common.tools.object_factory.Topology import json_topology, json_topology_id +# from common.proto.kpi_sample_types_pb2 import KpiSampleType +# from common.tools.object_factory.Context import json_context, json_context_id +# from common.tools.object_factory.Topology import json_topology, json_topology_id # from common.proto.monitoring_pb2 import KpiId, KpiDescriptor, SubsDescriptor, SubsList, AlarmID, \ # AlarmDescriptor, AlarmList, KpiDescriptorList, SubsResponse, AlarmResponse, RawKpiTable #, Kpi, KpiList -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList +from common.proto.kpi_management_pb2 import KpiId, KpiDescriptor, KpiDescriptorFilter, KpiDescriptorList from common.tools.service.GenericGrpcService import GenericGrpcService from context.client.ContextClient import ContextClient @@ -43,17 +43,16 @@ from device.service.driver_api.DriverInstanceCache import DriverInstanceCache from device.service.DeviceService import DeviceService from device.client.DeviceClient import DeviceClient -from kpi_manager.tests.test_messages import create_kpi_descriptor_request, create_kpi_id_request, \ - create_kpi_filter_request_a, create_kpi_descriptor_request_a +from kpi_management.kpi_manager.tests.test_messages import create_kpi_descriptor_request # from monitoring.service.MonitoringService import MonitoringService -from kpi_manager.service.KpiManagerService import KpiManagerService +from kpi_management.kpi_manager.service.KpiManagerService import KpiManagerService # from monitoring.client.MonitoringClient import MonitoringClient -from kpi_manager.client.KpiManagerClient import KpiManagerClient +from kpi_management.kpi_manager.client.KpiManagerClient import KpiManagerClient -from kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl +from kpi_management.kpi_manager.service.KpiManagerServiceServicerImpl import KpiManagerServiceServicerImpl -from monitoring.service.ManagementDBTools import ManagementDB -from monitoring.service.MetricsDBTools import MetricsDB +# from monitoring.service.ManagementDBTools import ManagementDB +# from monitoring.service.MetricsDBTools import MetricsDB from monitoring.service.NameMapping import NameMapping os.environ['DEVICE_EMULATED_ONLY'] = 'TRUE' @@ -210,17 +209,36 @@ def kpi_manager_client(kpi_manager_service : KpiManagerService): # pylint: disab # Tests Implementation of Kpi Manager ########################### -# ---------- 2nd Iteration Tests ----------------- +# ---------- 3rd Iteration Tests ---------------- def test_SetKpiDescriptor(kpi_manager_client): LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") - with open("kpi_manager/tests/KPI_configs.json", 'r') as file: - data = json.load(file) - _descriptors = data.get('KPIs', []) - for _descritor_name in _descriptors: - response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(_descritor_name)) - LOGGER.info("Response gRPC message object: {:}".format(response)) + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + LOGGER.info("Response gRPC message object: {:}".format(response)) assert isinstance(response, KpiId) +def test_DeleteKpiDescriptor(kpi_manager_client): + LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ") + # adding KPI + response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request()) + # deleting KPI + del_response = kpi_manager_client.DeleteKpiDescriptor(response) + # verifing KPI + kpi_manager_client.GetKpiDescriptor(response) + LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response)) + assert isinstance(del_response, Empty) + + +# ---------- 2nd Iteration Tests ----------------- +# def test_SetKpiDescriptor(kpi_manager_client): +# LOGGER.info(" >>> test_SetKpiDescriptor: START <<< ") +# with open("kpi_manager/tests/KPI_configs.json", 'r') as file: +# data = json.load(file) +# _descriptors = data.get('KPIs', []) +# for _descritor_name in _descriptors: +# response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request_a(_descritor_name)) +# LOGGER.info("Response gRPC message object: {:}".format(response)) +# assert isinstance(response, KpiId) + # def test_GetKpiDescriptor(kpi_manager_client): # LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ") # response = kpi_manager_client.GetKpiDescriptor(create_kpi_id_request()) diff --git a/src/kpi_management/kpi_manager/tests/test_messages.py b/src/kpi_management/kpi_manager/tests/test_messages.py new file mode 100644 index 0000000000000000000000000000000000000000..7c2933b7a874e5c501358ed8808ed9da95f41dcb --- /dev/null +++ b/src/kpi_management/kpi_manager/tests/test_messages.py @@ -0,0 +1,30 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + +import uuid +from common.proto import kpi_management_pb2 +from common.proto.kpi_sample_types_pb2 import KpiSampleType + +def create_kpi_descriptor_request(descriptor_name: str = "Test_name"): + _create_kpi_request = kpi_management_pb2.KpiDescriptor() + _create_kpi_request.kpi_id.kpi_id.uuid = str(uuid.uuid4()) + _create_kpi_request.kpi_description = descriptor_name + _create_kpi_request.kpi_sample_type = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED + _create_kpi_request.device_id.device_uuid.uuid = 'DEV1' # pylint: disable=maybe-no-member + _create_kpi_request.service_id.service_uuid.uuid = 'SERV1' # pylint: disable=maybe-no-member + _create_kpi_request.slice_id.slice_uuid.uuid = 'SLC1' # pylint: disable=maybe-no-member + _create_kpi_request.endpoint_id.endpoint_uuid.uuid = 'END1' # pylint: disable=maybe-no-member + _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1' # pylint: disable=maybe-no-member + _create_kpi_request.link_id.link_uuid.uuid = 'LNK1' # pylint: disable=maybe-no-member + return _create_kpi_request \ No newline at end of file diff --git a/src/kpi_management/kpi_value_api/__init__.py b/src/kpi_management/kpi_value_api/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_value_api/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_management/kpi_value_api/client/__init__.py b/src/kpi_management/kpi_value_api/client/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_value_api/client/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_management/kpi_value_api/service/__init__.py b/src/kpi_management/kpi_value_api/service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_value_api/service/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_management/kpi_value_writer/__init__.py b/src/kpi_management/kpi_value_writer/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_value_writer/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/service/KpiValueComposer.py b/src/kpi_management/kpi_value_writer/service/KpiValueComposer.py similarity index 97% rename from src/kpi_manager/service/KpiValueComposer.py rename to src/kpi_management/kpi_value_writer/service/KpiValueComposer.py index bb2b6ebf3494130bf86d4f5d415c643c35fb20e5..61e55812108023524c2e6fd60fc8a2b4c4968115 100644 --- a/src/kpi_manager/service/KpiValueComposer.py +++ b/src/kpi_management/kpi_value_writer/service/KpiValueComposer.py @@ -20,8 +20,8 @@ import threading from confluent_kafka import KafkaError from confluent_kafka import Producer as KafkaProducer from confluent_kafka import Consumer as KafkaConsumer -from kpi_manager.service.database.Kpi_DB import Kpi_DB -from kpi_manager.service.database.KpiModel import Kpi as KpiModel +from kpi_management.service.database.Kpi_DB import Kpi_DB +from kpi_management.service.database.KpiModel import Kpi as KpiModel LOGGER = logging.getLogger(__name__) # KAFKA_SERVER_IP = '10.152.183.175:30092' diff --git a/src/kpi_manager/service/KpiWriter.py b/src/kpi_management/kpi_value_writer/service/KpiWriter.py similarity index 100% rename from src/kpi_manager/service/KpiWriter.py rename to src/kpi_management/kpi_value_writer/service/KpiWriter.py diff --git a/src/kpi_management/kpi_value_writer/service/__init__.py b/src/kpi_management/kpi_value_writer/service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/kpi_value_writer/service/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/requirements.in b/src/kpi_management/requirements.in similarity index 100% rename from src/kpi_manager/requirements.in rename to src/kpi_management/requirements.in diff --git a/src/kpi_management/service/__init__.py b/src/kpi_management/service/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/service/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/service/__main__.py b/src/kpi_management/service/__main__.py similarity index 100% rename from src/kpi_manager/service/__main__.py rename to src/kpi_management/service/__main__.py diff --git a/src/kpi_management/service/database/__init__.py b/src/kpi_management/service/database/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/service/database/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/service/database/__main__.py b/src/kpi_management/service/database/__main__.py similarity index 100% rename from src/kpi_manager/service/database/__main__.py rename to src/kpi_management/service/database/__main__.py diff --git a/src/kpi_manager/tests/KPI_configs.json b/src/kpi_management/tests/KPI_configs.json similarity index 100% rename from src/kpi_manager/tests/KPI_configs.json rename to src/kpi_management/tests/KPI_configs.json diff --git a/src/kpi_management/tests/__init__.py b/src/kpi_management/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..1549d9811aa5d1c193a44ad45d0d7773236c0612 --- /dev/null +++ b/src/kpi_management/tests/__init__.py @@ -0,0 +1,14 @@ +# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) +# +# 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. + diff --git a/src/kpi_manager/tests/test_kpi_composer.py b/src/kpi_management/tests/test_kpi_composer.py similarity index 100% rename from src/kpi_manager/tests/test_kpi_composer.py rename to src/kpi_management/tests/test_kpi_composer.py diff --git a/src/kpi_manager/tests/test_kpi_writer.py b/src/kpi_management/tests/test_kpi_writer.py similarity index 100% rename from src/kpi_manager/tests/test_kpi_writer.py rename to src/kpi_management/tests/test_kpi_writer.py diff --git a/src/kpi_manager/tests/test_messages.py b/src/kpi_management/tests/test_messages.py similarity index 100% rename from src/kpi_manager/tests/test_messages.py rename to src/kpi_management/tests/test_messages.py diff --git a/src/monitoring/client/MonitoringClient.py b/src/monitoring/client/MonitoringClient.py index 493e96ca8e866ec1cf31d7d91e8cdef4afb99fbe..0486b8083a797327ab39b013667cec4b51f80cf6 100644 --- a/src/monitoring/client/MonitoringClient.py +++ b/src/monitoring/client/MonitoringClient.py @@ -20,7 +20,7 @@ from common.Settings import get_service_host, get_service_port_grpc from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string from common.proto.context_pb2 import Empty -from common.proto.kpi_manager_pb2 import KpiId, KpiDescriptor, KpiDescriptorList +from common.proto.kpi_management_pb2 import KpiId, KpiDescriptor, KpiDescriptorList from common.proto.monitoring_pb2 import Kpi, MonitorKpiRequest, \ KpiQuery, KpiList, SubsDescriptor, SubscriptionID, SubsList, \ SubsResponse, AlarmDescriptor, AlarmID, AlarmList, AlarmResponse, AlarmSubscription, RawKpiTable