diff --git a/proto/openconfig_device.proto b/proto/optical_device.proto similarity index 89% rename from proto/openconfig_device.proto rename to proto/optical_device.proto index 7ecb591f7d1fb4e3a29e7a35cf61c7af19a09b0d..81147ee97af472615cbc1139bb2fda13ef6b0ff2 100644 --- a/proto/openconfig_device.proto +++ b/proto/optical_device.proto @@ -13,7 +13,7 @@ // limitations under the License. syntax = "proto3"; -package openconfig_device; +package optical_device; import "context.proto"; @@ -21,4 +21,6 @@ service OpenConfigService { rpc AddOpenConfigDevice (context.OpticalConfig) returns (context.OpticalConfigId) {} rpc ConfigureOpticalDevice(context.OpticalConfig) returns (context.Empty ) {} rpc DisableOpticalDevice(context.OpticalConfig) returns (context.Empty ) {} + rpc GetDeviceConfiguration(context.OpticalConfigList) returns (context.Empty) {} + } diff --git a/src/device/client/DeviceClient.py b/src/device/client/DeviceClient.py index 56c25e5673c6bc0dea7f74b80c2d15026bdfdb4b..8a0f16210c41e9ea000ca7ec4162a432dc897f0f 100644 --- a/src/device/client/DeviceClient.py +++ b/src/device/client/DeviceClient.py @@ -15,12 +15,12 @@ import grpc, logging from common.Constants import ServiceNameEnum from common.Settings import get_service_host, get_service_port_grpc -from common.proto.context_pb2 import Device, DeviceConfig, DeviceId, Empty,OpticalConfig,OpticalConfigId +from common.proto.context_pb2 import Device, DeviceConfig, DeviceId, Empty,OpticalConfig,OpticalConfigId ,OpticalConfigList from common.proto.device_pb2 import MonitoringSettings from common.proto.device_pb2_grpc import DeviceServiceStub from common.tools.client.RetryDecorator import retry, delay_exponential from common.tools.grpc.Tools import grpc_message_to_json_string -from common.proto.openconfig_device_pb2_grpc import OpenConfigServiceStub +from common.proto.optical_device_pb2_grpc import OpenConfigServiceStub LOGGER = logging.getLogger(__name__) MAX_RETRIES = 15 DELAY_FUNCTION = delay_exponential(initial=0.01, increment=2.0, maximum=5.0) @@ -89,8 +89,16 @@ class DeviceClient: LOGGER.debug('ConfigureOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response + def GetDeviceConfiguration(self, request : OpticalConfigList) -> Empty: + LOGGER.debug('ConfigureOpticalDevice request: {:s}'.format(grpc_message_to_json_string(request))) + response = self.openconfig_stub.GetDeviceConfiguration(request) + LOGGER.debug('ConfigureOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) + return response + def DisableOpticalDevice(self, request : OpticalConfig) -> Empty: LOGGER.debug('DisableOpticalDevice request: {:s}'.format(grpc_message_to_json_string(request))) response = self.openconfig_stub.DisableOpticalDevice(request) LOGGER.debug('DisableOpticalDevice result: {:s}'.format(grpc_message_to_json_string(response))) return response + + diff --git a/src/device/service/DeviceService.py b/src/device/service/DeviceService.py index 0e1ce79f955607cceed2bb791e44ae547b5772f5..40508ccabed5a272d4f01a88de607fdfa91c31c2 100644 --- a/src/device/service/DeviceService.py +++ b/src/device/service/DeviceService.py @@ -16,7 +16,7 @@ import os from common.Constants import ServiceNameEnum from common.Settings import get_service_port_grpc from common.proto.device_pb2_grpc import add_DeviceServiceServicer_to_server -from common.proto.openconfig_device_pb2_grpc import add_OpenConfigServiceServicer_to_server +from common.proto.optical_device_pb2_grpc import add_OpenConfigServiceServicer_to_server from common.tools.service.GenericGrpcService import GenericGrpcService from device.Config import LOAD_ALL_DEVICE_DRIVERS from .driver_api.DriverInstanceCache import DriverInstanceCache diff --git a/src/device/service/OpenConfigServicer.py b/src/device/service/OpenConfigServicer.py index fa634eed85e0200885dc40028fc5dd51afdc6df2..affdf304a48088c74aae32f5f2dd2ffa2eb51076 100644 --- a/src/device/service/OpenConfigServicer.py +++ b/src/device/service/OpenConfigServicer.py @@ -16,7 +16,7 @@ import grpc, logging, json from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_method from common.method_wrappers.ServiceExceptions import NotFoundException from common.proto.context_pb2 import ( - Device, DeviceId, DeviceOperationalStatusEnum, Empty, OpticalConfig, OpticalConfig + Device, DeviceId, DeviceOperationalStatusEnum, Empty, OpticalConfig, OpticalConfig,OpticalConfigList ) from common.proto.device_pb2_grpc import DeviceServiceServicer from common.tools.context_queries.Device import get_device @@ -105,6 +105,42 @@ class OpenConfigServicer(DeviceServiceServicer): return Empty() + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) + def GetDeviceConfiguration (self, request : OpticalConfigList, context : grpc.ServicerContext) -> Empty: + + for configs in request.opticalconfigs: + + device_uuid = configs.device_id.device_uuid.uuid + + LOGGER.info(f" Get DeviceConfigure {device_uuid}") + try: + context_client = ContextClient() + device = get_device( + context_client, device_uuid, rw_copy=True, include_endpoints=True, include_components=False, + include_config_rules=False) + + if device is None: + raise NotFoundException('Device', device_uuid, extra_details='loading in ConfigureDevice') + + driver : _Driver = get_driver(self.driver_instance_cache, device) + + results = driver.GetConfig(resource_keys=[]) + for resource_data in results : + resource_key, resource_value = resource_data + + if resource_key.startswith('/opticalconfigs/opticalconfig/'): + if 'opticalconfig' in resource_value: + context_client.SetOpticalConfig(resource_value['opticalconfig']) + + #TODO: add a control with the NETCONF get + #driver.GetConfig(resource_keys=filter_fields) + except Exception as e: + LOGGER.info("error in configuring %s",e) + return Empty() + + + + @safe_and_metered_rpc_method(METRICS_POOL, LOGGER) def DisableOpticalDevice (self, request : OpticalConfig, context : grpc.ServicerContext) -> Empty: diff --git a/src/webui/service/base_optical/route.py b/src/webui/service/base_optical/route.py index e3f37de51d7f17633867db9ab3c0128da39ffdf1..a07126819712cda6e59ea03b711d02d43fe6000a 100644 --- a/src/webui/service/base_optical/route.py +++ b/src/webui/service/base_optical/route.py @@ -14,16 +14,22 @@ from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for -from common.proto.context_pb2 import Empty, OpticalLink, LinkId, OpticalLinkList +from common.proto.context_pb2 import Empty, OpticalLink, LinkId, OpticalLinkList ,OpticalConfigList from common.tools.context_queries.EndPoint import get_endpoint_names from common.tools.context_queries.Link import get_link from common.tools.context_queries.Topology import get_topology from context.client.ContextClient import ContextClient - +from device.client.DeviceClient import DeviceClient base_optical = Blueprint('base_optical', __name__, url_prefix='/base_optical') - +device_client = DeviceClient() +context_client = ContextClient() @base_optical.get('/') def home(): - + context_client.connect() + opticalConfig_list:OpticalConfigList = context_client.GetOpticalConfig(Empty()) + context_client.close() + device_client.connect() + device_client.GetDeviceConfiguration(opticalConfig_list) + device_client.close() return render_template("base_optical/home.html") \ No newline at end of file