Loading proto/openconfig_device.proto→proto/optical_device.proto +3 −1 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ // limitations under the License. syntax = "proto3"; package openconfig_device; package optical_device; import "context.proto"; Loading @@ -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) {} } src/device/client/DeviceClient.py +10 −2 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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 src/device/service/DeviceService.py +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading src/device/service/OpenConfigServicer.py +37 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading src/webui/service/base_optical/route.py +10 −4 Original line number Diff line number Diff line Loading @@ -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 Loading
proto/openconfig_device.proto→proto/optical_device.proto +3 −1 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ // limitations under the License. syntax = "proto3"; package openconfig_device; package optical_device; import "context.proto"; Loading @@ -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) {} }
src/device/client/DeviceClient.py +10 −2 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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
src/device/service/DeviceService.py +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
src/device/service/OpenConfigServicer.py +37 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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: Loading
src/webui/service/base_optical/route.py +10 −4 Original line number Diff line number Diff line Loading @@ -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